nginx HTTPS HTTP के समान कॉन्फ़िगरेशन के साथ सेवा कर रहा है


194

वहाँ दो nginx server {}ब्लॉक भर में विन्यास निर्देश साझा करने के लिए एक रास्ता है ? मैं नियमों को डुप्लिकेट करने से बचना चाहता हूं, क्योंकि मेरी साइट के 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
आह, मुझे नहीं पता था कि पोर्ट 80 से अधिक लोड होने पर SSL निर्देशों की अनदेखी करने के लिए nginx काफी बुद्धिमान था।
सिजॉयज

72
nginx जीत के सभी प्रकार है।
जौडर हो

5
और यदि आपके पास एक सर्वर पर कई साइटें हैं, तो यह ध्यान देने योग्य है कि "डिफ़ॉल्ट" अनिवार्य नहीं है
luchaninov

4
बहुत खूबसूरत यह दर्द होता है ...
एलिक्स एक्सल

3
यहाँ काम नहीं कर रहा है ... "सादे HTTP अनुरोध को HTTPS पोर्ट पर भेजा गया"
gcstr

87

स्वीकृत उत्तर को स्पष्ट करने के लिए, आपको चूक करने की आवश्यकता है

SSL on;

और आपको बस 0.8.21 के बाद nginx संस्करण के लिए निम्नलिखित की आवश्यकता है

listen 443 ssl;

संदर्भ:

Nginx डॉक्स - एक एकल HTTP / HTTPS सर्वर को कॉन्फ़िगर करना


2
धन्यवाद! मैं यह पता नहीं लगा सका कि http पर कुछ भी काम क्यों नहीं कर रहा था। एसएसएल को हटाने; काम किया।
क्रिस कमिंग्स

26

मुझे इस तरह से पता नहीं है जैसे आप सुझाव देते हैं, लेकिन निश्चित रूप से एक आसान और आसान तरीका है।

एक अलग फ़ाइल में आम सर्वर सेटिंग्स को स्थानांतरित करें, अर्थात "serverFoo.conf" और फिर includeइसे अलग-अलग server {}ब्लॉकों में जैसे:

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

2
+1 = मेरे लिए काम करता है। (अन्य विधि के साथ काम करने के लिए इसे प्राप्त नहीं किया जा सका।)

साथ ही, लोड बैलेंसर के रूप में अभिनय करने पर दूसरा उदाहरण 'प्रॉक्सी_पास' का नहीं है।
मिक पुरसेल

यह विकल्प बहुत अच्छा है यदि आपका server_nameप्रत्येक पोर्ट के लिए अलग है
iDev247

5
पर ssl का उपयोग न करें, listen 443 ssl;अब से उपयोग करें ।
खतरा

यह एकमात्र समाधान प्रतीत होता है जो हाल ही में nginx 1.10.1 के साथ काम कर रहा है। किसी कारण से दो listenपंक्तियों की सही ढंग से व्याख्या नहीं की जाती है, लेकिन उन्हें अलग-अलग server{}हल करने के लिए आगे बढ़ रहा है।
आर्टूर बोदेरा

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 प्रोटोकॉल को अपनी POODLE भेद्यता के लिए अक्षम करना चाहिए: disablessl3.com इसके बजाय इसका उपयोग करें: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787

4

इगोर / जैडर के पोस्ट में जोड़ने के लिए, यदि आप एक विशिष्ट आईपी सुन रहे हैं जो आप उपयोग कर सकते हैं:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.