版本概述

Nginx 1.0.x - 1.2.x
已弃用
这些是较旧的 Nginx 版本,仅支持基础的 SSL/TLS 功能。不支持 HTTP/2、OCSP Stapling 等现代特性。
⚠️ 注意: 这些版本已停止维护,存在安全风险,强烈建议升级到最新稳定版本。
Nginx 1.4.x - 1.8.x
稳定版本
这些版本引入了 OCSP Stapling 支持(1.3.7+),但还不支持 HTTP/2。适合不需要 HTTP/2 的场景。
Nginx 1.9.5+
HTTP/2 支持
从 1.9.5 版本开始支持 HTTP/2 协议,这是现代 Web 服务器的重要特性,可以显著提升性能。
Nginx 1.10.x - 1.18.x
推荐版本
这些是长期支持和稳定版本,支持所有现代 SSL/TLS 特性,包括 HTTP/2、OCSP Stapling、TLS 1.3(1.13.0+)等。
✅ 推荐: 这些版本稳定可靠,适合生产环境使用。
Nginx 1.20.x - 1.24.x+
最新版本
最新稳定版本,包含最新的安全补丁和性能优化,支持所有现代 SSL/TLS 特性和最佳实践。

基础 SSL 配置

所有 Nginx 版本的基础 SSL 配置基本相同,主要区别在于支持的协议和特性:

基础配置(所有版本)

server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/fullchain.crt; ssl_certificate_key /path/to/your_domain.key; ssl_protocols TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; root /var/www/html; index index.html index.php; }
💡 提示: Nginx 始终使用合并的证书链文件(fullchain.crt),这与 Apache 不同。证书链文件应包含:域名证书 + 中间证书 + 根证书(可选)。

合并证书链

# # 合并证书链(域名证书在前,中间证书在后)cat your_domain.crt intermediate_ca.crt > fullchain.crt # # 验证证书链openssl x509 -in fullchain.crt -text -noout

HTTP/2 支持

⚠️ 重要: HTTP/2 支持需要 Nginx 1.9.5 或更高版本。如果您的 Nginx 版本低于 1.9.5,将无法使用 HTTP/2。

Nginx 1.9.5+ 配置(支持 HTTP/2)

server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /path/to/fullchain.crt; ssl_certificate_key /path/to/your_domain.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; # # HTTP/2 时建议关闭 root /var/www/html; index index.html index.php; }

Nginx 1.4.x - 1.8.x 配置(不支持 HTTP/2)

server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/fullchain.crt; ssl_certificate_key /path/to/your_domain.key; ssl_protocols TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; root /var/www/html; index index.html index.php; }
📝 说明: 使用 HTTP/2 时,建议将 ssl_prefer_server_ciphers 设置为 off,因为 HTTP/2 协议本身会处理加密套件协商。

协议和加密套件

配置项 Nginx 1.0-1.2 Nginx 1.4-1.8 Nginx 1.9.5+ Nginx 1.13.0+
SSL 协议支持 TLSv1, TLSv1.1, TLSv1.2 TLSv1, TLSv1.1, TLSv1.2 TLSv1.2, TLSv1.3 TLSv1.2, TLSv1.3
推荐协议 TLSv1.2 TLSv1.2 TLSv1.2 TLSv1.3 TLSv1.2 TLSv1.3
HTTP/2 ❌ 不支持 ❌ 不支持 ✅ 支持 ✅ 支持
OCSP Stapling ❌ 不支持 ✅ 支持(1.3.7+) ✅ 支持 ✅ 支持
TLS 1.3 ❌ 不支持 ❌ 不支持 ❌ 不支持 ✅ 支持
ssl_prefer_server_ciphers 需要显式设置 需要显式设置 HTTP/2 时建议 off HTTP/2 时建议 off

现代配置示例(Nginx 1.13.0+)

server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /path/to/fullchain.crt; ssl_certificate_key /path/to/your_domain.key; # # 现代 TLS 协议(禁用不安全的协议) ssl_protocols TLSv1.2 TLSv1.3; # # 现代加密套件(优先使用 ECDHE 和 GCM) ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # # SSL 会话配置 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; # 1.5.9+ 支持 root /var/www/html; index index.html index.php; }

OCSP Stapling

💡 说明: OCSP Stapling 可以提升 SSL 握手性能,减少客户端验证证书的时间。需要 Nginx 1.3.7 或更高版本。

Nginx 1.3.7+ OCSP Stapling 配置

server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /path/to/fullchain.crt; ssl_certificate_key /path/to/your_domain.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; # # OCSP Stapling 配置 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/root_ca.crt; # # 根证书或完整证书链 resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; root /var/www/html; index index.html index.php; }
⚠️ 注意:
  • ssl_trusted_certificate 应包含根证书或完整的证书链
  • 需要配置 DNS 解析器(resolver)以获取 OCSP 响应
  • 如果 OCSP 服务器不可达,可能会影响 SSL 握手

性能优化

SSL 会话缓存

# # 在 http 块中配置(全局)http { # # SSL 会话缓存(所有 server 块共享) ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; # # 1.5.9+ 支持,禁用会话票据以提高安全性}

SSL 缓冲区大小

http { # # SSL 缓冲区优化 ssl_buffer_size 8k; # # 1.5.9+ 支持,减少 SSL 记录数量}

完整性能优化配置

http { # # SSL 会话配置 ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; # # SSL 缓冲区优化 ssl_buffer_size 8k; server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /path/to/fullchain.crt; ssl_certificate_key /path/to/your_domain.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; # # OCSP Stapling 配置 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/root_ca.crt; root /var/www/html; } }

安全头配置

添加安全 HTTP 头可以提升网站的安全性,这些配置在所有 Nginx 版本中都可用:

server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /path/to/fullchain.crt; ssl_certificate_key /path/to/your_domain.key; # # SSL 配置... ssl_protocols TLSv1.2 TLSv1.3; # # 安全 HTTP 头 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; # # 移除服务器版本信息(可选) server_tokens off; root /var/www/html; index index.html index.php; }
📝 说明: 使用 always 参数确保即使返回错误状态码(如 404、500)也会添加安全头。

HTTP 重定向

所有 Nginx 版本都支持 HTTP 到 HTTPS 的重定向,配置方式相同:

方法一:使用 return 指令(推荐)

server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$host$request_uri; }

方法二:使用 rewrite 指令

server { listen 80; server_name yourdomain.com www.yourdomain.com; rewrite ^(.*)$ https://$host$1 permanent; }
💡 提示: 推荐使用 return 301 方式,因为它更高效,不需要正则表达式匹配。

最佳实践

1. 证书文件组织

  • 将证书文件存放在安全目录,如 /etc/nginx/ssl/
  • 设置正确的文件权限:证书文件 644,私钥文件 600
  • 使用完整证书链(fullchain.crt)而不是单独的文件
  • 定期备份证书和私钥文件

2. 完整推荐配置(Nginx 1.13.0+)

http { # # SSL 全局配置 ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_buffer_size 8k; # # HTTP 到 HTTPS 重定向 server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$host$request_uri; } # # HTTPS 服务器配置 server { listen 443 ssl http2; server_name yourdomain.com www.yourdomain.com; # # 证书配置 ssl_certificate /etc/nginx/ssl/fullchain.crt; ssl_certificate_key /etc/nginx/ssl/your_domain.key; # # 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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305; ssl_prefer_server_ciphers off; # # OCSP Stapling 配置 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/root_ca.crt; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # # 安全 HTTP 头 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; # # 隐藏服务器版本 server_tokens off; root /var/www/html; index index.html index.php; } }

3. 版本检查

# # 查看 Nginx 版本nginx -v # # 查看编译时包含的模块nginx -V # # 测试配置文件语法nginx -t # # 重新加载配置(不中断服务)nginx -s reload

常见问题

1. 检查 Nginx 版本

# # 查看版本nginx -v # # 查看详细信息和编译选项nginx -V

2. 测试配置语法

# # 测试配置文件语法nginx -t # # 如果配置正确,会显示:# # nginx: the configuration file /etc/nginx/nginx.conf syntax is ok# # nginx: configuration file /etc/nginx/nginx.conf test is successful

3. 常见错误及解决方案

错误: nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module
解决: Nginx 未编译 SSL 模块,需要重新编译 Nginx 并启用 --with-http_ssl_module 选项
错误: nginx: [emerg] the "http2" parameter requires ngx_http_v2_module
解决: Nginx 版本低于 1.9.5 或未编译 HTTP/2 模块,需要升级到 1.9.5+ 或重新编译时启用 --with-http_v2_module
错误: SSL_CTX_use_certificate_file() failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line)
解决: 证书文件格式错误或路径不正确,检查证书文件是否存在且格式正确
错误: SSL_CTX_use_PrivateKey_file() failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line)
解决: 私钥文件格式错误或路径不正确,检查私钥文件是否存在且格式正确

4. 验证 SSL 配置

# # 使用在线工具验证https://www.ssllabs.com/ssltest/ https://myssl.com/ # # 使用命令行工具openssl s_client -connect yourdomain.com:443 -servername yourdomain.com # # 检查 HTTP/2 支持curl -I --http2 https://yourdomain.com

5. 查看错误日志

# # 查看 Nginx 错误日志tail -f /var/log/nginx/error.log # # 查看访问日志tail -f /var/log/nginx/access.log