做代理时 Nginx 中的 Websocket 升级标头问题

Posted

技术标签:

【中文标题】做代理时 Nginx 中的 Websocket 升级标头问题【英文标题】:Issues with Websocket Upgrade header in Nginx while doing proxy 【发布时间】:2015-10-06 07:41:50 【问题描述】:

我有 3 个 scalaakka-http 应用程序绑定到 localhostubuntu 机器中的不同端口。我想访问具有相同端口号的所有应用程序。所以我使用 nginx 代理请求并在内部重定向到所需的端口号。 一切都按预期工作正常。现在,在每个应用程序中,我都有使用 akka-http 构建的内置 websocket。所有 websocket 请求都将具有 url .../ws/.. 例如:

App-1(HR) 
  Url => http://192.168.1.50:90/hr/ ....  nginx resolve to localhost:8181
  web socket url => http://192.168.1.50:90/hr/ws/...

App-2(Common) 
  Url => http://192.168.1.50:90/common/... nginx resolve to localhost:8182
  web socket url => http://192.168.1.50:90/common/ws/... 

App-3(accounts) 
  Url => http://192.168.1.50/accounts/.. nginx resolve to localhost:8183
  web socket url => http://192.168.1.50:90/accounts/ws/...

Websocket 在我的机器上工作正常,但是当我部署到 ubuntu 服务器时,它在 websocket 中出现错误。查了日志,发现原因是nginx代理做完了,不会带Upgrade这个头。所以我在nginx配置文件中对location元素做了如下改动。

location /common 
                location /common/global 
                        proxy_pass http://127.0.0.1:8182/common/ws;
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection "upgrade";
                
                location /common 
                        proxy_pass http://127.0.0.1:8182/common;
                

现在 websocket 工作正常。但是,我还需要将其添加到其他两个位置元素中。 我不确定这是否是正确的方法。有人可以指导我吗?

【问题讨论】:

【参考方案1】:

在您的标题中查看 Chrome 中的检查器。它发送大写字母Upgrade 而不是upgrade。我不确定这是否是您唯一的问题,但在解决此问题之前,我的问题无法使用。

proxy_set_header Connection "upgrade";

应该是

proxy_set_header Connection "Upgrade";

【讨论】:

以上是关于做代理时 Nginx 中的 Websocket 升级标头问题的主要内容,如果未能解决你的问题,请参考以下文章

docker 中的 nginx + websocket 代理 + Ratchet

websocket使用nginx作为反向代理

Nginx websocket反向代理

nginx websocket 代理

通过 nginx websocket 代理连接时 WebApp 崩溃

Nginx反向代理websocket配置实例