EC2 Elastic Load Balancer'ı HTTP'den HTTPS'ye Yönlendirme


104

Ben Talep https'ye tüm HTTP isteğini yönlendirmek istiyorum ELB . İki EC2 bulut sunucum var. Sunucu için nginx kullanıyorum. Herhangi bir başarı olmadan nginx conf dosyalarını yeniden yazmayı denedim. Bu konuda bazı tavsiyelerde bulunmak isterim.


1
Görünüşe göre İnternet bu soruna tek, eksiksiz ve çalışan bir çözüm üzerinde anlaşamıyor. Umarım buradaki yazımda biraz yardım alabilirsiniz . Sonunda bunu bulmak için çemberlerden atlamak zorunda kaldım.
ADTC

1
Bu ans , kabul edilen
yanıtlayıcı

Yanıtlar:


88

AWS Application Load Balancer'lar artık yerel HTTP'den HTTPS'ye yönlendirmeyi destekliyor.

Bunu konsolda etkinleştirmek için aşağıdakileri yapın:

  1. EC2'de Yük Dengeleyicinize gidin ve "Dinleyiciler" sekmesine gidin
  2. HTTP dinleyicinizde "Kuralları görüntüle / düzenle" yi seçin
  3. Varsayılan olan (alt) dışındaki tüm kuralları sil
  4. Varsayılan kuralı düzenleyin: eylem olarak "Yönlendir" i seçin, her şeyi varsayılan olarak bırakın ve bağlantı noktası olarak "443" girin.

Yerel yönlendirme dinleyici kuralı

Aynısı, burada açıklandığı gibi CLI kullanılarak da elde edilebilir .

Bunu, aşağıdaki gibi bir Dinleyici nesnesi kurmanız gereken Cloudformation'da da yapmak mümkündür:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

Hala Klasik Yük Dengeleyicileri kullanıyorsanız, diğerleri tarafından açıklanan NGINX yapılandırmalarından biriyle gidin.


1
Şimdi daha kolay olduğunu bilmek çok yararlı. Ancak bu, yalnızca bir bağlantı yerine neyin yapılandırılacağı hakkında daha fazla bilgi içeren daha iyi bir yanıt olacaktır.
John Rees

1
@JohnRees Bu yardımcı olur umarım, buna göre cevap düzenlenebilir
Ulli

Güzel. Seni sıfıra indirmen için oy verdim. Daha fazlasını hak ediyorsun.
John Rees

2
@florian bir Classic Load Balancer kullanıyor görünüyorsunuz. Bu seçeneği elde etmek için Application Load Balancer'a geçin
Ulli

Application Load Balancer'ı örneğime nasıl atarım? ( instancessekme olmadığı için )
Florian

107

ELB X-Forwarded-Protoüstbilgiyi ayarlar , orijinal isteğin HTTP için olup olmadığını algılamak ve daha sonra HTTPS'ye yönlendirmek için kullanabilirsiniz.

Bunu serverconf'inizde deneyebilirsiniz :

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

ELB belgelerine bir göz atın .


3
Bu konfigürasyon nerede yapılır?
ericpeters0n

2
@ ericpeters0n yanıttaki pasaj nginxyapılandırma içindir, ancak ilke herhangi bir web sunucusu için geçerlidir.
Dmitry Mukhin

1
Yolcu bağımsız olarak beanstalk kullanıyorsanız, nginx yapılandırmasının nasıl değiştirileceğini öğrenmek için bu bağlantıyı izleyin. qiita.com/tak_nishida/items/cf30a2d373744943b943
Yeonho

3
Yük dengeleyicinizde HTTP ve HTTPS dinleyicilerinizin olduğundan emin olun.
Gavin Palmer

1
@Ronald, yanıtta sunucu conf tarafından ELB arkasında çalışan ec2 örneklerinde nginx sunucusunu kastediyorum.
Dmitry Mukhin

34

Aynı sorunu yaşadım, benim durumumda HTTPS tamamen ELB tarafından ele alındı ​​ve kaynak alanımı önceden bilmiyordum, bu yüzden şöyle bir şey yaptım:

server {
  listen 81;
  return 301 https://$host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

Ve sonra elbette ELB "https" yi 80 nolu bulut sunucusu portuna ve sonra 81 nolu bulut sunucusu portuna 'http' yolunu işaret edin.


3
Bu dahice.
Andy Hayden

2
@CodyBugstein, eğer varsa nginx yapılandırması
timurso

@timurso eğer varsa ne?
CodyBugstein

@CodyBugstein, uygulamanızın önünde nginx varsa (örneğin, yok - doğrudan
ExpressJS

Nginx nereye gider? ELB'nin içinde mi? EC2'nin içinde mi? Bu, Elastic Beanstalk'ta bir yerde yapılandırılmış mı?
CodyBugstein

16

Amazon Elastic Load Balancer (ELB), X-FORWARDED-PROTO adlı bir HTTP üst bilgisini destekler. ELB'den geçen tüm HTTPS istekleri, "HTTPS" ye eşit X-FORWARDED-PROTO değerine sahip olacaktır. HTTP istekleri için, aşağıdaki basit yeniden yazma kuralı ekleyerek HTTPS'yi zorlayabilirsiniz. Benim için iyi çalışıyor!

Apaçi

.Htaccess dosyanıza aşağıdaki satırları ekleyebilirsiniz:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

Veya aynı EC2 web sunucusunda birden fazla etki alanını yönetmek için vhost.conf kullanıyorsanız, vhost.conf'a aşağıdakileri ekleyebilirsiniz (bunun için https kullanmak istediğiniz etki alanına ekleyin):

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

IIS

IIS Url-Rewrite modülünü kurun, GUI konfigürasyonunu kullanarak şu ayarları ekleyin:

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>

Daha fazlasını buradan okuyun


Üstbilgi bile olmadığı için örneğimizin normal http trafiğini yeniden yönlendirmesi sorunuyla karşılaştık. Şu koşulu yaparak RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
çözüyorum

Bu, sonsuz yeniden yönlendirmelere neden oluyor. Windows sunucusuyla IIS kullanıyorum.
bir tuzak.

@ It'satrap: IIS için işe yaramadıysa, şu URL'deki komut dosyasını deneyin: stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
Iman Sedighi

5

Yukarıdaki htaccess çözümleri ELB sağlık kontrolünün başarısız olmasına neden oldu. Birisinin benimle aynı sorunları yaşadığı bir makaleyi çevrimiçi bulana kadar çözümü bulmakta biraz sorun yaşadım. Onun çözümü, bunu htaccess dosyasının başına eklemekti:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ELB aracılığıyla harici istekleri HTTPS'ye yönlendirirken buna ve HTTP üzerinden diğer yerel isteklere izin vermek için, yeniden yazma koşulunu https'de negatif eşleşme yerine http ile eşleşecek şekilde ayarlayın.

Kaynak: HTTP'yi AWS ve ELB ile HTTPS'ye yeniden yönlendirme


"yeniden yazma koşulunu https ile negatif eşleşme yerine http ile eşleşecek şekilde ayarlayın" düzeltmeye çalıştığım kısım budur. Teşekkür ederim!
Merricat


3

Nginx ve ELB yapılandırmasıyla ilgili garip bir sorun yaşadım. Kurulumum ELB'nin arkasındaki bir nginx içinde 3 farklı hizmet içeriyordu. Ve karışık içerik sorunu yaşadım: ELB'ye isteğiniz https olduğunda, ancak yalnızca ELB http içinde ve sunucu http kullanarak statik için göreli yol oluşturduğunda, tarayıcı 'karışık içerik' sorunuyla başarısız olur. Ve hem http / https çalışması için herhangi bir yönlendirme olmadan çözüm oluşturmalıyım.

nginx/conf.d/Klasörde bulunan yapılandırma :

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

Bu, gerçek müşteri protokolünün ne olduğu bilgisine sahip olacağımız anlamına gelir. Gördüğünüz gibi, $switchvar. Ve şu anda bunu ihtiyacınız olan her yerde kullanıyorsunuz:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

HTTPS ayarıyla php uygulaması doğru protokolü otomatik olarak algılar ve karışık içerik sorununu önlemek için dikkatli bir şekilde göreceli yol oluşturur.

Saygılarımla.


3

@ Ulli'nin cevabına göre Bunu Terraform kullanarak yapılandırmak istiyorsanız , işte bir örnek>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

Kaynak


-2

.ebextensions/00_forward_http_to_https.configAşağıdaki içeriğe sahip bir dosya oluşturun :

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

Önceden AWS yönetim konsolundan APP_URL ortam değişkenini ayarladığınızdan emin olun.


TCP bağlantılarını ELB ile dengelerken bunu nasıl yapabilirim?
patlama

1
Cevabınızın soruya nerede uyduğunu anlamıyorum ... elastik fasulye sapından bahsediyorsunuz ve soru bir EC2 içindeki nginx ile ilgili.
jvarandas
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.