插件窝 干货文章 nginx如何配置wss协议

nginx如何配置wss协议

proxy Upgrade SSL header 319    来源:    2025-04-27

Nginx 配置 WSS (WebSocket Secure) 协议指南

WSS 是 WebSocket over TLS/SSL 的安全版本,下面是如何在 Nginx 中配置 WSS 服务的详细步骤:

基本配置

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /path/to/your/cert.pem;
    ssl_certificate_key /path/to/your/private.key;

    # SSL 优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location /websocket/ {
        proxy_pass http://backend_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;

        # 可选:设置代理超时
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

关键配置说明

  1. SSL/TLS 配置:

    • 必须配置有效的 SSL 证书
    • 推荐使用 TLS 1.2 或更高版本
  2. WebSocket 特定配置:

    • proxy_http_version 1.1: 使用 HTTP/1.1 协议
    • proxy_set_header Upgrade $http_upgrade: 处理协议升级
    • proxy_set_header Connection "upgrade": 保持连接升级
  3. 超时设置:

    • WebSocket 连接通常是长连接,需要适当增加超时时间

完整示例配置

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 443 ssl http2;
    server_name ws.example.com;

    ssl_certificate /etc/letsencrypt/live/ws.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ws.example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:...';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # WebSocket 端点
    location /ws {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }

    # 其他 HTTP 流量
    location / {
        root /var/www/html;
        index index.html;
    }
}

测试配置

  1. 检查配置语法:

    nginx -t
    
  2. 重新加载 Nginx:

    systemctl reload nginx
    
  3. 测试 WSS 连接:

    • 可以使用浏览器开发者工具
    • 或使用 wscat 工具: bash wscat -c wss://yourdomain.com/websocket/

常见问题解决

  1. 502 Bad Gateway:

    • 检查后端服务是否运行
    • 检查代理地址是否正确
  2. 连接立即断开:

    • 检查 UpgradeConnection 头是否正确设置
    • 检查后端服务是否支持 WebSocket
  3. SSL 证书问题:

    • 确保证书路径正确
    • 确保证书没有过期
    • 可以使用 openssl s_client -connect yourdomain.com:443 测试证书
  4. 跨域问题:

    • 如果需要 CORS,添加相应头: nginx proxy_set_header Access-Control-Allow-Origin *; proxy_set_header Access-Control-Allow-Methods *; proxy_set_header Access-Control-Allow-Headers *;

通过以上配置,你应该能够成功在 Nginx 上部署 WSS 服务。