सवाल आईपीवी 6 पर nginx नाम-आधारित आभासी मेजबान


मेरे पास एक nginx सर्वर लगभग आधा दर्जन विभिन्न वेबसाइटों की सेवा कर रहा है। यह एक लिनोड पर चल रहा है जिसे अभी आईपीवी 6 मूल समर्थन (डलास डेटा सेंटर) मिला है, और मैं अपनी अधिकांश साइटों को दोहरी-स्टैक ऑपरेशन के लिए कॉन्फ़िगर करने का प्रयास कर रहा हूं। मुझे पहली बार एक आईपीवी 6-केवल सबडोमेन का उपयोग करके चलाया गया:

server {
    listen [::]:80 ipv6only=on;
    listen 80;

    server_name example.com ipv6.example.com;

    root /var/www/example.com/htdocs;

    #More stuff, including PHP, WordPress
}

यह बहुत अच्छा काम करता है - example.com आईपीवी 4-केवल (अभी के लिए) है, और ipv6.example.com केवल आईपीवी 6 है (मुख्य रूप से परीक्षण उद्देश्यों के लिए)। हाँ मैं ping6 ipv6.example.com, और भी wget ipv6.example.com एक पसीना तोड़ने के बिना - यह बहुत सुखद दर्द रहित था (जिस तरह से "गॉन्चा" खोजने के बाद nginx आभासी मेजबान बांधता है, जरूरी है ipv6only=on तर्क और दोहरी listen निर्देशों)।

हालांकि, अब मैं static.example.com से शुरू होने वाले अपने अन्य डोमेन का समर्थन करने के लिए इसका विस्तार करने की कोशिश कर रहा हूं; जब मैं ऊपर जैसा ही दृष्टिकोण लेता हूं, हालांकि (दोहरी listen निर्देश सहित, सहित ipv6only=on तर्क), nginx को पुनरारंभ करते समय मुझे निम्न त्रुटि मिलती है:

* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3

ऐसा लगता है कि शायद IPv6 के लिए बाध्यकारी की nginx की विधि नाम-आधारित वर्चुअल होस्ट की अनुमति नहीं देती है? क्या मुझे अपने होस्ट (कोई समस्या नहीं) से अतिरिक्त आईपीवी 6 पते प्राप्त करना होगा और IPv4 पर आईपी-आधारित आभासी होस्टिंग का उपयोग आईपीवी 4 पर नामित वर्चुअल होस्टिंग के साथ करना होगा? या क्या मुझे एक समाधान याद आ रहा है जो मेरी विन्यास दोनों ढेर पर लगातार बने रहने की अनुमति देगा?

मैं उम्मीद कर रहा था कि समय पर आईपीवी 6 स्टैक पर मेरी साइट पूरी तरह से हो विश्व आईपीवी 6 दिवस, लेकिन जब तक मैं इसे जल्दी से साफ़ नहीं कर सकता, मैं तैयार नहीं हो सकता। किसी भी व्यावहारिक दृष्टिकोण से कोई बड़ा सौदा नहीं - मेरी साइट्स में से कोई भी कल्पना के किसी भी हिस्से से "प्रमुख संगठन" के रूप में योग्य नहीं है - लेकिन मुझे अपने गीक क्रेडिट को बचाने में मदद करें!

जोड़ने के लिए संपादित:

@ कोल्बीजैक के उत्तर के लिए धन्यवाद, मेरे पास अब एक पूर्ण कार्यात्मक दोहरी-स्टैक वेब सर्वर है। सिर्फ स्पष्टता के लिए, मैं उस समाधान में संपादन कर रहा हूं जिसने मुझे दिया है ताकि हर कोई स्पष्ट रूप से देख सके कि उत्तर क्या है।

मेरा डिफ़ॉल्ट कैचॉल vhost निम्नलिखित है listen निर्देशों:

listen 80 default_server;
listen 8080 default_server;
listen [::]:80 default_server ipv6only=on;
listen [::]:8080 default_server ipv6only=on;

मुझे नहीं पता कि आदेश मायने रखता है, लेकिन वहां है। फिर, प्रत्येक अतिरिक्त vhost निम्नलिखित है listen निर्देशों:

listen 80;
listen [::]:80;

(या 8080 उस के लिए उस बंदरगाह पर सुनता है।) यहां महत्वपूर्ण हिस्सा किसी भी अतिरिक्त तर्क की कुल कमी है लेकिन डिफ़ॉल्ट vhost के listen निर्देश - यानी कोई पुनरावृत्ति नहीं ipv6only=on

फिर, समाधान के लिए @ कोल्बीजैक के लिए बहुत धन्यवाद!


44
2018-06-06 23:40


मूल


Nginx 1.2.1 के साथ मुझे निर्दिष्ट करने की आवश्यकता नहीं थी ipv6only=on। हालांकि बाकी सब कुछ वही बना रहा, इसके लिए धन्यवाद! - BeepDog


जवाब:


आपको सॉकेट के लिए एक घोषणा पर केवल सुनने के विकल्प की आवश्यकता है। आम तौर पर आप उन्हें घोषणा पर डाल देंगे जिसमें डिफ़ॉल्ट_सर्वर ध्वज भी शामिल है, लेकिन कुछ विकल्पों के लिए, मुझे लगता है कि आप उन्हें किसी भी एक सुनवाई निर्देश पर सेट कर सकते हैं। एक को छोड़कर सभी सूचीओं से बस ipv6only = को हटा दें।


46
2018-06-07 02:12



रुको, मैं उलझन में हूँ। मैंने सोचा कि कम से कम एक सुनवाई निर्देश प्रति सर्वर घोषणा की आवश्यकता थी - अन्यथा nginx कैसे पता चलेगा कि कौन से सर्वर ब्लॉक का उद्देश्य पोर्ट (पोर्ट) पर प्रतिक्रिया देना है? मैंने उपरोक्त इसका उल्लेख नहीं किया क्योंकि मैंने इसे प्रासंगिक नहीं माना था, लेकिन मेरे पास 8080 पर एक सर्वर है, बाकी 80 पर है, और मैं एक जोड़े के लिए 443 की पेशकश करने का इरादा रखता हूं जैसे ही मुझे यह लोहे से बाहर निकलता है और फिर मुझे एक एसएसएल प्रमाणपत्र प्राप्त करें। - Kromey
ठीक है, प्रलेखन पर फिर से देख रहे हैं, पोर्ट 80 पर मौजूद साइटें दिखती हैं कि उन्हें वास्तव में एक सुनवाई निर्देश की आवश्यकता नहीं होगी, केवल मेरे कैचॉल vhost पर default_server ध्वज के साथ। हालांकि, यह अभी भी 8080 पर मेरे सर्वर के लिए असफल रहा है, जिसके लिए मैं एक डिफ़ॉल्ट कैचॉल का भी उपयोग करता हूं (कैचॉल को होस्ट नाम के लिए किसी भी अनुरोध को अनदेखा करने के लिए लिखा जाता है जिसे मैंने किसी अन्य vhost में स्पष्ट रूप से कॉन्फ़िगर नहीं किया है)। - Kromey
मैं आपके सभी सुनो निर्देशों को हटाने के लिए नहीं कह रहा हूं। बस ipv6only = ध्वज पर सभी में से एक को हटा दें। प्रत्येक सर्वर में एक सुनो निर्देश के बिना, वे केवल 80 सुनने के लिए डिफ़ॉल्ट होंगे; जो ipv6 शामिल हो सकता है या नहीं भी हो सकता है। मुझे लगता है कि सही तरीका प्रत्येक सर्वर में दोनों सुनवाई निर्देशों को शामिल करना है, लेकिन केवल सर्वरों में से एक में ipv6only = चालू रखें। - kolbyjack
आह, अब मैं देख रहा हूँ तुम्हारा क्या मतलब है। मैंने मूल रूप से आपकी पोस्ट को गलत तरीके से पढ़ाया। यह मेरे लिए काम किया है: ipv6only=on केवल मेरे डिफ़ॉल्ट vhost (साथ में) में सूचीबद्ध (प्रत्येक पोर्ट के लिए मैं सुनता हूं) सूचीबद्ध है default_server); प्रत्येक vhost तो बस निर्दिष्ट करता है listen 80; तथा listen [::]:80 (आईपीवी 4 और आईपीवी 6 दोनों पर काम करने के लिए बिल्कुल कोई अतिरिक्त पैरामीटर नहीं)। अब मुझे बस इतना करना है कि मेरे दोहरी-स्टैक डोमेन के लिए एएएए रिकॉर्ड जोड़ना खत्म हो गया है, और मुझे यहां जाने के लिए अच्छा होना चाहिए। धन्यवाद! - Kromey
मेरे लिए भी काम किया, लेकिन मुझे नहीं पता कि मैं nginx क्यों कई ब्लॉक के लिए ipv4 पर सुन सकता हूं, लेकिन ipv6 नहीं। । क्या तुम समझा सकते हो ? - a deer