欢迎光临潮州中国转运服务网
详情描述

Nginx WebSocket长连接及数据容量配置实践

一、WebSocket基础配置

http {
    # 启用WebSocket代理
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    upstream websocket_backend {
        # 负载均衡配置
        server 192.168.1.10:8080;
        server 192.168.1.11:8080;

        # 最少连接数算法(适合长连接)
        least_conn;

        # 保持长连接配置
        keepalive 100;  # 保持的连接数
    }

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

        location /ws/ {
            # WebSocket代理配置
            proxy_pass http://websocket_backend;
            proxy_http_version 1.1;

            # 必须的WebSocket头
            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 3600s;  # WebSocket读取超时
            proxy_send_timeout 3600s;  # WebSocket发送超时
            proxy_connect_timeout 30s; # 后端连接超时
        }
    }
}

二、数据容量优化配置

http {
    # 缓冲区配置
    proxy_buffer_size 16k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;

    # 临时文件配置(处理大消息)
    proxy_temp_file_write_size 256k;
    proxy_max_temp_file_size 1024m;

    # 请求体大小限制(针对WebSocket初始握手)
    client_max_body_size 100m;

    # TCP优化
    tcp_nopush on;
    tcp_nodelay on;

    server {
        location /ws/ {
            # WebSocket特定缓冲区配置
            proxy_buffering off;  # WebSocket通常禁用缓冲

            # 大消息分片配置
            proxy_websocket_buffer_size 128k;
            proxy_request_buffering off;

            # 限制帧大小(可选)
            # proxy_set_header Sec-WebSocket-Protocol $http_sec_websocket_protocol;
        }

        # 针对大文件传输的WebSocket
        location /ws/file-transfer {
            proxy_buffering on;
            proxy_buffer_size 256k;
            proxy_buffers 8 512k;
            proxy_busy_buffers_size 1m;

            # 增加超时时间
            proxy_read_timeout 7200s;
            proxy_send_timeout 7200s;
        }
    }
}

三、连接数限制和负载均衡

events {
    worker_connections 4096;  # 每个worker的连接数
    use epoll;                # Linux高性能事件模型
    multi_accept on;
}

http {
    # 全局连接限制
    limit_conn_zone $binary_remote_addr zone=ws_conn:10m;
    limit_conn_zone $server_name zone=ws_server:10m;

    upstream ws_cluster {
        zone upstream_zone 64k;
        least_conn;

        # 健康检查
        server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.12:8080 backup;  # 备份服务器

        # 会话保持(如果需要)
        hash $remote_addr consistent;

        # 连接数限制
        keepalive 500;
    }

    server {
        location /ws/ {
            # 连接数限制
            limit_conn ws_conn 1000;      # 单个IP最多1000连接
            limit_conn ws_server 10000;   # 服务器总连接数限制

            # 速率限制
            limit_req zone=ws_req burst=50 nodelay;

            proxy_pass http://ws_cluster;

            # 连接保持
            proxy_set_header Connection "";
            proxy_set_header Keep-Alive "";
        }
    }
}

四、SSL/TLS配置(WSS)

server {
    listen 443 ssl http2;
    server_name wss.example.com;

    # SSL证书
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    # SSL优化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000" always;

    location /wss/ {
        # WebSocket over TLS
        proxy_pass http://websocket_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # SSL传递
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Ssl on;

        # 增强安全
        proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
        proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
        proxy_set_header Sec-WebSocket-Protocol $http_sec_websocket_protocol;
    }
}

五、监控和日志配置

http {
    # WebSocket专用日志格式
    log_format websocket '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '$upstream_addr $upstream_response_time '
                        '$connection $connection_requests '
                        'upgrade:$http_upgrade '
                        'sec_key:$http_sec_websocket_key';

    server {
        # 访问日志
        access_log /var/log/nginx/websocket_access.log websocket;
        error_log /var/log/nginx/websocket_error.log warn;

        location /ws/ {
            # 连接状态监控
            proxy_set_header X-Connection-ID $connection;
            proxy_set_header X-Request-ID $request_id;

            # 统计信息
            stub_status on;  # 在单独location开启状态页

            # 慢连接日志
            log_format slow_ws '$remote_addr [$time_local] '
                              'rt=$request_time uct=$upstream_connect_time '
                              'uht=$upstream_header_time urt=$upstream_response_time';
            access_log /var/log/nginx/ws_slow.log slow_ws if=$slow_connection;
        }
    }
}

六、完整配置示例

# 用户和进程配置
user nginx;
worker_processes auto;  # 自动根据CPU核心数设置
worker_rlimit_nofile 65535;  # 文件描述符限制

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # WebSocket升级映射
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    # 连接限制区域
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;

    # 上游服务器
    upstream websocket_cluster {
        zone ws_cluster 64k;
        least_conn;
        keepalive 500;

        server 10.0.1.10:8080 max_fails=3 fail_timeout=30s weight=10;
        server 10.0.1.11:8080 max_fails=3 fail_timeout=30s weight=10;
        server 10.0.1.12:8080 backup;
    }

    # 主服务器配置
    server {
        listen 80;
        listen 443 ssl http2;
        server_name ws.yourdomain.com;

        # SSL配置
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;

        # WebSocket路径
        location /ws/ {
            # 连接限制
            limit_conn perip 1000;
            limit_conn perserver 10000;

            # WebSocket代理
            proxy_pass http://websocket_cluster;
            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 3600s;
            proxy_send_timeout 3600s;
            proxy_connect_timeout 30s;

            # 缓冲区配置
            proxy_buffering off;
            proxy_request_buffering off;

            # WebSocket特定
            proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
            proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
            proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;

            # 健康检查头
            proxy_set_header X-Health-Check "websocket";
        }

        # 状态监控端点
        location /nginx_status {
            stub_status on;
            access_log off;
            allow 127.0.0.1;
            allow 10.0.0.0/8;
            deny all;
        }

        # 健康检查端点
        location /health {
            access_log off;
            return 200 "healthy\n";
            add_header Content-Type text/plain;
        }
    }
}

七、优化建议和注意事项

性能调优参数

# 内核参数调整(/etc/sysctl.conf)
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
Nginx配置

worker_processes auto; # CPU核心数 worker_rlimit_nofile 65535; # 文件描述符


2. **监控指标**:
   - 活跃WebSocket连接数
   - 消息传输速率
   - 连接持续时间
   - 错误率和重连频率

3. **安全建议**:
   - 启用WSS(WebSocket Secure)
   - 实施连接数限制
   - 添加身份验证
   - 设置合适的超时时间

4. **故障排查命令**:
```bash
# 查看连接状态
ss -tuna | grep :80
netstat -an | grep ESTABLISHED

# 监控Nginx状态
curl http://localhost/nginx_status

# 日志分析
tail -f /var/log/nginx/websocket_access.log
grep "101 Switching Protocols" access.log

这个配置可以根据实际业务需求进行调整,特别是超时时间、缓冲区大小和连接数限制等参数。