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 中连接数量变化。