2014-09-27 28 views
12

我想跟隨彈性beanstalk上的nginx的配置和一些事情不加起來。彈性beanstalk奇怪的nginx配置

  • 該實例中打開安全組的80端口,所以我承擔所有傳入流量通過該端口

  • 貓/etc/nginx/conf.d/00_elastic_beanstalk_proxy 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; 
    } 
    gzip on; 
    } 
    

    端口8080?那個是從哪裏來的?我試圖弄亂它,這是正在工作的實際指令。

  • server_name丟失,但不關心你放在裏面。如果我自己在server_name中添加任何值,則此服務器規則仍將匹配所有請求,即使是那些不能遠程訪問server_name值的請求。

  • 在連接到該實例本身似乎兩個端口都被服務:

    [EC2用戶@ 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?有什麼想法發生在這裏?

回答

31

你忘了看那個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。

希望有幫助。

+1

但是nginx以root身份運行,並且所有的nginx例子總是在配置中有80個,這就是爲什麼我很困惑,關於beanstalk環境有什麼特別之處。 – 2014-09-27 16:53:09

+0

當然,並不是所有* nginx的配置都在80端口上運行。使用端口80編寫教程要比使用iptable過濾器在不同端口上運行它要簡單得多。 Elastic Beanstalk沒有什麼特別之處,它只是選擇了什麼。 – 2014-09-27 17:20:46

+0

這是對nodejs應用程序的ElasticBeanstalk nginx設置的一個很好的解釋,特別是最後的iptables步驟。 – Jessedc 2016-02-22 04:46:23