Websocket通过两个Nginx代理后获得504

时间:2019-03-22 18:38:21

标签: docker nginx websocket

这是故事:

我的服务器是运行centos的云服务器,并提供一些网页。
这些网页可以分为3个主要类别,即我的作业,我的小项目和大项目。

为了有效管理它们,我决定将它们移到docker容器中。结构如下:

pip install --upgrade wand

我尝试使用nginx侦听物理机上的端口80并将代理传递请求发送到我的容器,并将我的容器中的nginx代理传递请求发送到我的后端服务器。在这种情况下,除了websocket之外,其他所有东西都可以正常工作。可以加载网页,可以响应对后端服务器的Ajax请求,但是当涉及websocket时,后端服务器可以接收,升级和保留它,但是直到nginx关闭连接并出现错误之前,浏览器无法获得任何响应超过时间后,代码504。
当我绑定容器80的端口80而不是在物理机上使用nginx代理时,一切正常。

我认为这与标头无关,因为我在升级标头之前先用代码设置了标头。

我不知道为什么,有人可以帮助我吗?

这是我的配置:

This is my plan but websocket can't work on this setup

port 80---Nginx
          |
          |-another port--container port 80-nginx--static files
          |                                 |--container port--back end server
          |-another port ....
          ......
################################################################################
Websocket works fine on this setup

physical port -- container port -- nginx -- static files
                                   |--container port--back end server

1 个答案:

答案 0 :(得分:0)

我没有使用proxy_set_header将标头传递到后端服务器。相反,我尝试使后端服务器将http请求升级到websocket,而不管标头。 当我仅使用一个Nginx代理时,它就可以工作。但是在这种情况下,第二个nginx将无法意识到这是一个websocket连接。因此它不起作用。

因此有必要使用proxy_set_headr。