背景
我有反向代理( nginx )指向作为singleInstance环境类型的ElasticBeanstalk( ELB )并创建EC2实例( EC2 )。我正在使用dockerized nodejs应用程序。 nginx 是我们基础架构的切入点。
应将描述
在浏览器中,我可以直接调用EC2和ELB的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 配置中运行?如何纠正?
我尝试了什么?
我检查了question和blog,建议他们覆盖位于00_elastic_beanstalk_proxy.conf
的{{1}}等nginx配置文件。但我的服务器在文件系统上没有任何nginx配置文件...
答案 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无法理解该主机的位置。所以它不会服务于请求,因此错误