เปลี่ยนเส้นทางคำขอ HTTP ทั้งหมดที่อยู่เบื้องหลัง Amazon ELB เป็น https โดยไม่ต้องใช้หาก


27

ขณะนี้ฉันมี ELB ให้บริการทั้งhttp://www.example.orgและhttps://www.example.org

ผมอยากจะตั้งขึ้นเพื่อชี้คำขอใด ๆ ที่จะhttp://www.example.orgคือการเปลี่ยนเส้นทางไปhttps://www.example.org

ELB ส่งคำขอ https เป็นคำขอ http ดังนั้นการใช้:

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

จะไม่ทำงานเนื่องจากคำขอที่ส่งไปยังhttps://www.example.orgจะยังคงถูกส่งไปยังพอร์ต 80 บน nginx

ฉันรู้ว่าเป็นไปได้ที่จะเขียนใหม่เป็น

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

แต่ทุกสิ่งที่ฉันได้อ่านบอกว่าifควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมดภายในการกำหนดค่า nginx และนี่จะเป็นสำหรับทุกคำขอเดียว นอกจากนี้ยังหมายความว่าฉันต้องตั้งค่าการแยกต่างหากเป็นพิเศษสำหรับการตรวจสุขภาพ ( ดังที่อธิบายไว้ที่นี่ : "... เมื่อคุณอยู่หลัง ELB โดยที่ ELB ทำหน้าที่เป็นจุดสิ้นสุด HTTPS และส่งทราฟฟิก HTTP ไปยังเซิร์ฟเวอร์ของคุณเท่านั้น ทำลายความสามารถในการตอบสนองด้วยการตอบสนอง HTTP 200 OK สำหรับการตรวจสุขภาพที่ ELB ต้องการ ")

ฉันกำลังพิจารณาที่จะทำการล็อกอินในรหัสของเว็บแอปพลิเคชันมากกว่าการกำหนดค่า nginx (และสำหรับวัตถุประสงค์ของคำถามนี้สมมติว่ามันเป็นแอพพลิเคชั่นที่ใช้ Django) แต่ฉันไม่แน่ใจว่ามันจะเหนือกว่าif ในการกำหนดค่า


สวัสดีคุณช่วยบอกฉันหน่อยได้ไหมว่าคุณใส่รหัสเหล่านี้อยู่ที่ไหน
YuAn Shaolin Maculelê Lai

@ YuAnShaolinMaculelêLaiแน่นอน นี่คือไฟล์กำหนดค่าสำหรับ nginx ดังนั้นฉันแค่ใส่รหัสในไฟล์ใน /etc/nginx/conf.d/ ฉันมักจะตั้งชื่อไฟล์ domainname.conf โดยที่ "domainname" เป็นโดเมนของเว็บไซต์ที่เป็นปัญหา คุณสามารถตั้งชื่อไฟล์ตามที่คุณต้องการตราบใดที่ลงท้ายด้วย. conf
Jordan Reiter

ขอบคุณมาก. ฉันพยายามสร้างไฟล์ใหม่ตามด้วย. conf แต่มันไม่ได้ผลสำหรับฉัน จากนั้นฉันก็ใส่รหัสในไฟล์ที่สร้างขึ้นจาก AWS ใน /etc/nginx/conf.d/ มันใช้งานได้แล้ว
YuAn Shaolin Maculelê Lai

คำตอบ:


9

หากมันทำงานอย่างถูกต้องอย่ากลัวมัน http://wiki.nginx.org/IfIsEvil

มันเป็นสิ่งสำคัญที่จะต้องทราบว่าพฤติกรรมของถ้าไม่สอดคล้องกันที่ได้รับคำขอสองเหมือนกันมันจะไม่สุ่มล้มเหลวในการทำงานและที่อื่น ๆที่มีการทดสอบที่เหมาะสมและ IFS ความเข้าใจสามารถนำมาใช้ คำแนะนำในการใช้คำสั่งอื่น ๆ ที่มีให้ใช้ยังคงมีอยู่มาก


หน้านี้ยังกล่าวว่า "หากมีปัญหาเมื่อใช้ในบริบทสถานที่" มันดูเหมือนว่าฉันที่คุณสามารถทำสิ่งที่คุณจำเป็นต้องทำนอกlocation {}ในserver {}แทน (แต่โปรดแจ้งให้เราทราบหากนี่ไม่ถูกต้อง!)
Excalibur

15
  1. ตั้งค่าการแมป AWS ELB ของคุณ ELB: 80 เป็นอินสแตนซ์: 80 และ ELB: 443 เป็นอินสแตนซ์: 1443
  2. ผูก nginx เพื่อฟังบนพอร์ต 80 และ 1443
  3. ส่งต่อคำขอที่มาถึงที่พอร์ต 80 ถึงพอร์ต 443
  4. การตรวจสุขภาพควรเป็น HTTP: 1443 มันปฏิเสธ HTTP: 80 เพราะการเปลี่ยนเส้นทาง 301

aws elb setup

การตั้งค่า NGINX

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

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

สิ่งที่เกี่ยวกับการตั้งค่าการตรวจสุขภาพ? คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้ด้วยได้ไหม
samkhan13

สิ่งนี้ไม่ทำงานกับการตรวจสอบ helth ที่ตั้งค่าเป็น http: 80 การตรวจสุขภาพไม่สำเร็จ
samkhan13

2
HTTP:1443การตรวจสุขภาพที่ควรจะเป็น มันปฏิเสธHTTP:80เนื่องจากการเปลี่ยนเส้นทาง 301
cbron

ส่วนใหญ่ใช้งานได้สำหรับฉัน แต่บรรทัดการเขียนไม่ทำงานกับโดเมนไวด์การ์ดของฉัน โพสต์อื่น ๆ นี้แก้ไขส่วนนั้น: serverfault.com/questions/447258/…
Ron

9

วิธีนี้ใช้ตรรกะตามเงื่อนไข แต่เป็นคำตอบที่ได้รับการยอมรับฉันก็คิดว่ามันก็โอเค Ref: /programming/4833238/nginx-conf-redirect-multiple-conditions

นอกจากนี้ไม่จำเป็นต้องเปิดพอร์ตเพิ่มเติมใด ๆ ในการตั้งค่าความปลอดภัย aws สำหรับภาพ คุณสามารถยกเลิก ssl ใน AWS LB และกำหนดเส้นทางการรับส่งข้อมูล https ไปยัง http พอร์ต 80 ในอินสแตนซ์ของคุณ

ในตัวอย่างนี้การตรวจสุขภาพ LB ฮิต / สุขภาพในพอร์ต 80 ซึ่งกำหนดเส้นทางไปยังเซิร์ฟเวอร์แอปดังนั้นการตรวจสอบสุขภาพจะตรวจสอบความถูกต้องทั้ง nginx และแอปของคุณกำลังหายใจ

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
จะต้องมีวิธีที่สง่างามกว่านี้ในการทำเช่นนี้
Edward

0

ตอนนี้คุณสามารถสร้าง Listener ใหม่ในการตั้งค่า AWS Load Balancer ซึ่งเปลี่ยนเส้นทาง HTTP พอร์ต 80 ไปยัง HTTPS พอร์ต 443 ดังนั้นคุณไม่จำเป็นต้องแตะการกำหนดค่า nginx / apache อีกต่อไป


น่าเสียดายที่ยังไม่ได้รับการสนับสนุนใน Cloudformation
Aryeh Leib Taurog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.