你忘了看那個nginx的配置的一部分:
upstream nodejs {
server 127.0.0.1:8081;
keepalive 256;
}
那部分告訴nginx的做一團叫nodejs
服務器,你可以閱讀有關here。
8081是NodeJS正在運行的端口(例如,如果您使用sample application)。
您可以通過查看彈性魔豆日誌驗證這一點:
-------------------------------------
/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傳遞給我們的上游端口組nodejs
,這個端口在端口8081上運行。這意味着端口8081只是用於本地訪問,但端口8080是我們外部的實體與nginx進行通信然後通過東西到nodejs上。
一些不直接暴露NodeJS的推理可以在this StackOverflow answer找到。
端口8080被使用,因爲它是HTTP alternate port,它是「通常用於Web代理和緩存服務器,或用於作爲非root用戶運行Web服務器。「
這解釋了端口。ELB現在的問題和事情是如何互相交談。
由於安全組只允許端口80訪問,還有一個iptables規則是設置轉發80端口到端口8080。這允許非root用戶綁定到端口8080,因爲較低的端口號需要root權限
您可以驗證此以下內容:
[[email protected] ~]$ 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。
希望有幫助。
但是nginx以root身份運行,並且所有的nginx例子總是在配置中有80個,這就是爲什麼我很困惑,關於beanstalk環境有什麼特別之處。 – 2014-09-27 16:53:09
當然,並不是所有* nginx的配置都在80端口上運行。使用端口80編寫教程要比使用iptable過濾器在不同端口上運行它要簡單得多。 Elastic Beanstalk沒有什麼特別之處,它只是選擇了什麼。 – 2014-09-27 17:20:46
這是對nodejs應用程序的ElasticBeanstalk nginx設置的一個很好的解釋,特別是最後的iptables步驟。 – Jessedc 2016-02-22 04:46:23