微信公众号
扫描关注微信公众号
博客大厅

如何配置 Nginx 支持 WebSocket?

原创 来源:博客站 阅读 0 今天 08:55:15 听全文

在 Nginx 中配置 WebSocket 支持需要确保代理正确处理 WebSocket 的协议升级(Upgrade)和连接保持(Connection)。以下是 完整配置指南关键优化技巧


1. 基础 WebSocket 代理配置

server {
    listen 80;
    server_name example.com;

    location /ws/ {
        proxy_pass http://backend_ws;  # WebSocket后端服务器地址
        proxy_http_version 1.1;       # 必须使用HTTP/1.1
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

upstream backend_ws {
    server 10.0.0.1:8080;  # WebSocket服务地址(如Node.js、Socket.io)
}

关键指令说明

指令 作用
proxy_http_version 1.1 WebSocket 必须基于 HTTP/1.1 协议。
proxy_set_header Upgrade 传递客户端的 Upgrade: websocket 头到后端。
proxy_set_header Connection Connection: upgrade 头透传给后端,完成协议升级。

2. 高级优化配置

(1) 超时控制

WebSocket 是长连接,需调整超时时间:

location /ws/ {
    proxy_pass http://backend_ws;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
    proxy_read_timeout 86400s;  # 连接保持时间(24小时)
    proxy_send_timeout 86400s;
}

(2) 负载均衡

多个 WebSocket 后端服务器时:

upstream backend_ws {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    ip_hash;  # 同一IP固定访问同一后端(保持会话)
}

(3) HTTPS/WSS 配置

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

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

3. 完整配置示例

http {
    upstream websocket_servers {
        ip_hash;
        server 10.0.0.1:8080 weight=3;
        server 10.0.0.2:8080;
    }

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

        # WebSocket 路径
        location /chat/ {
            proxy_pass http://websocket_servers;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Real-IP $remote_addr;
            
            # 超时与缓冲优化
            proxy_read_timeout 86400s;
            proxy_buffer_size 16k;
            proxy_buffers 4 32k;
        }

        # HTTP 跳转 HTTPS(可选)
        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        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;

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

4. 测试 WebSocket 连接

(1) 使用 curl 测试协议升级

curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: example.com" http://localhost/ws/
  • 正常响应应包含 HTTP/1.1 101 Switching Protocols

(2) 浏览器端测试

// JavaScript 示例
const socket = new WebSocket("wss://example.com/ws/");
socket.onopen = () => console.log("Connected!");
socket.onmessage = (e) => console.log("Message:", e.data);

5. 常见问题排查

问题1:连接立即断开

  • 原因:Nginx 未正确传递 Upgrade 头。
  • 解决:检查配置中是否遗漏 proxy_set_header 指令。

问题2:WSS (WebSocket Secure) 失败

  • 原因:证书无效或配置错误。
  • 排查
    openssl s_client -connect example.com:443 -servername example.com -showcerts
    

问题3:负载不均衡

  • 现象:所有流量打到同一后端。
  • 解决:确保使用 ip_hash 或 Nginx Plus 的 sticky 指令。

6. 性能优化建议

  1. 调整内核参数
    echo "net.ipv4.tcp_keepalive_time = 300" >> /etc/sysctl.conf
    sysctl -p
    
  2. 启用多 Worker 进程
    worker_processes auto;  # 自动匹配CPU核心数
    
  3. 监控连接数
    watch -n 1 "netstat -anp | grep -E 'nginx|8080' | grep ESTABLISHED"
    

通过以上配置,Nginx 可以高效代理 WebSocket 流量,适用于实时聊天、在线游戏、股票行情等场景。对于高并发场景,建议结合 limit_conn 限制单 IP 连接数。

- - - - - - - 剩余部分未读 - - - - - - -
扫描关注微信公众号获取验证码,阅读全文
你也可以查看我的公众号文章,阅读全文
你还可以登录,阅读全文
原文出处: 内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/979.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。
>