自己网站的nginx配置,减少重复编译nginx查找资料耗费的时间。
更新日期:2022年12月01日
需求
- 较高的压缩率,加快网页传输
- https安全性提高
最终选用了以下nginx模块
模块 | 功能 |
---|---|
ngx_http_substitutions_filter_module | 正则表达式 |
ngx_brotli | 谷歌开源压缩brotli库 |
编译
在这个目录下工作:
mkdir ~/nginx_my && cd nginx_my
各个模块
cd ~/nginx_my
git clone https://github.com/google/ngx_brotli
cd ngx_brotli
git submodule update --init
cd ~/nginx_my
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
nginx
编译
cd ~/nginx_my
# nginx
NGINX_VER=1.22.1
wget http://nginx.org/download/nginx-$NGINX_VER.tar.gz
tar xf nginx-$NGINX_VER.tar.gz
openssl取最新版
OPENSSL_VER=3.0.7
wget https://www.openssl.org/source/openssl-$OPENSSL_VER.tar.gz
tar xf openssl-$OPENSSL_VER.tar.gz
安装依赖。至于依赖什么,取决于编译nginx开启的模块。即下文的configure参数。
apt install -y \
libgeoip-dev \
libgd-dev \
libxslt1-dev \
zlib1g-dev \
libpcre3-dev
configure参数控制要编译哪些模块
# 切换到Nginx源码目录
cd ~/nginx_my/nginx-$NGINX_VER
./configure \
--with-cc-opt='-O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro' \
--conf-path=/etc/nginx/nginx.conf \
--with-debug \
--with-pcre-jit \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_auth_request_module \
--with-http_addition_module \
--with-http_dav_module \
--with-http_geoip_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module \
--with-http_v2_module \
--with-http_sub_module \
--with-http_xslt_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-threads \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
--with-openssl=../openssl-$OPENSSL_VER \
--with-openssl-opt='enable-tls1_3 enable-ec_nistp_64_gcc_128 enable-weak-ssl-ciphers' \
--add-module=../ngx_http_substitutions_filter_module \
--add-module=../ngx_brotli
以上的configure意义是
- 没有指定prefix,采用系统默认的前缀目录,如/usr/local/
- 指定配置文件路径为/etc/nginx/nginx.conf
- 开启basic_auth等模块,关闭邮件模块
- 指定好openssl源码目录,开启TLS1.3加密套件
- 添加几个额外的模块
直接编译即可
make && make install
配置
反向代理
参考这篇文章,可以非常傻瓜化的部署反代。
压缩网页
修改/etc/nginx/nginx.conf达到基本的gzip效果
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_min_length 1k;
gzip_proxied any;
gzip_disable "msie6";
gzip_http_version 1.0;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
再加上谷歌的黑科技brotli压缩
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
提升ssl安全等级
前提是网站有HTTPS部署,且对相关概念有基本了解。可以自行参考imququ大神博客,学习基本的https部署方法!
一、自定义生成密钥交换,取代nginx默认的weak exchange
这个diffie-hellman算法是用来干啥的:作用就是让访问的者浏览器和你的服务器能安全的交换密钥,具体原理就自行谷歌吧,你不能强迫数学渣渣来给你解释密码学的东西是不是?总之nginx默认采用1024位的diffie-hellman,强度太低太危险,容易被别有用心的黑客叔叔破解,自己生成一个4096位的去替换掉就好啦。
# 如果你的机器cpu性能不够强大,耗时很长,可以用 2048 位
# 我的笔记本(i5 3317u)跑4096位,跑了二十分钟。。。直接拖到VPS上面/root/
openssl dhparam -out dhparam.pem 4096
nginx.conf中的server标签中添加
ssl_dhparam /root/dhparam.pem;
二、手动指定优先TLS1.3 chacha20
推荐的加密套件设置,详见CloudFlare的仓库 https://github.com/stardock/nginxtls13
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256;
ssl_conf_command Options PrioritizeChaCha;
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
验证cipher是否生效
curl https://example.com -v
输出结果中的cipher suite可以看到TLS-CHACHA20-POLY1305-SHA256等字样
三、设置跨站response header
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection 1;
四、强制HSTS
新建一个http服务器,强制跳转到https:
server_name xxx.com
listen 80;
location / {
rewrite ^(.*)$ https://$host$1 permanent;
}
在https服务器中添加
add_header Strict-Transport-Security "max-age=31536000;" always;
有兴趣可以加入google chrome的Preload List里面,将从浏览器自动强制使用https。需要申请,审批需要几天。但是加进去preload list后很难从其中移除,需要发邮件移除。。