2014-09-27 7 views
12

Ich versuche, die Konfiguration von Nginx auf elastischen Bohnenstange folgen und einige Dinge nicht summieren.elastische Bohnenstange seltsame nginx Konfiguration

  • Die Instanz öffnet den Port 80 in den Sicherheitsgruppen, so nehme ich an alle eingehenden Datenverkehr

  • Die nginx Konfiguration in Katze /etc/nginx/conf.d/00_elastic_beanstalk_proxy über diesen Port kommt. conf states:

    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; 
    } 
    

    Port 8080? Woher kommt das? Ich habe versucht, damit umzugehen, das ist die eigentliche Richtlinie, die funktioniert.

  • server_name fehlt, aber es ist egal, was Sie hineinlegen. Wenn ich selbst einen Wert in server_name hinterlasse, werden mit dieser Serverregel immer noch alle Anforderungen abgeglichen, auch diejenigen, die nicht remote den Wert von server_name erneut übertragen.

  • Während der Verbindung mit der Instanz selbst scheint es, beide Ports bedient werden:

    [EC2-user @ ip-172-31-45-222 ~] $ sudo netstat -lnptu

    tcp 0 0.0.0.0:8080 0 0.0.0.0:* LISTEN 22506/nginx

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22506/nginx

wieder Doch 8080 nie geöffnet in diesen Curity-Gruppe, so elastische Last ausgeglichen wird durch Port 80. Kommt Verkehr magisch von 80 bis 8080? Irgendwelche Ideen, was hier vor sich geht?

Antwort

31

Sie vergessen an einem Teil dieser nginx config aussehen:

upstream nodejs { 
    server 127.0.0.1:8081; 
    keepalive 256; 
} 

Dieser Teil nginx sagt eine Gruppe von Servern nodejs wie man lesen kann here etwa genannt zu machen.

8081 ist der Port, auf dem NodeJS ausgeführt wird (wenn Sie beispielsweise sample application verwenden).

Sie können dies überprüfen zu den Elastic Beanstalk-Protokolle von der Suche:

------------------------------------- 
/var/log/nodejs/nodejs.log 
------------------------------------- 
Server running at http://127.0.0.1:8081/ 

Dann, wenn wir in der nginx.conf Datei fortsetzen können wir sehen, was Sie bereits gebucht:

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; 
    } 


} 

Dies sagt nginx verwendet die proxy pass module, um alle von Port 8080 an unsere Upstream-Gruppe nodejs zu übergeben, die auf Port 8081 läuft. Dies bedeutet, dass Port 8081 nur für den lokalen Zugriff dient, aber Port 8080 ist, was externe Entitäten mit dem nginx sprechen lässt Stuff auf Nodejs.

Einige der Gründe dafür, NodeJS nicht direkt verfügbar zu machen, finden Sie in this StackOverflow answer.

Port 8080 wird verwendet, da es die ist, die "häufig für Web-Proxy- und Caching-Server oder zum Ausführen eines Webservers als Nicht-Root-Benutzer verwendet wird."

, dass die Ports erklärt. Nun ist die Frage der ELB und wie die Dinge miteinander zu reden.

Da die Sicherheitsgruppe nur den Zugriff auf Port erlaubt ist 80, gibt es eine iptables-Regel, die Einrichtung ist weiterleiten 80-Port zu Port 8080. Dies ermöglicht nicht-root-Port 8080 zu binden, weil niedrigere Portnummern root-Rechte erfordern

Sie dies, indem Sie überprüfen können, die folgenden:.

[[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   

Also zusammenfassend, wenn Sie Laden Sie Ihren CNAME, den Load Balanc er wird Umleitung um den Verkehr zu einem gegebenen Fall auf dem Port 80, die durch die Sicherheitsgruppe erlaubt ist, dann iptables weiterleitet, dass auf Port 8080, die den Hafen ist, die nginx ist ein Proxy unter Verwendung des Datenverkehr an Port 8081 passieren welches das lokaler Hafen von NodeJS.

Hoffentlich hilft.

+1

aber nginx als root ausgeführt wird, und alle nginx Beispiele haben immer 80 in configs, das ist, warum ich war verwirrt, was ist das Besondere an Bohnenstengel Umgebung. –

+0

Nun sicher nicht * alle * Konfigurationen von nginx laufen auf Port 80. Es ist ein gutes Stück einfacher, ein Tutorial zu schreiben, über Port 80, als es mit einem iptable Filter auf einem anderen Port zu laufen. Es gibt nichts besonderes an Elastic Beanstalk, es ist genau das, was gewählt wurde. –

+0

Dies ist eine hervorragende Erklärung des ElasticBeanstalk nginx-Setups für nodejs-Apps, insbesondere den letzten iptables-Schritt. – Jessedc

Verwandte Themen