2014-09-27 14 views
12

Sto provando a seguire la configurazione di nginx su beanstalk elastico e alcune cose non si sommano.configurazione bean nanch elastico strana nginx

  • L'istanza si sta aprendo la porta 80 nei gruppi di protezione, in modo da assumere tutto il traffico in entrata è in arrivo attraverso quella porta

  • La configurazione nginx in /etc/nginx/conf.d/00_elastic_beanstalk_proxy cat. conf dichiara:

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

    Porta 8080? Da dove viene? Ho provato a scherzare, questa è la direttiva attuale che funziona.

  • server_name è mancante, tuttavia non importa ciò che viene inserito. Se metto da solo qualsiasi valore in nome_server, questa regola server corrisponderà comunque a tutte le richieste, anche a quelle che non riescono a rimappare il valore nome_server da remoto.

  • Durante il collegamento al istanza stessa sembra entrambe le porte sono serviti:

    [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

ancora una volta, 8080 non è mai aperto in questi gruppo di cura, quindi carico di carico elastico entra all'interno della porta 80. Il traffico passa magicamente da 80 a 8080? Qualche idea su cosa sta succedendo qui?

risposta

31

Stai dimenticando di guardare una parte di quel config nginx:

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

Quella parte sta dicendo nginx per fare un gruppo di server chiamati nodejs, come si può leggere su here.

8081 è la porta su cui è in esecuzione NodeJS (se per esempio si utilizza sample application).

È possibile verificare questo guardando i log Elastic Beanstalk:

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

Poi se continuiamo nel file nginx.conf possiamo vedere quello che già postato:

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


} 

Questo dice nginx per utilizzare lo proxy pass module per passare tutto dalla porta 8080 al nostro gruppo upstream nodejs che è in esecuzione sulla porta 8081. Ciò significa che la porta 8081 serve solo per accedervi localmente ma la porta 8080 è quella che lasciamo le entità esterne a parlare con nginx che poi passa roba su nodejs.

Alcuni dei motivi per non esporre direttamente NodeJS sono disponibili in this StackOverflow answer.

La porta 8080 viene utilizzata poiché è la "HTTP alternate port" comunemente utilizzata per il server proxy Web e di memorizzazione nella cache o per l'esecuzione di un server Web come utente non root."

che spiega le porte. Ora la questione di ELB e come le cose stanno parlando tra loro.

Dal momento che il gruppo di protezione sta permettendo l'accesso solo sulla porta 80, v'è una regola di iptables che è configurato per inoltrare la porta 80 per la porta 8080. in questo modo non-root a collegarsi alla porta 8080, perché i numeri di porta inferiori richiedono i privilegi di root

lo si può verificare eseguendo il seguente:.

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

Quindi, in sintesi, quando si carica il tuo CNAME, il bilanciamento del carico er sta reindirizzando il traffico verso una determinata istanza sulla porta 80, che è consentita attraverso il gruppo di sicurezza, quindi iptables lo sta inoltrando alla porta 8080, che è la porta che nginx sta usando un proxy per passare il traffico alla porta 8081 che è il porto locale di NodeJS.

Speriamo che questo aiuti.

+1

ma nginx è in esecuzione come root e tutti gli esempi di nginx hanno sempre 80 in configs, questo è il motivo per cui ero confuso, cosa è speciale per l'ambiente beanstalk. –

+0

Beh, certamente non * tutte * le configurazioni di nginx sono in esecuzione sulla porta 80. È un po 'più semplice scrivere un tutorial usando la porta 80 piuttosto che eseguirlo su una porta diversa con un filtro iptable. Non c'è niente di speciale su Elastic Beanstalk, è proprio quello che è stato scelto. –

+0

Questa è un'eccellente spiegazione della configurazione di nginx di ElasticBalk per le app di nodejs, in particolare per il passaggio finale di iptables. – Jessedc

Problemi correlati