Nginx安装及https配置优化
# HTTP/2 要求Nginx 1.9.5+, OpenSSL 1.0.2+
# TLS 1.3 要求Nginx 1.13+,OpenSSL 1.1.1+
# Brotli 要求HTTPS,并在Nginx中添加扩展支持
# ECC 双证书要求(本人测试单证书也可),Nginx 1.11+
#这里Nginx,我个人推荐 1.15+,因为1.14虽然已经能支持TLS1.3了,但是一些 TLS1.3的进阶特性还只在 1.15+中提供。
# 本次安装各软件版本如下:
Nginx: 1.16.1
OpenSSL:1.1.1g
# OpenSSL软件请自行安装,这里不做过多介绍。
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.16.1.tar.gz
# git clone https://github.com/eustas/ngx_brotli.git
# cd ngx_brotli && git submodule update --init --recursive
# 编译安装Nginx软件
# cd ../ && tar -zxf nginx-1.16.1.tar.gz
# cd nginx-1.16.1
# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-pcre --with-file-aio --with-http_realip_module --add-module=/usr/local/src/redis2-nginx-module-0.14 --with-openssl=/usr/local/openssl --with-http_dav_module --with-http_flv_module --with-openssl-opt=enable-tls1_3 --with-http_v2_module --add-module=/usr/local/src/ngx_brotli
# make && make install
备注:
--with-openssl-opt=enable-tls1_3 # 开启 TLS 1.3 支持
--with-http_v2_module # 开启 HTTP/2
--with-http_ssl_module # 开启 HTTPS 支持
--with-http_gzip_static_module # 开启 GZip 压缩
--add-module=/usr/local/src/ngx_brotli #编译入 ngx_BroTli 扩展
#配置
HTTP2:
listen 443 ssl http2;
# 在server{}下的lisen 443 ssl后添加 http2即可。而且从1.15版本开始,只要写了这一句话就不需要再写ssl on了,很多小伙伴可能用了1.15+以后衍用原配置文件会报错,就是因为这一点。
TLS 1.3:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# 如果不打算继续支持IE8,或者一些合规的要求,可以去掉TLSv1。
# 然后我们再修改对应的加密算法,加入TLS1.3引入的新算法:
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
# 如果不打算继续支持IE8,可以去掉包含3DES的Cipher Suite。
# 默认情况下Nginx因为安全原因,没有开启TLS 1.3 0-RTT,可以通过添加ssl_early_data on;指令开启0-RTT的支持。
实验性尝试:
# 众所周知,TLS1.3由于更新了很久,很多浏览器的旧版本依旧只支持 Draft 版本,如23 26 28分别在Chrome、FirFox 上有支持,反而正式版由于草案出来很久,导致TLS1.3在浏览器上兼容性不少太好。
# 可以使用 https://github.com/hakasenyang/openssl-patch/提供的OpenSSL Patch让OpenSSL 1.1.1 同时支持草案23,26,28和正式版输出,不过由于不是官方脚本,稳定性和安全性有待考量。
Brotli:
# 需要在对应配置文件中,添加下面代码即可:
brotli on;
brotli_comp_level 6;
brotli_min_length 1k;
brotli_types text/plain text/css text/xml text/javascript text/x-component application/json application/javascript application/x-javascript application/xml application/xhtml+xml application/rss+xml application/atom+xml application/x-font-ttf application/vnd.ms-fontobject image/svg+xml image/x-icon font/opentype;
提供一个完整的nginx的server{}供参考:
server {
listen 443 ssl http2; #开启http/2
server_name example.com www.example.com;
#证书部分
ssl_certificate /usr/local/ssl/www.example.com.crt; #RSA证书
ssl_certificate_key /usr/local/ssl/www.example.com.key; #RSA密钥
#TLS 握手优化
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
keepalive_timeout 75s;
keepalive_requests 100;
#TLS 版本控制
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5';
# 开启1.3 o-RTT
ssl_early_data on;
# GZip和Brotli
gzip on;
gzip_comp_level 6;
gzip_min_length 1k;
gzip_types text/plain text/css text/xml text/javascript text/x-component application/json application/javascript application/x-javascript application/xml application/xhtml+xml application/rss+xml application/atom+xml application/x-font-ttf application/vnd.ms-fontobject image/svg+xml image/x-icon font/opentype;
brotli on;
brotli_comp_level 6;
brotli_min_length 1k;
brotli_types text/plain text/css text/xml text/javascript text/x-component application/json application/javascript application/x-javascript application/xml application/xhtml+xml application/rss+xml application/atom+xml application/x-font-ttf application/vnd.ms-fontobject image/svg+xml image/x-icon font/opentype;
location / {
root html;
index index.html index.htm index.shml;
}
}
# 验证nginx配置文件是否有误:
/usr/local/nginx/sbin -t
#如果反馈的是:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# 就可以启动Nginx,然后到网站页面验证下了。
/usr/local/nginx/sbin
验证:
HTTP/2
打开浏览器的开发者工具,我们可以在Network面板中看到Protocol栏中显示h2有无来判断。
TLS 1.3
通过浏览器的开发者工具中的Security面板看到Connection栏目下是否有显示TLS 1.3
Brotli
通过浏览器的开发者工具,我们可以在Network面板中,打开具体页面的头信息,看到accept-encoding中有br字眼就行。
总结:
#通过上述手段应该可以让HTTPS访问的体验优化不少,而且会比没做HTTPS的网站访问可能更快。
#这样的模式比较适合云服务器单机或者简单集群上搭建,如果有应用SLB七层代理、WAF、CDN 这样的产品可能会让我们的这些操作都白费。我们的这几项操作都是自建的 Web 七层服务,如果有设置 SLB 七层代理、WAF、CDN 这样设置在云服务器之前就会被覆盖掉。
#由于 SLB 七层和CDN这样的产品会更加追求广泛的兼容性和稳定性并不会第一时间就用上上述的这些新特性(HTTP/2 是普遍有的),但是他们都配备了阿里云的Tengine的外部专用算法加速硬件如Intel® QuickAssist Technology(QAT) 加速器可以显著提高SSL/TLS握手阶段性能。所有HTTPS的加密解密都在SLB或CDN上完成,而不会落到ECS上,可以显著降低ECS 的负载压力,并且提升访问体验。
目前云上的网络产品中能支持四层的都是可以继续兼容我们这套设计的,例如:SLB的四层转发(TCP UDP)、DDOS高防的四层转发。
(原标题:基于 Nginx 的 HTTPS 性能优化实践)
留言评论