Running Rails3 con force_ssl = true, con nginx, su AWS EC2 con SSL terminato da un ELB, impostando il controllo di salute

Voglio eseguire l'intera applicazione Rails con SSL, quindi ho pensato di utilizzare l'opzione di configuration globale di forza_ssl Rails, che funziona ottimamente, tranne che l'analist di ELB non functionrà mai perché se l'ho impostato su http, Rails inoltra a https con un 301 e il controllo di salute non riesce perché non è 200. Se l'ho impostato su https, nginx / rail non sarà in grado di gestire la richiesta, dato che SSL è gestito dall'ELB e nginx / rail è in grado di gestire solo HTTP.

La mia soluzione non ideale sarebbe quella di fare un'exception alla global force_ssl solo per la pagina di controllo della salute, ma global force_ssl configuration global force_ssl Rails sempre sovrascrive la force_ssl :except => :health_check modo che non sembra funzionare.

  • Applicatore di bilanciamento del carico per la segmentazione del servizio utilizzando i sottodomini
  • Errore di libreria SSL: -8181 Il certificato è scaduto
  • HTTPS utilizza TCP o UDP?
  • Come generare nuovi parametri Diffie-Hellman da 2048 bit con il keytool Java?
  • Come determinare quale libreria SSL utilizza MySQL?
  • Database MySQL più grande di 1 TB su Amazon
  • Un'altra soluzione sarebbe quella di non utilizzare ELB per la terminazione SSL e impostare HAProxy o così, ma voglio utilizzare l'infrastruttura Amazon per quanto ansible per le cose, per concentrarsi maggiormente sullo sviluppo di base del progetto anziché sull'infrastruttura.

    Questo è il mio primo post serverfault, quindi apprezzo qualsiasi aiuto che posso get (o più informazioni che posso dare). Grazie.

    Aggiornare:

    Finora ho "risolto" questo avendo l'ELB accedere all'istanza EC2 su una port diversa da 80 che solo che può accedere, che si sente estremo, ma mantiene una separazione tra l'applicazione e gli strati server. Se la richiesta healthcheck viene dall'ELB da questa port, nginx inoltra l'intestazione X-Forwarded-Proto impostata su 'https' che permetterà a Rack di pensare che sia venuto oltre SSL e lasciarlo passare. Per tutti gli altri traffico che arrivano attraverso la port standard 80, inoltra solo l'intestazione X-Forwarded-Proto fornita dall'ELB, che segnalerà con precisione ciò che utilizza l'utente esterno e che Rails decide di forzare https o less a seconda.

    Ancora in attesa di una soluzione più pulita, ma questo è ciò che ho.

    4 Solutions collect form web for “Running Rails3 con force_ssl = true, con nginx, su AWS EC2 con SSL terminato da un ELB, impostando il controllo di salute”

    6 mesi dopo, ecco la tua soluzione più pulita.

     # config/environments/production.rb config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/health_check') } } 

    Va notato che l'opzione di esclusione di config.ssl_options è ormai obsoleta e devi utilizzare il gem rack-ssl per get lo stesso comportmento .

    Non mi sembrava una buona idea per includere e inizializzare un nuovo middleware rack solo per il controllo della salute, quindi ho deciso di utilizzare nginx invece di impostare l'intestazione $ http_x_forwarded_proto per il checker di salute.

    Ecco cosa sono venuto con:

     location @unicorn { if ($http_user_agent ~ "ELB-HealthChecker") { set $http_x_forwarded_proto https; } proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://unicorn; } 

    Ora i binari vedono le richieste di Health Checker come https (anche se non lo sono) e restituisce il successo.

    f non import se il tuo controllo di salute colpisce l'applicazione Rails (probabilmente dovresti …), puoi indicarlo in un file statico, come /robots.txt e utilizzare HTTP / 80 invece di HTTPS / 443. Nginx servirà il file statico senza coinvolgere mai Rails.

    Non che lo consiglio veramente a lungo termine, ma se stai lottando per get qualcosa per venire attraverso attraverso il tuo ELB, questo aiuterà a risolvere i problemi.

    Dopo giorni di wrestling con config, ecc ho trovato questo grande gioiello:

    https://github.com/lserman/aws-healthcheck

    Non c'è bisogno di alcuna configuration personalizzata di nginx (funziona tramite rack). Restituisce 200 on / healthcheck che funziona come un fascino. Basta aggiungere al tuo gemme e sei finito.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.