Dmi*_*ink 16 nginx amazon-web-services amazon-elastic-beanstalk
我试图遵循弹性beanstalk上的nginx配置,有些东西不加起来.
该实例在安全组中打开端口80,因此我假设所有传入流量都来自该端口
cat /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf中的nginx配置指出:
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;
}
Run Code Online (Sandbox Code Playgroud)
8080港口?那个是从哪里来的?我试图弄乱它,这是正在运行的实际指令.
server_name丢失了,但是你输入的内容并不重要.如果我自己在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?有什么想法在这里发生了什么?
Jos*_*vis 41
您忘记查看该nginx配置的一部分:
upstream nodejs {
server 127.0.0.1:8081;
keepalive 256;
}
Run Code Online (Sandbox Code Playgroud)
那部分是告诉nginx创建一组服务器nodejs
,你可以在这里阅读.
8081是运行NodeJS的端口(例如,如果您使用示例应用程序).
您可以通过查看Elastic Beanstalk日志来验证这一点:
-------------------------------------
/var/log/nodejs/nodejs.log
-------------------------------------
Server running at http://127.0.0.1:8081/
Run Code Online (Sandbox Code Playgroud)
然后,如果我们继续在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;
}
}
Run Code Online (Sandbox Code Playgroud)
这告诉nginx使用代理传递模块将所有端口8080传递到我们nodejs
在端口8081上运行的上游组.这意味着端口8081仅用于本地访问它,但端口8080是让外部实体与nginx通信的端口然后将东西传递给nodejs.
可以在此StackOverflow答案中找到一些不直接暴露NodeJS的原因.
使用端口8080是因为它是HTTP备用端口,"通常用于Web代理和缓存服务器,或用于以非root用户身份运行Web服务器".
这解释了港口.现在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
Run Code Online (Sandbox Code Playgroud)
总而言之,当您加载CNAME时,负载均衡器将流量重新路由到端口80上的给定实例(允许通过安全组),然后iptables将其转发到端口8080,这是nginx正在使用的端口将流量传递到端口8081的代理,端口8081是NodeJS的本地端口.
这是一个图表:
incoming connections
-> :80 - Load Balancer
-> :80 - Security group
-> :80 -> :8080 - EC2 instance, iptables forward
-> :8080 -> :8081 - nginx, proxy pass
-> :8081 - nodejs, your app
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助.
归档时间: |
|
查看次数: |
9442 次 |
最近记录: |