2015-08-25 14 views
8

Sono abbastanza bloccato con questa cosa per un paio d'ore. In nessun modo potrei farlo funzionare. Ho provato tutto quello che posso pensare e/o trovato online.X-Forwarded-Proto per Rails dietro nginx dietro ELB

Quindi, la mia applicazione è puntata su ELB (web). ELB ascolta 80 e 443 e invia il traffico a 80 (SSL viene terminato qui) alle istanze membro che è nginx.

Richieste di app proxy Nginx su un altro ELB (app) di fronte a più istanze. Queste istanze eseguono puma.

Tutto funziona bene tranne quando provo a visitare un URL (dove ho usato force_ssl per quel controller) con lo schema https, ottengo un ciclo di reindirizzamento.

Ecco il mio file di configurazione nginx assomigliano

location @{{app_name}} { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_redirect off; 
    proxy_pass http://{{app_name}}; 
    # limit_req zone=one; 
    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 
    } 

(Ovviamente app_name ottiene sostituito da ansible.)

Invece di $scheme, ho cercato hardcoding https e $proxy_add_x_forwarded_proto ma nessuno ha lavorato per me. Ho ancora il ciclo.

Quindi ho iniziato a ispezionare lo env nelle guide e vedo i seguenti valori indipendentemente dall'intestazione che ho impostato in nginx config.

"SERVER_PROTOCOL"=>"HTTP/1.1", 
"HTTP_X_FORWARDED_PROTO"=>"http", 
"rack.url_scheme"=>"http", 

Non sono sicuro di quello che sto facendo male. Qualsiasi aiuto apprezzato! Nota: ho già controllato tutti i thread SO trovati e nessuno ha aiutato!

+0

Ok, ho nuove informazioni.Se proxy le richieste da nginx direttamente a un'istanza piuttosto che tramite l'app ELB, vedo che tutto funziona perfettamente ('" HTTP_X_FORWARDED_PROTO "=>" https ",' in rails). Quindi, significa che ELB sta eliminando quell'intestazione. Potrebbe essere collegato a questo fatto che l'app ELB ascolta 80 e invia a 8080 ed è per questo che aws spoglia quella intestazione? – HungryCoder

risposta

0

Ho trovato una soluzione che funziona (anche se non sono sicuro se è giusto).

ELB Listener Settings

Quindi, se ho configurato il protocollo TCP ascoltatore in 8080: 8080 e utilizzare questo dalle impostazioni a monte di nginx, tutto funziona bene. Ciò significa che le istanze web si connettono a app ELB su TCP 8080. Vedo che X-Forwarded-Proto è passato correttamente.

Ho anche aggiunto ascoltatore a 80 come questo ELB viene utilizzato come origine del CloudFront che si collega a 80.

+1

Solo per la riga corretta per la registrazione è 'proxy_set_header X-Forwarded-Proto $ http_x_forwarded_proto;' – HungryCoder

0

In caso di SSL offload ha senso per comunicare tramite HTTP comune (80) e hanno rotaie config regolati :

config/ambienti/production.rb

config.force_ssl = false 

aiuta ad evitare un loop di reindirizzamento e non usare mai HTTPS internamente tra il bilanciamento del carico e il server Nginx dell'applicazione.

È inoltre menzionati:

dove ho usato force_ssl per tale controller

Utilizzare HTTPS ovunque sul sito web e reindirizzare 80-> 443 sullo strato ELB.

+0

Non c'è alcuna comunicazione SSL tra server proxy e app (è già terminata su ELB). Ma dobbiamo sapere (dall'app) quando l'utente visita un URL https e quando no. Apprezzo il tuo suggerimento e posta ma non sono i nostri casi d'uso e non penso a quello che sto cercando di ottenere quale qualcosa è tecnicamente impossibile! – HungryCoder