2016-11-14 6 views
1

Ich habe eine Rails App mit einem NGINX Reverse Proxy hinter einem AWS ELB. Ich beende SSL auf dem ELB und ich habe NGINX konfiguriert, um jeden HTTP-Versuch zu erzwingen, als HTTPS neu zu schreiben. Dieses Setup funktioniert einwandfrei, aber ich bediene die Site auch über ECS. Da die ELB-Integritätsprüfung auf HTTP-Port 80 erfolgt, schlägt die ELB-Integritätsprüfung fehl und die Instanz wird abgemeldet, wenn sie die Weiterleitung erhält und 301 zurückgibt.NGINX force SSL für alle außer Health-Check-Datei?

Wie richte ich NGINX so ein, dass alle Dateien mit Ausnahme der Integritätsprüfung über HTTPS gesendet werden?

Hier ist mein Server Block von nginx.conf:

server { 
     listen 80; 

     server_name localhost; 

     root /var/www/html; 

     location ~ ^elbcheck\.html$ { 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_redirect off; 
      proxy_pass http://rails_app; 
      break; 
     } 

     location/{ 
      proxy_redirect off; 
      proxy_next_upstream error; 

      if ($http_x_forwarded_proto != "https") { 
      rewrite^https://$host$request_uri? permanent; 
      } 

      try_files $uri $uri/ @proxy; 
     } 

     location ~* \.(jpg|jpeg|svg|png|gif|ico|css|js|eot|woff|woff2|map)$ { 
      proxy_cache APP; 
      proxy_cache_valid 200 1d; 
      proxy_cache_valid 404 5m; 
      proxy_ignore_headers "Cache-Control"; 
      expires 1d; 

      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-Forwarded-Proto https; 
      add_header X-Cache-Status $upstream_cache_status; 

      proxy_pass http://rails_app; 
     } 

     location @proxy { 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-Forwarded-Proto https; 

      proxy_pass http://rails_app; 
     } 
    } 

Antwort

0

eine einfache Antwort gefunden, die bei this post großen gearbeitet. Hier ist das, was @ceejayoz dort vorgeschlagen:

server { 
    location /elb-status { 
    access_log off; 
    return 200; 
    } 
} 

scheint zu funktionieren - ECS hat meinen Dienst nicht beendet aufgrund fehlerhafter Gesundheitskontrollen mehr.

+0

das Problem bei diesem Ansatz ist, dass nginx reagieren Der Health-Check, nicht die App "rails", umgeht also eines der Ziele des Health-Checks: Entfernen von fehlerhaften Instanzen, bei denen der Rails-Server nicht antwortet. Sie haben möglicherweise eine Situation, in der nginx reagiert, aber die Rails-App nicht und Ihre Benutzer werden immer noch zu dieser fehlerhaften Instanz weitergeleitet. – Augusto

0

ich hatte das gleiche Problem und fand diese Antwort irgendwo im Internet (noch mehr die Quelle nicht habe, war es vor einer Weile)

server { 
    listen 80; 

    set $redirect_to_https 0; 
    if ($http_x_forwarded_proto != 'https') { 
     set $redirect_to_https 1; 
    } 

    if ($request_uri = '/status') { 
     set $redirect_to_https 0; 
    } 

    if ($redirect_to_https = 1) { 
     return 301 https://$host$request_uri; 
    } 

    ... 
}