การให้บริการ nginx HTTPS ด้วยการกำหนดค่าเช่นเดียวกับ HTTP


195

มีวิธีการแบ่งปันคำสั่งการกำหนดค่าในสอง nginx server {}block หรือไม่? ฉันต้องการหลีกเลี่ยงการทำซ้ำกฎเนื่องจากเนื้อหา HTTPS และ HTTP ของเว็บไซต์ของฉันถูกแสดงด้วยการกำหนดค่าเดียวกัน

ปัจจุบันเป็นเช่นนี้:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

ฉันสามารถทำบางสิ่งตามแนวของ:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

คำตอบ:


262

คุณสามารถรวมสิ่งนี้ไว้ในบล็อกเซิร์ฟเวอร์เดียวดังนี้:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

อย่างเป็นทางการวิธีการ


6
อ่าฉันไม่รู้ว่า nginx ฉลาดพอที่จะเพิกเฉยต่อคำสั่ง SSL หากโหลดผ่านพอร์ต 80 เยี่ยมมาก!
ceejayoz

72
nginx คือ win ทุกประเภท
Jauder Ho

5
และถ้าคุณมีหลายเว็บไซต์ที่เซิร์ฟเวอร์หนึ่งก็มูลค่าการกล่าวขวัญว่า "เริ่มต้น" จะไม่บังคับ
luchaninov

4
ดังนั้นสง่างามมันเจ็บ ...
อลิกซ์แอ็กเซิล

3
ไม่ทำงานที่นี่ ... "คำขอ HTTP ธรรมดาถูกส่งไปยังพอร์ต HTTPS"
gcstr

87

ในการชี้แจงคำตอบที่ยอมรับคุณต้องละเว้น

SSL on;

และคุณต้องการเพียงสิ่งต่อไปนี้สำหรับรุ่น nginx หลังจาก 0.8.21

listen 443 ssl;

อ้างอิง:

เอกสาร Nginx - การกำหนดค่าเซิร์ฟเวอร์ HTTP / HTTPS เดียว


2
ขอขอบคุณ! ฉันไม่สามารถเข้าใจได้ว่าทำไมไม่มี http ใดทำงานได้ ลบ SSL ใน; ทำงาน
Chris Cummings

27

ฉันไม่รู้วิธีที่คุณแนะนำ แต่ก็มีวิธีที่ง่ายและบำรุงรักษาได้

ย้ายการตั้งค่าเซิร์ฟเวอร์ทั่วไปไปเป็นไฟล์แยกกันคือ "serverFoo.conf" จากนั้นincludeแยกเป็นserver {}บล็อกย่อยดังนี้:

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

2
+1 = ใช้งานได้สำหรับฉัน (ไม่สามารถทำให้การทำงานด้วยวิธีการอื่น ๆ .)

นอกจากนี้ตัวอย่างอื่น ๆ ไม่ได้ใช้คำว่า 'proxy_pass' หากทำหน้าที่เป็น load balancer
Mike Purcell

ตัวเลือกนี้ดีมากหากคุณserver_nameแตกต่างกันไปในแต่ละพอร์ต
iDev247

5
อย่าใช้ ssl เปิดใช้listen 443 ssl;ตั้งแต่นี้ไป
danger89

นี่น่าจะเป็นทางออกเดียวที่ทำงานกับ nginx 1.10.1 ล่าสุด ด้วยเหตุผลบางประการสองlistenบรรทัดจะตีความไม่ถูกต้อง แต่การย้ายไปยังการserver{}แก้ไขแยกต่างหาก
Artur Bodera

9

การขยายคำตอบที่เป็นประโยชน์แล้วนี่คือตัวอย่างที่สมบูรณ์ยิ่งขึ้น:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

2
ฉันรู้ว่านี้เป็นคำตอบที่เก่าสวย แต่มันเป็นที่สมบูรณ์มากฉันแค่อยากจะชี้ให้เห็นสำหรับคนอื่น ๆ ที่อาจจะใช้มันที่คุณควรจะปิดการใช้งานโปรโตคอล SSLv3 เป็นของความเสี่ยงที่จะพุดเดิ้ลช่องโหว่นี้: disablessl3.com แทนที่จะใช้: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787

4

เพียงเพิ่มไปยังโพสต์ของ Igor / Jauder หากคุณกำลังฟัง IP เฉพาะคุณสามารถใช้:

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