我试图按照弹性beanstalk上的nginx的configuration,有些东西不加起来。
该实例正在安全组中打开端口80,所以我假定所有传入的通信都通过该端口
cat /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf中的nginxconfiguration指出:
server { listen 8080; location / { proxy_pass http://nodejs; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } gzip on; }
端口8080? 那个是从哪里来的? 我试图搞砸了,这是正在工作的实际指令。
server_name是缺less的,但没有关系你把它放在哪里。 如果我自己在server_name中放入任何值,这个服务器规则将仍然匹配所有的请求,即使是那些不能远程访问server_name值的请求。
当连接到实例本身时,似乎两个端口都被服务:
[ec2-user @ ip-172-31-45-222〜] $ sudo netstat -lnptu
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 22506 / nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22506 / nginx
而8080从来没有在安全组里面开放,所以弹性负载均衡是通过80端口进入的。交通神奇地从80增加到8080? 有什么想法发生在这里?
你忘了看看那个nginx配置的一部分:
upstream nodejs { server 127.0.0.1:8081; keepalive 256; }
这部分是告诉nginx制作一组名为nodejs
的服务器,你可以在这里阅读。
8081是NodeJS运行的端口(如果您使用示例应用程序 )。
您可以通过查看Elastic Beanstalk日志来验证这一点:
------------------------------------- /var/log/nodejs/nodejs.log ------------------------------------- server running at http://127.0.0.1:8081/
那么如果我们继续在nginx.conf文件中,我们可以看到你已经发布的内容:
server { listen 8080; location / { proxy_pass http://nodejs; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
这告诉nginx使用代理pass模块将所有从8080端口传递到在端口8081上运行的上游组nodejs
。这意味着端口8081只是用于本地访问,但端口8080是外部实体与nginx然后将东西传递到nodejs上。
一些不直接暴露NodeJS的推理可以在这个StackOverflow答案中找到。
端口8080被使用,因为它是“通常用于Web代理和缓存服务器,或作为非root用户运行Web服务器的HTTP替代端口 ”。
这解释了港口。 现在ELB的问题以及事情是如何相互交流的。
由于安全组只允许在端口80上访问,因此有一个iptables规则设置为将端口80转发到端口8080.这允许非root用户绑定到端口8080,因为较低端口号需要root权限。
您可以通过运行以下来验证这一点:
[ec2-user@ip-xxx-xx-xx-x ~]$ sudo iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080 Chain POSTROUTING (policy ACCEPT) target prot opt source destination
总之,当你加载你的CNAME时,负载均衡器将流量重新路由到端口80上的给定实例,这是通过安全组允许的,然后iptables将其转发到端口8080,这是nginx使用的端口将流量传递到作为NodeJS的本地端口的端口8081的代理。
希望有帮助。