nginx नाम-आधारित वर्चुअल होस्ट IPv6 पर होस्ट करता है


44

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

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 IPv4-only (अभी के लिए) है, और ipv6.example.com IPv6-only (मुख्यतः परीक्षण प्रयोजनों के लिए) है। मैं कर सकता हूं ping6 ipv6.example.com, और यहां तक ​​कि wget ipv6.example.comएक पसीने को तोड़ने के बिना भी - यह बहुत सुखद दर्द-मुक्त था (जिस तरह से "गैंचा" को खोजने के साथ नगनेक्स आभासी मेजबानों को बांधता है, ipv6only=onतर्क और दोहरे listenनिर्देशों की आवश्यकता होती है )।

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

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

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

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

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

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

मेरे डिफ़ॉल्ट catchall 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

फिर, यहाँ समाधान के लिए @kolbyjack के लिए बहुत धन्यवाद!


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

जवाबों:


46

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


2
रुको, मैं उलझन में हूँ। मुझे लगा कि प्रति सर्वर कम से कम एक निर्देश सुनने की आवश्यकता थी - अन्यथा nginx को कैसे पता चलेगा कि किस सर्वर ब्लॉक को किस पोर्ट (एस) पर प्रतिक्रिया देने का इरादा है? मैंने इसका उल्लेख ऊपर नहीं किया क्योंकि मैं इसे प्रासंगिक नहीं समझता था, लेकिन मेरे पास 8080 पर एक सर्वर है, बाकी का 80 पर, और मैंने एक जोड़ी के लिए 443 की पेशकश करने का इरादा किया है और साथ ही जैसे ही मैंने यह इस्त्री किया है और फिर अपने आप को एक एसएसएल प्रमाणपत्र प्राप्त करें।
क्रोमी

ठीक है, दस्तावेज को फिर से देख रहे हैं, जो साइटें 80 पोर्ट पर हैं, वे वास्तव में एक सुनने के निर्देश की आवश्यकता नहीं हैं, बस मेरे catchall vhost पर default_server ध्वज के साथ एक। हालाँकि, यह अभी भी 8080 पर मेरे सर्वर के लिए विफल हो रहा है, जिसके लिए मैं एक डिफ़ॉल्ट कैटचेल का भी उपयोग करता हूं (कैटचेल केवल एक होस्ट नाम के लिए किसी भी अनुरोध को अनदेखा करने के लिए लिखा जाता है जिसे मैंने स्पष्ट रूप से किसी अन्य vhost में कॉन्फ़िगर नहीं किया है)।
क्रोमे

1
मैं आपके सभी निर्देशों को सुनने के लिए नहीं कह रहा हूं। बस सभी से फ्लैग पर ipv6only = फ्लैग को हटा दें। प्रत्येक सर्वर में एक सुनने के निर्देश के बिना, वे सिर्फ 80 सुनने के लिए डिफ़ॉल्ट होंगे; जो आईपीवी 6 को शामिल कर सकता है या नहीं कर सकता है। मुझे लगता है कि सही दृष्टिकोण दोनों सर्वरों में सुनने के निर्देशों को शामिल करना है, लेकिन केवल एक सर्वर में ipv6only = को डालें।
कोल्बीजैक

4
आह, मैं देख रहा हूं कि अब आपका क्या मतलब है। मैंने मूल रूप से आपके पोस्ट को गलत बताया है। इसने मेरे लिए काम किया है: ipv6only=onकेवल मेरी डिफ़ॉल्ट vhost (साथ default_server) में सूचीबद्ध (प्रत्येक पोर्ट के लिए जो मैं सुनता हूं ) के लिए है; तब प्रत्येक vhost IPv4 और IPv6 दोनों पर कार्य करने के लिए निर्दिष्ट करता है listen 80;और listen [::]:80(कोई अतिरिक्त पैरामीटर नहीं)। अब मुझे बस इतना करना है कि अपने दोहरे-स्टैक डोमेन के लिए AAAA रिकॉर्ड जोड़ना है, और मुझे यहां जाना अच्छा होना चाहिए। धन्यवाद!
Kromey

1
मेरे लिए भी काम किया है, लेकिन मुझे समझ में नहीं आता कि क्यों मैं nginx कई ब्लॉकों के लिए ipv4 पर सुन सकता हूं, लेकिन ipv6 नहीं। । क्या तुम समझा सकते हो ?
23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.