您忘记查看该 nginx 配置的一部分:
upstream nodejs {
server 127.0.0.1:8081;
keepalive 256;
}
这部分是告诉 nginx 创建一组名为 nodejs 的服务器,您可以阅读有关 here 的信息。
8081 是运行 NodeJS 的端口(例如,如果您使用 sample application)。
您可以通过查看 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 使用 proxy pass module 将所有从端口 8080 传递到我们在端口 8081 上运行的上游组 nodejs。这意味着端口 8081 仅用于在本地访问它,但端口 8080 是让我们在外面实体与 nginx 对话,然后将内容传递到 nodejs。
不直接暴露NodeJS的一些原因可以在this StackOverflow answer找到。
使用端口 8080 是因为 HTTP alternate port“通常用于 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
因此,总而言之,当您加载 CNAME 时,负载均衡器会将流量重新路由到端口 80 上的给定实例,这是通过安全组允许的,然后 iptables 将其转发到端口 8080,该端口是nginx 正在使用代理将流量传递到端口 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
希望对您有所帮助。