3

背景WebSocket的工作在EC2上的网址,但不ElasticBeanstalk URL

我有反向代理(nginx的)指向ElasticBeanstalk(ELB)这是一个singleInstance环境类型,并创建一个EC2实例(EC2)。我正在使用dockerized nodejs应用程序。 nginx是我们基础架构的切入点。

应将描述

从浏览器,我可以直接调用EC2的WebSocket的网址和ELB具有相同的结果:

欢迎SockJS!

对于nginx的我使用下面的配置(nginx的conf.d/my.conf)其中,I只改变EC2的网址ELBproxy_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; 
    } 

网址为EC2的网址正常。在ELB URL

的WebSockets返回一个错误回到我的客户:

代码:1002, 原因: “无法连接到服务器”

最奇怪的是,我的nginx服务器甚至不记录请求的情况下ELB

问题

为什么ELB没有在nginx的配置工作?如何纠正?

我试过了吗?

我已经查了questionblog他们的意见重写像位于located in /tmp/deployment/config/etc#nginx#nginx.conf00_elastic_beanstalk_proxy.conf nginx的配置文件。但我的服务器在文件系统上没有任何nginx配置文件...

+0

那么nginx运行在你的情况? –

+0

你连接了哪个端口?默认的Load Balancer设置只能从端口80或端口443接收流量。如果您使用SSL,您是否拥有使用ElasticBeanstalk设置的证书?如果您从未在Nginx上获得请求,那么您可能永远不会从您的Load Balancer转发。要查看您的负载平衡器,您应该转到AWS面板上的EC2 - > Load Balancers。 – jonzlin95

+0

@ jonzlin95我们通过端口80连接。在'EC2→Load Balancers'中没有列出负载均衡器,但这并不意外。因为我们只使用带有SingleInstance环境类型的ELB。 – zatziky

回答

1

该问题与您的proxy_set_header Host $host;有关。这些问题是由于不同的服务器对主机名标题的反应方式。

考虑当你在浏览器

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无法了解该主机位于何处。所以它不会服务器请求,因此错误