Websocket适用于EC2网址但不适用于ElasticBeanstalk网址

时间:2017-09-03 12:05:47

标签: nginx elastic-beanstalk amazon-elb amazon-elastic-beanstalk

背景

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

应将描述

在浏览器中,我可以直接调用EC2ELB的Websocket网址,结果相同:

  

欢迎来到SockJS!

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

EC2 网址上的网页插件工作正常。

ELB 网址上的网页容器会将错误状态返回给我的客户:

  

代码:1002,   原因:&#34;无法连接到服务器&#34;

最奇怪的是,我的 nginx 服务器甚至无法记录 ELB 的请求。

问题

为什么 ELB 无法在 nginx 配置中运行?如何纠正?

我尝试了什么?

我检查了questionblog,建议他们覆盖位于00_elastic_beanstalk_proxy.conf的{​​{1}}等nginx配置文件。但我的服务器在文件系统上没有任何nginx配置文件...

1 个答案:

答案 0 :(得分: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并且它希望看到{{1}然后nginx不会响应请求。

与您的ELB服务器发生的情况相同。您在某个域名abc.mydomain.com托管nginx,并使用abc.domain.com将流量传递给ELB。但是使用proxy_pass,将主机名设置为proxy_set_header Host $host;,ELB无法理解该主机的位置。所以它不会服务于请求,因此错误