插件窝 干货文章 Nginx反向代理WebSocket配置,实现实时通信

Nginx反向代理WebSocket配置,实现实时通信

proxy WebSocket Upgrade http 994    来源:    2025-04-16

Nginx反向代理WebSocket配置指南

WebSocket协议允许客户端与服务器之间建立全双工通信通道,非常适合实时应用。以下是使用Nginx作为WebSocket反向代理的详细配置方法。

基本配置

server {
    listen 80;
    server_name yourdomain.com;

    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 3600s;
        proxy_send_timeout 3600s;
    }
}

关键配置说明

  1. HTTP版本升级

    proxy_http_version 1.1;
    

    WebSocket需要HTTP/1.1协议支持。

  2. 协议升级头

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    

    这些头信息允许将HTTP连接升级为WebSocket连接。

  3. 超时设置

    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
    

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

完整示例配置

http {
    # 共享内存区域,用于WebSocket连接
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    server {
        listen 443 ssl;
        server_name yourdomain.com;

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

        # WebSocket路径
        location /ws/ {
            proxy_pass http://websocket_backend;
            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_read_timeout 86400s;
            proxy_send_timeout 86400s;

            # 缓冲区设置
            proxy_buffering off;
        }

        # 其他HTTP请求
        location / {
            proxy_pass http://http_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    upstream websocket_backend {
        server 127.0.0.1:8080;
        # 可以添加更多后端服务器实现负载均衡
    }

    upstream http_backend {
        server 127.0.0.1:8000;
    }
}

常见问题解决

  1. 连接断开问题

    • 检查proxy_read_timeoutproxy_send_timeout是否设置足够大
    • 确保后端服务器也有相应的长连接超时设置
  2. 502 Bad Gateway错误

    • 验证后端WebSocket服务是否正常运行
    • 检查Nginx错误日志获取更多信息
  3. WebSocket连接无法建立

    • 确保UpgradeConnection头正确设置
    • 检查是否有防火墙阻止了WebSocket端口

性能优化建议

  1. 负载均衡

    upstream websocket_backend {
       server backend1.example.com:8080;
       server backend2.example.com:8080;
       server backend3.example.com:8080;
    }
    
  2. 连接保持

    proxy_set_header Connection $connection_upgrade;
    
  3. 缓冲区优化

    proxy_buffering off;
    
  4. SSL优化(如果使用HTTPS):

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    

测试配置

配置完成后,可以使用以下工具测试WebSocket连接: - 浏览器开发者工具 - wscat命令行工具 - Postman(支持WebSocket)

通过以上配置,Nginx可以有效地作为WebSocket的反向代理,支持实时通信应用的部署。