nginx websocket反向代理配置

Posted

技术标签:

【中文标题】nginx websocket反向代理配置【英文标题】:nginx websocket reverse proxy configuration 【发布时间】:2013-07-02 13:46:31 【问题描述】:

您好,我正在尝试将 nginx 配置为 websockets 的反向代理。我将我的服务器配置如下:

server 
    listen       80;
    server_name  www.mydomain.com;

    access_log  off;
    #error_log off;

    location / 
        proxy_pass         http://127.0.0.1:8765;
        proxy_redirect     off;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $http_host;

        proxy_buffering off;
    


但我从客户端收到如下错误

与“ws://www.application.com/ws”的 WebSocket 连接失败:WebSocket 握手期间出错:“Connection”标头值不是“Upgrade”

我可能做错了一些配置,但我看不到它。

客户端的请求标头如下

GET ws://www.talkybee.com/ws HTTP/1.1
Pragma: no-cache
Origin: http://www.talkybee.com
Host: www.talkybee.com
Sec-WebSocket-Key: Ol+O1IdaLEsHxxWRBt2oqg==
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/27.0.1453.116 Safari/537.36
Upgrade: websocket
Sec-WebSocket-Extensions: x-webkit-deflate-frame
Cache-Control: no-cache
Connection: Upgrade
Sec-WebSocket-Version: 13

当我进行正常的直接连接时,我的连接正常工作。这是有效的请求标头。

Cache-Control:no-cache
Connection:Upgrade
Host:www.talkybee.com:8765
Origin:http://www.talkybee.com:8765
Pragma:no-cache
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:Y026b/84aUkMxVb0MaKE2A==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36

【问题讨论】:

如果你尝试proxy_pass http://127.0.0.1:8765/;会发生什么 @rednaw 我遇到了同样的异常。我用当前的配置更改了问题中的配置。 您的客户端是否也将Connection 标头设置为Upgrade @rednaw。是的,它似乎有 connection:Upgrade 标头。我将尝试获取工作直接连接标头和代理标头的差异。 @rednaw 看起来我缺少 Sec-WebSocket-Key: 标头。我想我也应该找到一种方法来集中这些标题。 【参考方案1】:

此问题与 nginx 版本有关。请检查 nginx -v,以检查您的版本。 1.4版本以后支持以下参数。

 # WebSocket support (nginx 1.4)
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";

如果您使用的是 ubuntu,您可以通过以下步骤安装更新版本:

先删除旧版本(https://askubuntu.com/questions/235347/what-is-the-best-way-to-uninstall-nginx):

sudo apt-get remove nginx
sudo apt-get purge nginx
sudo apt-get autoremove 

然后安装新版本(https://launchpad.net/~nginx/+archive/development):

sudo add-apt-repository ppa:nginx/development
sudo apt-get update
sudo apt-get install nginx

【讨论】:

我也有这个问题,但我通过升级我的 nginx 服务器 (~$ nginx -v) (nginx version: nginx/1.5.1) 解决了这个问题 我对这个问题的解决方案是为 websocket 连接直接端口。所以我的网站在端口:80 但我的 websocket 连接到端口:8765 看起来 websocket 毕竟没有跨域限制。

以上是关于nginx websocket反向代理配置的主要内容,如果未能解决你的问题,请参考以下文章

Nginx实战之反向代理WebSocket的配置实例

Nginx反向代理websocket配置实例

Nginx配置websocket的反向代理

修改 nginx 配置以正确反向代理 websockets

配置Nginx反向代理WebSocket,以代理NoVNC为例

Nginx websocket反向代理