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

Nginx反向代理Websocket配置教程,实现实时通信

proxy WebSocket 配置 Nginx 749    来源:    2025-04-16

Nginx反向代理WebSocket配置教程

WebSocket是一种在单个TCP连接上进行全双工通信的协议,常用于实时通信应用。本教程将详细介绍如何使用Nginx作为反向代理来配置WebSocket服务。

基础配置

以下是一个基本的Nginx WebSocket反向代理配置:

server {
    listen 80;
    server_name yourdomain.com;

    location /ws/ {
        proxy_pass http://backend_server;

        # WebSocket必需配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header 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;
    }
}

配置详解

必需配置项

  1. HTTP版本

    proxy_http_version 1.1;
    

    WebSocket需要HTTP/1.1协议支持

  2. 升级头信息

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    

    这两行告诉Nginx将连接从HTTP协议升级为WebSocket协议

推荐配置项

  1. 超时设置

    proxy_read_timeout 86400s;  # 24小时
    proxy_send_timeout 86400s;
    

    WebSocket通常是长连接,需要设置较长的超时时间

  2. 负载均衡

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

    然后在location中使用:

    proxy_pass http://websocket_servers;
    

SSL/TLS配置

对于安全的WebSocket连接(wss://),需要配置SSL:

server {
    listen 443 ssl;
    server_name yourdomain.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";

        # 其他配置...
    }
}

完整示例配置

upstream websocket_cluster {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    ip_hash;  # 保持客户端与同一后端服务器的连接
}

server {
    listen 80;
    server_name ws.example.com;
    return 301 https://$host$request_uri;
}

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优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # WebSocket配置
    location /ws/ {
        proxy_pass http://websocket_cluster;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header 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;

        # 限制连接数
        limit_conn conn_limit_per_ip 10;
        limit_conn_status 429;
    }

    # 健康检查端点
    location /health {
        proxy_pass http://websocket_cluster;
        access_log off;
    }
}

常见问题解决

  1. 连接断开问题

    • 确保设置了足够长的超时时间
    • 检查Nginx和客户端/服务器之间的任何防火墙或代理是否允许长连接
  2. 502 Bad Gateway错误

    • 确保后端WebSocket服务器正在运行
    • 检查Nginx错误日志:/var/log/nginx/error.log
  3. WebSocket连接无法建立

    • 确保所有必需的头部信息已正确设置
    • 使用浏览器开发者工具检查网络请求,确认Upgrade头是否发送
  4. 负载均衡问题

    • 考虑使用ip_hash保持会话粘性
    • 或者在后端实现共享会话状态

性能优化建议

  1. 调整Nginx worker进程数量以匹配CPU核心数
  2. 对于高并发场景,调整worker_connections
  3. 考虑启用Nginx的tcp_nopushtcp_nodelay选项
  4. 对于大量连接,可能需要调整系统级别的文件描述符限制

测试配置

  1. 测试Nginx配置语法:

    sudo nginx -t
    
  2. 重新加载Nginx配置:

    sudo systemctl reload nginx
    
  3. 使用WebSocket客户端工具测试连接,如wscat

    wscat -c ws://yourdomain.com/ws/
    

通过以上配置,Nginx可以有效地作为WebSocket服务的反向代理,提供负载均衡、SSL终止和其他高级功能,同时保持WebSocket连接的高效和稳定。