插件窝 干货文章 如何使用Nginx实现WebSocket协议支持

如何使用Nginx实现WebSocket协议支持

proxy Upgrade WebSocket server 102    来源:    2025-04-13

使用Nginx支持WebSocket协议的配置指南

WebSocket是一种在单个TCP连接上进行全双工通信的协议,Nginx可以通过适当的配置来支持WebSocket连接。以下是详细的配置方法:

基本配置

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

关键配置说明

  1. proxy_http_version 1.1:

    • WebSocket需要HTTP/1.1协议支持
  2. Upgrade和Connection头:

    • Upgrade $http_upgrade: 传递客户端的Upgrade头
    • Connection "upgrade": 将连接升级为WebSocket
  3. 超时设置:

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

完整示例配置

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

    server {
        listen 80;
        server_name ws.example.com;

        location /chat/ {
            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; # 24小时
            proxy_send_timeout 86400s;
        }
    }

    upstream websocket_backend {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }
}

SSL/TLS配置

如果使用HTTPS/WSS,需要添加SSL配置:

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

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

    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;
    }
}

负载均衡配置

对于多台WebSocket服务器,可以使用Nginx的upstream模块:

upstream websocket_servers {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080;

    # 保持连接以支持WebSocket长连接
    keepalive 10;
}

server {
    location /ws/ {
        proxy_pass http://websocket_servers;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

常见问题解决

  1. 连接立即断开:

    • 确保所有必需的HTTP头(Upgrade, Connection)正确传递
    • 检查后端服务器是否正确实现了WebSocket协议
  2. 超时问题:

    • 增加proxy_read_timeoutproxy_send_timeout
    • 考虑添加心跳机制保持连接活跃
  3. 负载均衡问题:

    • WebSocket是长连接,确保使用ip_hash或sticky session保持会话一致性
    upstream websocket_servers {
       ip_hash;
       server 10.0.0.1:8080;
       server 10.0.0.2:8080;
    }
    

配置完成后,记得测试WebSocket连接并检查Nginx错误日志(/var/log/nginx/error.log)以排查任何潜在问题。