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

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

proxy WebSocket 连接 Upgrade 247    来源:    2025-04-16

Nginx反向代理WebSocket配置指南

WebSocket是一种在单个TCP连接上进行全双工通信的协议,非常适合实时通信应用。使用Nginx作为WebSocket的反向代理可以提高系统的可靠性和扩展性。

基本配置

server {
    listen 80;
    server_name yourdomain.com;

    location /ws/ {
        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. proxy_http_version 1.1: WebSocket需要HTTP/1.1协议支持
  2. UpgradeConnection: 这两个头信息用于将HTTP连接升级为WebSocket连接
  3. 超时设置: WebSocket通常是长连接,需要适当增加超时时间

完整配置示例

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

    upstream websocket_backend {
        server 10.0.0.1:8080;
        server 10.0.0.2:8080;

        # 保持长连接
        keepalive 10;
    }

    server {
        listen 443 ssl;
        server_name ws.yourdomain.com;

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

        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_set_header X-Forwarded-Proto $scheme;

            # 超时设置
            proxy_read_timeout 86400s;
            proxy_send_timeout 86400s;

            # 缓冲区设置
            proxy_buffering off;
        }

        # 健康检查
        location /health {
            proxy_pass http://websocket_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

优化建议

  1. 负载均衡: 对于高并发场景,使用upstream配置多个后端服务器
  2. SSL/TLS: 生产环境应使用HTTPS/WSS确保通信安全
  3. 连接保持: 使用keepalive减少连接建立开销
  4. 缓冲区: 禁用代理缓冲(proxy_buffering off)以避免消息延迟
  5. 日志记录: 单独记录WebSocket访问日志便于监控

常见问题解决

连接断开问题

如果WebSocket连接频繁断开,可以: - 增加proxy_read_timeoutproxy_send_timeout - 检查后端服务器的keepalive设置 - 确保Nginx和后端服务器之间的网络稳定

502 Bad Gateway

  • 检查后端WebSocket服务是否正常运行
  • 验证proxy_pass地址是否正确
  • 检查防火墙设置,确保端口可访问

WebSocket握手失败

  • 确保正确设置了UpgradeConnection
  • 检查Nginx和后端服务器是否都支持WebSocket协议
  • 验证客户端使用的协议是否正确(ws://或wss://)

通过以上配置和优化,Nginx可以高效地反向代理WebSocket连接,为即时通信应用提供稳定可靠的基础设施支持。