nginx WebSocket反向代理配置

4

您好,我正在尝试将Nginx配置为WebSocket的反向代理。我按照以下方式配置了我的服务器:

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;
    }

}

但是我从客户端得到了以下错误:

WebSocket连接到'ws://www.application.com/ws'失败: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/;,会发生什么? - gitaarik
@rednaw 我也遇到了同样的异常。我已经将问题中的配置更改为当前的配置。 - yilmazhuseyin
@rednaw。是的,看起来它有连接:升级头信息。我将尝试获取工作直接连接头信息和代理头信息的差异。 - yilmazhuseyin
我刚刚在头部看到了webdocket-key。区别在于破损的一个会执行HTTP请求,而不是WebSocket请求。 - yilmazhuseyin
@yilmazhuseyin,你能发一下你的解决方案吗?我也遇到了同样的问题,但是我现在无法升级到nginx 1.4。 - qodeninja
显示剩余2条评论
1个回答

21

这个问题与 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版本:nginx/1.5.1) - yilmazhuseyin
我针对这个问题的解决方案是连接websocket的直接端口。因此,我的网站在端口80上,但我的websocket连接到端口8765,看起来websocket并没有跨域限制。 - yilmazhuseyin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接