7.5.3 Nginx HTTPS配置与性能优化
在 Nginx 中启用 HTTPS 需要完成证书部署、SSL 参数配置与性能优化,并通过命令验证与灰度上线。本节提供完整可执行示例、排错与练习。
1. 原理草图:TLS 握手与会话复用
2. 证书部署与权限(安装与准备)
- 目录与权限建议(仅 root 可读):
# 创建证书目录
mkdir -p /etc/nginx/certs
chmod 700 /etc/nginx/certs
# 放置证书与私钥
cp example.crt /etc/nginx/certs/
cp example.key /etc/nginx/certs/
chmod 600 /etc/nginx/certs/example.key
- 证书链合并(中间证书 + 服务器证书):
cat example.crt intermediate.crt > /etc/nginx/certs/fullchain.crt
预期效果:Nginx 读取私钥不报错,客户端链完整不再提示不受信任。
3. 完整 HTTPS 配置示例(含重定向与性能优化)
- 文件路径:/etc/nginx/conf.d/https.conf
# 80 -> 443 重定向
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
# HTTPS 站点
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/certs/fullchain.crt;
ssl_certificate_key /etc/nginx/certs/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 10m;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
# 传输优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
预期效果:80 端口自动跳转,TLSv1.2/1.3 协商成功,HTTP/2 启用。
4. 关键命令与解释
- 配置语法检查与重载:
nginx -t
# 预期:syntax is ok / test is successful
nginx -s reload
- TLS 版本与证书链验证:
# 验证 TLSv1.2
openssl s_client -connect example.com:443 -tls1_2 -servername example.com
# 查看证书链
openssl s_client -connect example.com:443 -showcerts -servername example.com
解释:-servername 触发 SNI;-showcerts 输出链用于检查中间证书缺失。
5. 性能优化建议
- 高并发时调整 Session Cache:
ssl_session_cache shared:SSL:100m;
- HTTP/2 已启用减少连接数,配合 gzip/brotli 与缓存策略进一步优化。
6. 常见问题与排错
- 私钥权限不足:Nginx 启动失败
处理:
bash
chmod 600 /etc/nginx/certs/example.key
chown root:root /etc/nginx/certs/example.key
- 证书链不完整:浏览器提示不受信任
处理:确认 fullchain.crt 包含中间证书。
- TLS 版本过低:现代浏览器拒绝连接
处理:确保 ssl_protocols TLSv1.2 TLSv1.3;
- OCSP Stapling 失败:检查 resolver 与链完整性
处理:确保 resolver 可达,链文件正确。
7. 练习
1. 为一个测试域名创建 fullchain.crt 并配置 HTTPS,使用 openssl s_client 验证证书链。
2. 关闭 ssl_session_tickets,用压测工具比较握手耗时差异。
3. 开启与关闭 HTTP/2,对比浏览器 Network 中连接数量变化。