Nginx 配置 HTTPS 与 WSS 完整指南
一、准备工作
- 获取 SSL 证书
- 从可信机构(如 Let’s Encrypt)申请证书
- 获得以下文件:
- 域名证书:
domain.crt
- 私钥文件:
domain.key
- 中间证书链:
chain.crt
- 域名证书:
- 推荐合并证书链:
cat domain.crt chain.crt > fullchain.pem
二、HTTPS 基础配置
server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/domain.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:10m;ssl_session_timeout 1d;# 其他配置...
}
三、WSS 配置(WebSocket Secure)
location /websocket/ {proxy_pass http://backend_server;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 保持长连接proxy_read_timeout 86400s;proxy_send_timeout 86400s;# 传递必要头信息proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;
}
四、最佳实践
- 强制 HTTPS 跳转:
server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}
- OCSP 装订优化:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.crt;
- 安全增强配置:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
五、完整配置示例
http {# 共享 SSL 配置ssl_session_cache shared:le_nginx_SSL:10m;server {listen 443 ssl;server_name example.com;# 证书路径ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;# 安全协议ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;# WebSocket 配置location /wss/ {proxy_pass http://127.0.0.1:8080;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}# 静态文件服务location / {root /var/www/html;index index.html;}}# HTTP 强制跳转server {listen 80;server_name example.com;return 301 https://$server_name$request_uri;}
}
六、验证与测试
- 检查配置语法:
sudo nginx -t
- HTTPS 验证:
curl -I https://example.com
# 应返回 HTTP/2 200
- WSS 测试:
// 浏览器端测试代码
const ws = new WebSocket("wss://example.com/wss");
ws.onopen = () => console.log("Connected");
七、常见问题排查
- 证书错误:
- 确认证书路径正确
- 检查文件权限(推荐 644)
- WebSocket 连接失败:
- 验证
Upgrade
头是否正确传递 - 检查后端服务是否正常运行
- 性能优化:
# 调整缓冲区设置
proxy_buffers 8 32k;
proxy_buffer_size 64k;
- 防火墙设置:
sudo ufw allow 443/tcp
配置完成后建议使用 SSL Labs 测试:https://www.ssllabs.com/ssltest/