HTTP/2相较于HTTP/1.1在多路复用、头部压缩等方面有显著性能提升,能有效减少页面加载时间。Nginx中通过在listen指令中添加http2标志即可启用,例如:
server {
listen 443 ssl http2;
# 其他SSL配置...
}
该配置需配合SSL证书使用,是SSL优化的基础步骤。
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
这一步能平衡安全性与性能,确保数据传输的安全。
ssl_session_cache共享缓存(减少内存占用)和ssl_session_timeout设置超时时间,减少重复握手次数。例如:ssl_session_cache shared:SSL:10m; # 10MB缓存约支持4万个会话
ssl_session_timeout 10m; # 会话有效期10分钟
ssl_session_tickets off;(可选,部分场景下可能影响兼容性,但能进一步提升安全性)。OCSP Stapling通过服务器主动获取证书状态并附加到握手响应中,减少客户端验证证书的时间(避免客户端向CA服务器发起查询)。配置示例如下:
ssl_stapling on; # 启用OCSP Stapling
ssl_stapling_verify on; # 验证OCSP响应的有效性
resolver 8.8.8.8 8.8.4.4 valid=300s; # 指定DNS解析器及缓存时间
resolver_timeout 5s; # DNS解析超时时间
该配置能显著提升SSL握手效率,尤其在高并发场景下效果明显。
HSTS通过Strict-Transport-Security响应头强制浏览器仅通过HTTPS访问网站,避免SSL剥离攻击(如中间人攻击降级协议)。配置示例如下:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
max-age设置为1年(31536000秒),includeSubDomains表示包含子域名,always表示始终发送该头(即使是非HTTPS请求)。
ssl_buffer_size控制SSL记录的大小,默认16KB可能过大(尤其是对于小数据包,如API请求),增加延迟。建议调整为4KB-8KB,例如:
ssl_buffer_size 6k; # 根据实际业务调整,小数据包场景推荐4k-6k
该配置能减少数据包数量,提升传输效率。
离散对数(DH)密钥交换是SSL/TLS的重要环节,使用预生成的强DH参数(至少2048位)能防止DH密钥交换攻击(如Logjam攻击)。生成DH参数:
openssl dhparam -out /etc/nginx/dhparam.pem 2048
然后在Nginx配置中引用:
ssl_dhparam /etc/nginx/dhparam.pem;
这一步能增强密钥交换的安全性,尤其适用于高敏感场景。
Keepalive通过复用TCP连接减少握手次数,降低延迟。配置示例如下:
keepalive_timeout 120s; # 长连接超时时间(根据业务调整,如60s-120s)
keepalive_requests 100; # 单个连接最多处理的请求数
该配置能提升高并发场景下的性能,减少TCP连接建立的开销。
Let’s Encrypt提供免费、自动续期的SSL证书(有效期90天),能有效降低证书管理成本。通过Certbot工具可快速获取和配置证书:
sudo apt install certbot python3-certbot-nginx # 安装Certbot
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com # 自动配置Nginx
Certbot会自动处理证书续期,无需手动干预。
stub_status模块、Prometheus+Granafa)监控SSL握手时间、证书有效期等指标,及时发现异常。