मेरे पास एक ही मशीन पर कई सर्वर चल रहे हैं, कुछ http के साथ, कुछ http और https दोनों के साथ। अलग-अलग फ़ाइलों में परिभाषित कई सर्वर ब्लॉक हैं जो मुख्य कॉन्फ़िगरेशन फ़ाइल से शामिल हैं।
मैंने http के लिए एक "डिफ़ॉल्ट" सर्वर स्थापित किया है जो एक सामान्य "रखरखाव पृष्ठ" के लिए अनुरोध करेगा जो अन्य config_names से किसी भी अन्य विन्यास फाइल में मेल नहीं खाता। Http डिफ़ॉल्ट सर्वर अपेक्षा के अनुसार काम करता है, यह server_name "_" का उपयोग करता है और यह पहली बार शामिल की सूची में प्रकट होता है (क्योंकि मैंने देखा है कि सर्वरों के बीच डुप्लिकेट server_names के मामले में, पहले दिखाई देने वाला उपयोग किया जाता है)। यह बहुत अच्छा काम करता है।
मैं उसी सटीक सर्वर ब्लॉक की उम्मीद करूंगा (केवल 443 default_server सुनने के लिए "80 default_server स्विचन" और साथ ही पेज "रिटर्न 444" परोसने के बजाय) हालांकि यह नहीं करता है। इसके बजाय, ऐसा प्रतीत होता है कि नया डिफ़ॉल्ट https सर्वर वास्तव में आने वाले सभी https कनेक्शन को हड़प रहा है और उन्हें विफल कर रहा है, हालांकि अन्य सर्वर ब्लॉक में आने वाले अनुरोधों के लिए अधिक उपयुक्त सर्वर_नाम है। नए डिफ़ॉल्ट https सर्वर को हटाने से फिर से शुरू करने के लिए अर्ध-सही व्यवहार होगा: https वाली वेबसाइटें सही ढंग से लोड होंगी; लेकिन बिना https वाली वेबसाइट्स को शामिल फ़ाइलों में पहले https सर्वर में भेज दिया जाएगा (जो डॉक्स के अनुसार, यदि कोई "default_server" प्रकट नहीं होता है, तो प्रदर्शित होने वाला पहला सर्वर ब्लॉक "डिफ़ॉल्ट" होगा)।
तो मेरा सवाल है, ssl कनेक्शन के लिए nginx में "डिफ़ॉल्ट सर्वर" को परिभाषित करने का सही तरीका क्या है? ऐसा क्यों है कि जब मैं स्पष्ट रूप से "default_server" सेट करता हूं, तो यह लालची हो जाता है और सभी कनेक्शनों को पकड़ लेता है, जबकि जब मैं स्पष्ट रूप से nginx को "डिफ़ॉल्ट सर्वर" तय करने देता हूं तो यह काम करता है जैसे कि मैं अपेक्षा करता हूं (डिफ़ॉल्ट रूप में गलत सर्वर सेट और अन्य वास्तविक सर्वर के साथ) सही ढंग से व्यवहार करना)?
यहाँ मेरे "डिफ़ॉल्ट सर्वर" हैं। Http दूसरे सर्वर को तोड़े बिना काम करता है। Https दूसरे सर्वर को तोड़ता है और सभी की खपत करता है।
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
आप में से कोई भी देखता है कि यहां क्या गलत हो सकता है?