Websocket参数

博客简介

本文是针对 Websocket 请求在 Nginx 中的必要参数的一些配置说明

直接通过端口可连接,但是使用nginx转发后则需要进行相关配置,否则会报以下异常

QWebSocketPrivate::processHandshake: Unhandled http status code: 200 (OK).

一、解决方案

参考Nginx官方文档配置websocket:http://nginx.org/en/docs/http/websocket.html

location / {
    proxy_pass http://119.28.180.116:9099;
    // 这里三个选项是websocket配置配置的【直接复制即可】
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

二、举个栗子

server {
    listen       8882;
    server_name  192.168.50.229;
    
    location /prod-api/ {    
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.50.229:8082/;
        proxy_http_version 1.1;    
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

警告

nginx进行websocket代理后,60s未传输数据会被服务端断开连接

默认情况下,如果代理的服务器在60秒内没有传输任何数据,则连接将被关闭。这个超时可以通过 proxy read timeout 指令来增加 。

或者,代理服务器可以配置为定期发送WebSocket ping帧以重置超时并检查连接是否仍然存在。

  • 1、proxy_connect_timeout:后端服务器连接的超时时间_发起握手等候响应超时时间(默认60秒)

  • 2、proxy_read_timeout:连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

  • 3、proxy_send_timeout:后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

PS:后端连接时间和后端回传时间使用默认的即可,但是等候后端服务器响应时间 proxy_read_timeout 需要改大一点,保持长链接状态。

三、最终配置版本

server {
    listen       8882;
    server_name  192.168.50.229;
    
    location /prod-api/ {    
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_read_timeout 86400s;
        proxy_pass http://192.168.50.229:8082/;
        proxy_http_version 1.1;    
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}