Websocket 适用于 EC2 url 但不适用于 ElasticBeanstalk URL
Websocket works on EC2 url but not on ElasticBeanstalk URL
背景
我有反向代理 (nginx) 指向 ElasticBeanstalk (ELB),它是一个 singleInstance 环境类型并创建一个 EC2 实例 ( EC2)。我正在使用 dockerized nodejs 应用程序。 nginx 是我们基础架构的入口点。
说明
在浏览器中,我可以直接调用 EC2 and of ELB 的 Websocket URLs,结果相同:
Welcome to SockJS!
对于 nginx 我使用以下配置 (nginx conf.d/my.conf) 我只更改 [= EC2 或 ELB 的 82=]s 在以 proxy_pass
:
开头的行
location /stomp {
proxy_pass <{EC2_URL}/stomp OR {ELB_URL}/stomp>;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
EC2URL 上的 Websockets 工作正常。
ELB 上的 WebsocketsURLreturn 返回我的客户端的错误状态:
code: 1002,
reason: "Cannot connect to server"
最奇怪的是我的 nginx 服务器甚至不记录 ELB 的请求。
问题
为什么 ELB 在 nginx 配置中不工作?如何纠正?
我尝试了什么?
我检查了 and a blog,他们建议覆盖 located in /tmp/deployment/config/etc#nginx#nginx.conf
中的 00_elastic_beanstalk_proxy.conf
等 nginx 配置文件。但是我的服务器在文件系统上没有任何 nginx 配置文件...
此问题与您的 proxy_set_header Host $host;
有关。问题是因为不同的服务器对主机名 header.
的反应方式
在浏览器中打开以下网址时考虑
http://ec2-52-59-53-38.eu-central-1.compute.amazonaws.com/stomp
http://stag-ws-server.eu-central-1.elasticbeanstalk.com/stomp
一个是EC2,一个是ELB。当您向 ec2 发送请求时,主机名发送为 ec2-52-59-53-38.eu-central-1.compute.amazonaws.com
。现在,如果您有直接或通过 docker 侦听端口 80 的服务。它正在侦听端口 80,并不关心流量是如何到达它的。
它只知道如果有人通过任何方式访问服务器,我们就会做出响应。现在如果你在那个 EC2 上有一个 nginx,它只监听一个特定的虚拟主机并且不响应任何其他主机名,那么如果你发送它 ec2-52-59-53-38.eu-central-1.compute.amazonaws.com
并且它希望看到 abc.mydomain.com
然后nginx 不会响应请求。
您的 ELB 服务器也是如此。您在某个域名 abc.domain.com
上托管 nginx,并使用 proxy_pass
将流量传递给 ELB。但是使用 proxy_set_header Host $host;
,将主机名设置为 abc.domain.com
,ELB 无法理解该主机的位置。所以它不会为请求提供服务,因此不会出现错误
背景
我有反向代理 (nginx) 指向 ElasticBeanstalk (ELB),它是一个 singleInstance 环境类型并创建一个 EC2 实例 ( EC2)。我正在使用 dockerized nodejs 应用程序。 nginx 是我们基础架构的入口点。
说明
在浏览器中,我可以直接调用 EC2 and of ELB 的 Websocket URLs,结果相同:
Welcome to SockJS!
对于 nginx 我使用以下配置 (nginx conf.d/my.conf) 我只更改 [= EC2 或 ELB 的 82=]s 在以 proxy_pass
:
location /stomp {
proxy_pass <{EC2_URL}/stomp OR {ELB_URL}/stomp>;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
EC2URL 上的 Websockets 工作正常。
ELB 上的 WebsocketsURLreturn 返回我的客户端的错误状态:
code: 1002, reason: "Cannot connect to server"
最奇怪的是我的 nginx 服务器甚至不记录 ELB 的请求。
问题
为什么 ELB 在 nginx 配置中不工作?如何纠正?
我尝试了什么?
我检查了 located in /tmp/deployment/config/etc#nginx#nginx.conf
中的 00_elastic_beanstalk_proxy.conf
等 nginx 配置文件。但是我的服务器在文件系统上没有任何 nginx 配置文件...
此问题与您的 proxy_set_header Host $host;
有关。问题是因为不同的服务器对主机名 header.
在浏览器中打开以下网址时考虑
http://ec2-52-59-53-38.eu-central-1.compute.amazonaws.com/stomp http://stag-ws-server.eu-central-1.elasticbeanstalk.com/stomp
一个是EC2,一个是ELB。当您向 ec2 发送请求时,主机名发送为 ec2-52-59-53-38.eu-central-1.compute.amazonaws.com
。现在,如果您有直接或通过 docker 侦听端口 80 的服务。它正在侦听端口 80,并不关心流量是如何到达它的。
它只知道如果有人通过任何方式访问服务器,我们就会做出响应。现在如果你在那个 EC2 上有一个 nginx,它只监听一个特定的虚拟主机并且不响应任何其他主机名,那么如果你发送它 ec2-52-59-53-38.eu-central-1.compute.amazonaws.com
并且它希望看到 abc.mydomain.com
然后nginx 不会响应请求。
您的 ELB 服务器也是如此。您在某个域名 abc.domain.com
上托管 nginx,并使用 proxy_pass
将流量传递给 ELB。但是使用 proxy_set_header Host $host;
,将主机名设置为 abc.domain.com
,ELB 无法理解该主机的位置。所以它不会为请求提供服务,因此不会出现错误