Amazon ELB’in arkasındaki tüm http isteklerini eğer kullanmadan https’ye yeniden yönlendir


27

Şu anda bir ELB hem hizmet veren pek http://www.example.org ve https://www.example.org .

Bunu kurmak istiyorum, böylece http://www.example.org adresine yapılan herhangi bir istek https://www.example.org adresine yönlendirilir .

ELB, https isteklerini http istekleri olarak gönderir, böylece:

server {
      listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
}

çalışmayacak çünkü https://www.example.org adresine yapılan istekler nginx'de 80 numaralı limana yapılacak.

Olarak yeniden yazmanın mümkün olduğunu biliyorum.

server {
      listen         80;
      server_name    www.example.org;
      if ($http_x_forwarded_proto != "https") {
          rewrite ^(.*)$ https://$server_name$1 permanent;
      }
}

Ancak okuduğum her şey ifnginx konfigürasyonundaki tüm masraflardan kaçınılması gerektiğini söyledi ve bu her bir istek için geçerli olacaktı. Ayrıca, sağlık kontrolü için özel bir ayrı konfigürasyon kurmam gerektiği anlamına gelir ( burada açıklandığı gibi : "… bir ELB'nin arkasındayken, ELB'nin HTTPS bitiş noktası olarak davrandığı ve yalnızca sunucunuza HTTP trafiği gönderdiği zaman, ELB'nin ihtiyaç duyduğu sağlık kontrolü için bir HTTP 200 OK cevabı ile cevap verme kabiliyetini kırmak ").

Giriş bilgisini nginx yapılandırması yerine web uygulamasının koduna koymayı düşünüyorum (ve bu sorunun amaçları için bunun Django tabanlı bir uygulama olduğunu varsayalım), ancak bunun genel giderlerden daha fazla olup olmayacağından emin değilim. if yapılandırma.


Merhaba, lütfen bana bu kodu nereye koyduğunuzu söyleyebilir misiniz?
YuAn Shaolin Maculelê Lai

@ YuAnShaolinMaculelêLai Tabii. Bunlar nginx için yapılandırma dosyaları, bu yüzden kodu sadece /etc/nginx/conf.d/ içindeki bir dosyaya koydum. Ben genellikle domainname.conf dosyasını adlandırırım, burada "domainname" söz konusu web sitesinin alanıdır. Dosyayı, ne olursa olsun, .conf ile bittiği sürece adlandırabilirsiniz.
Jordan Reiter,

Çok teşekkür ederim. .Conf tarafından takip edilen yeni bir dosya oluşturmayı denedim. Ama benim için işe yaramadı. Sonra kodu /etc/nginx/conf.d/ adresindeki AWS'den oluşturulan dosyaya koydum. Şuan çalışıyor.
YuAn Shaolin Maculelê Lai

Yanıtlar:


9

Eğer böyle düzgün çalışıyorsa, ondan korkma. http://wiki.nginx.org/IfIsEvil

Davranışının tutarsız olmadığı, iki özdeş istek verildiğinde, bir tanesinde rastgele başarısız olmayacağı ve diğerinde çalışmadığı, uygun sınama ve kullanılıp kullanılamayacağına dikkat etmek önemlidir . Yine de mevcutsa diğer direktifleri kullanma önerileri hala çok geçerlidir.


Bu sayfa ayrıca "konum bağlamında kullanıldığında sorun varsa" diyor. Bana öyle geliyor ki location {}, server {}bunun yerine dışarıda yapmanız gerekenleri yapabilirsiniz . (Ama bunun yanlış olup olmadığını bana bildirin!)
Excalibur

15
  1. AWS ELB eşleştirme ELB: 80'i örnek: 80'i ve ELB: 443'ü örnek: 1443'ü ayarlayın.
  2. 80 ve 1443 no'lu bağlantı noktasını dinlemek için nginx'i bağlayın.
  3. 80 numaralı bağlantı noktasına gelen isteklerin 443 numaralı bağlantı noktasına iletilmesi.
  4. Sağlık kontrolü HTTP: 1443 olmalıdır. 301 yönlendirdiği için HTTP: 80'i reddediyor.

aws dir kurulumu

NGINX Kurulumu

    server {
       listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
    }

    server {
       listen         1443;
       server_name    www.example.org;
   } 

Peki sağlık kontrolü ayarları? Lütfen bunu da detaylandırabilir misiniz?
samkhan13

Bu, http: 80 olarak ayarlanan ve herhangi bir sağlık kontrolünün başarısız olmasıyla işe yaramadı.
samkhan13

2
Sağlık kontrolü yapılmalı HTTP:1443. HTTP:80301 yönlendirmesi nedeniyle reddediyor .
cbron

bu çoğunlukla benim için işe yaradı ancak yeniden yazma çizgisi joker karakter alanımla çalışmadı. Bu diğer gönderi bu bölümü düzeltti: serverfault.com/questions/447258/…
Ron

9

Bu çözüm şartlı mantık kullanır, ancak kabul edilen cevabın önerdiği gibi, bunun da iyi olduğunu düşünüyorum. Ref: https://stackoverflow.com/questions/4833238/nginx-conf-redirect-multiple-conditions

Ayrıca, görüntü için aws güvenlik ayarlarında herhangi bir ek bağlantı noktası açılması gerekmez. SSL’yi AWS LB’de sonlandırabilir ve https trafiğini örneğinizdeki http portu 80’e yönlendirebilirsiniz.

Bu örnekte, LB sağlık kontrolü, uygulama sunucusuna yönlendiren 80 numaralı bağlantı noktasında isabet / sağlığı etkiler, böylece sağlık kontrolü hem nginx'i hem de uygulamanızın nefes aldığını doğrular.

server {
  listen 80 default deferred;

  set $redirect_to_https 0;
  if ($http_x_forwarded_proto != 'https') {
    set $redirect_to_https 1;
  }
  if ($request_uri = '/health') {
    set $redirect_to_https 0;
  }
  if ($redirect_to_https = 1) {
    rewrite ^ https://www.example.com$request_uri? permanent;
  }
  ...
}

1
Bunu yapmanın daha zarif bir yolu olmalı
Edward

0

Artık HTTP Port 80'i HTTPS Port 443'e yönlendiren AWS Yük Dengeleyici Ayarlarında yeni bir Dinleyici oluşturabilirsiniz. Böylece artık nginx / apache config'e dokunmanıza gerek kalmaz.


ne yazık ki, henüz Bulutformasyonda desteklenmiyor
Aryeh Leib Taurog
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.