سؤال nginx HTTPS يعمل بنفس الإعدادات مثل HTTP


هل هناك طريقة لمشاركة توجيهات التهيئة عبر اثنين من nginx server {} كتل؟ أرغب في تجنب تكرار القواعد ، حيث يتم تقديم محتوى HTTPS و HTTP لموقعي باستخدام نفس التكوين بالضبط.

حاليا ، هو مثل هذا:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

هل يمكنني فعل شيء على غرار ما يلي:

server {
  listen 80, 443;
  ...

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

174
2018-05-21 16:18


الأصل




الأجوبة:


يمكنك دمج هذا في كتلة خادم واحدة مثل:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

كيف الرسمية


238
2018-05-21 18:54



آه ، لم يكن لدي أي فكرة nginx كان ذكيا بما فيه الكفاية لتجاهل توجيهات SSL إذا تم تحميلها عبر منفذ 80. رائع! - ceejayoz
nginx هو كل أنواع WIN. - Jauder Ho
وإذا كان لديك عدة مواقع في خادم واحد ، فمن الجدير بالذكر أن "الافتراضي" ليس إلزامياً - luchaninov
أنيق جدا يؤلمك ... - Alix Axel
لا تعمل هنا ... "تم إرسال طلب HTTP العادي إلى منفذ HTTPS" - gcstr


لتوضيح الإجابة المقبولة ، يجب حذفها

SSL on;

وتحتاج فقط إلى إصدار nginx التالي بعد 0.8.21

listen 443 ssl;

مرجع:

Nginx Docs - تكوين خادم HTTP / HTTPS واحد


81
2018-06-13 06:19



شكرا لكم! لم أتمكن من معرفة سبب عمل أي شيء على http. إزالة SSL على ؛ عمل. - Chris Cummings


لا أعرف طريقة مثلما تقترح ، ولكن هناك طريقة سهلة وسهلة الصيانة.

نقل إعدادات الخادم الشائعة إلى ملف منفصل ، أي "serverFoo.conf" ثم include في فصل server {} كتل مثل ذلك:

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

26
2018-05-21 18:38



+1 = يعمل لي. (لا يمكن الحصول عليها للعمل مع الطريقة الأخرى.) - lackey
أيضا ، المثال الآخر لا يمثل "proxy_pass" إذا كان بمثابة موازن التحميل. - Mike Purcell
هذا الخيار رائع إذا كان لديك server_name يختلف لكل منفذ - iDev247
لا تستخدم SSL ، استخدم listen 443 ssl; من الآن واحدة. - danger89
يبدو أن هذا هو الحل الوحيد الذي يعمل مع nginx 1.10.1. لسبب ما اثنين listen لا يتم تفسير الخطوط بشكل صحيح ، ولكن نقلها للفصل server{} يصلحها. - Artur Bodera


بالتوسع في الإجابات المفيدة بالفعل ، إليك مثال أكثر اكتمالاً:

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;
}

7
2018-05-10 17:48



أعلم أن هذه إجابة قديمة جدًا ، ولكن نظرًا لأنها كاملة جدًا ، أردت فقط أن أشير إلى الآخرين الذين قد يستخدمونها فيجب تعطيل بروتوكول SSLv3 باعتباره عرضة لضعف الثغرات في POODLE: disablessl3.com  بدلا من استخدام: ssl_protocols TLSv1 TLSv1.1 TLSv1.2؛ - user147787


فقط للإضافة إلى مشاركة Igor / Jauder ، إذا كنت تستمع إلى عنوان IP محدد ، فيمكنك استخدام:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;

4
2018-02-25 13:11