सवाल क्या आपको nginx में अलग IPv4 और IPv6 सुनो निर्देशों की आवश्यकता है?


मैंने nginx पर दोहरी-स्टैक आईपीवी 4 और आईपीवी 6 वर्चुअल होस्ट को संभालने के लिए विभिन्न कॉन्फ़िगरेशन उदाहरण देखे हैं। कई इस पैटर्न का सुझाव देते हैं:

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

जहां तक ​​मैं देख सकता हूं, यह वही चीज़ प्राप्त करता है जैसे:

listen [::]:80 ipv6only=off;

आप पूर्व का उपयोग क्यों करेंगे? एकमात्र कारण मैं सोच सकता हूं कि यदि आपको अतिरिक्त पैराम की आवश्यकता है जो प्रत्येक प्रोटोकॉल के लिए विशिष्ट हैं, उदाहरण के लिए यदि आप केवल सेट करना चाहते हैं deferred आईपीवी 4 पर।


60
2017-10-20 16:26


मूल


आईपी ​​स्टैक संस्करण के साथ कुछ भी करने के लिए परिभाषित नहीं है यह एक टीसीपी विकल्प है। - Xavier Lucas
निश्चित रूप से, लेकिन आप इसे अंदर सेट करें listen निर्देश, और विकल्प प्रति होस्ट लागू होते हैं: पोर्ट जोड़ी। - Synchro
हम वास्तव में एक ऐसे मामले की कल्पना नहीं कर सकते जिसमें आप ऐसा करना चाहते हैं। मुझे लगता है कि एकमात्र कारण ऐतिहासिक है और माइकल हैम्पटन ने इसे दबाया। - Xavier Lucas


जवाब:


वह शायद है इन दिनों, पूर्व निर्माण का उपयोग करने के एकमात्र कारण के बारे में।

आप इसे देख रहे कारण है शायद कि का डिफ़ॉल्ट ipv6only nginx 1.3.4 में बदल गया। इससे पहले, यह डिफ़ॉल्ट हो गया off; नए संस्करणों में यह डिफ़ॉल्ट है on

यह लिनक्स पर आईपीवी 6_वी 6ONLY सॉकेट विकल्प के साथ बातचीत करने के लिए होता है, और अन्य ऑपरेटिंग सिस्टम पर समान विकल्प, जिनके डिफ़ॉल्ट जरूरी नहीं हैं। इस प्रकार पूर्व निर्माण को पूर्व-1.3.4 की आवश्यकता थी ताकि यह सुनिश्चित किया जा सके कि आप वास्तव में आईपीवी 4 और आईपीवी 6 दोनों पर कनेक्शन सुन रहे थे।

के लिए nginx डिफ़ॉल्ट में परिवर्तन ipv6only यह सुनिश्चित करता है कि दोहरी स्टैक सॉकेट के लिए डिफ़ॉल्ट ऑपरेटिंग सिस्टम अप्रासंगिक है। अब, nginx या तो स्पष्ट रूप से आईपीवी 4, आईपीवी 6, या दोनों से जुड़ा हुआ है, डिफ़ॉल्ट रूप से दोहरी स्टैक सॉकेट बनाने के लिए कभी भी ओएस के आधार पर नहीं।

दरअसल, प्री-1.3.4 के लिए मेरे मानक nginx कॉन्फ़िगरेशन में पहली कॉन्फ़िगरेशन है, और 1.3.4 के बाद सभी में दूसरी कॉन्फ़िगरेशन है।

हालांकि, चूंकि एक दोहरी स्टैक सॉकेट बाध्यकारी एकमात्र चीज है, इसलिए मेरी वर्तमान कॉन्फ़िगरेशन अब पहले उदाहरण की तरह दिखती है, लेकिन बिना ipv6only बुद्धि के लिए सेट करें:

listen [::]:80;
listen 80;

37
2017-10-20 16:32



कुछ ऑपरेटिंग सिस्टम ओपनबीएसडी की तरह दोहरी आईपीवी 4 और आईपीवी 6 सॉकेट नहीं करते हैं, इसलिए इसके लिए आपको दो बार सुनना होगा। - Justin Cormack
@ जस्टिनकॉमैक हाँ, आप सही हैं, और मैंने इसे कुछ समय के लिए ध्यान में रखा है। अभी तक इस पोस्ट को अपडेट नहीं किया था। - Michael Hampton♦
listen localhost:8080; लगता है कि दोनों (1.12.2) और उपयोग कर रहे हैं proxy_pass http://localhost:8080 :: 1 और 127.0.0.1 के बीच संतुलन लोड करेगा - मुझे लॉग इन में वास्तविक आईपी प्राप्त करने के लिए आईपीवी 6 के लिए एक लाइन जोड़नी थी set_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For; - Antony Gibbs


यदि आप एक एकल Nginx उदाहरण के साथ एकाधिक vhost डोमेन होस्ट करते हैं, तो आप एकल संयुक्त श्रवण निर्देश का उपयोग नहीं कर सकते हैं

listen [::]:80 ipv6only=off;

उनमें से प्रत्येक के लिए। Nginx एक अजीब quirk है जहां आप केवल निर्दिष्ट कर सकते हैं ipv6only पैरामीटर प्रत्येक बंदरगाह के लिए एक बार, या यह शुरू करने में विफल हो जाएगा। इसका मतलब है कि आप इसे प्रत्येक vhost डोमेन सर्वर ब्लॉक के लिए निर्दिष्ट नहीं कर सकते हैं।

जैसा कि माइकल ने उल्लेख किया, Nginx 1.3.4 के साथ शुरू, ipv6only पैरामीटर डिफ़ॉल्ट on

इसलिए, यदि आप एक एकल Nginx सर्वर के साथ IPv4 और IPv6 दोनों पर एकाधिक डोमेन होस्ट करना चाहते हैं, तो आपको प्रत्येक डोमेन सर्वर ब्लॉक के लिए दो श्रवण निर्देशों का उपयोग करने के लिए मजबूर होना पड़ता है:

listen 80;
listen [::]:80; 

इसके अतिरिक्त, जैसा कि सैंडर ने उल्लेख किया है ipv6only=off इसमें कमी है कि आईपीवी 4 पते आईपीवी 6 में अनुवादित हैं। इससे समस्याएं पैदा हो सकती हैं यदि आपका ऐप अकिस्मेट या स्टॉपफोरमस्पैम जैसी ब्लैकलिस्ट के खिलाफ आईपी जांच करता है क्योंकि जब तक आप एक रिवर्स अनुवाद परत में नहीं बनाते हैं, तो आपका ऐप स्पैमर के आईपीवी 4 पते के आईपीवी 6 अनुवाद की जांच करेगा, जो किसी भी आईपीवी 4 पते से मेल नहीं खाएगा कालीसूची।


54
2018-04-24 10:10



हां, यह वही है जैसा मैंने उल्लेख किया था deferred, और अन्य प्रति-प्रोटोकॉल निर्देश। यह उपयोगी होगा अगर आप कारण के कारण सुनवाई निर्देश से अलग से निर्दिष्ट किए जा सकते हैं। - Synchro
और इस मामले का मूल है, आपको अलग-अलग डोमेन के लिए सुनो निर्देश निर्दिष्ट करने की आवश्यकता है। अन्यथा क्या होगा? साइट ipv4 के माध्यम से ठीक काम करेगी और ipv6 के माध्यम से यह nginx स्वागत पृष्ठ दिखाएगी। ROFL - Silver Moon
पूरी तरह से स्पष्टीकरण के लिए धन्यवाद! जब मैंने निर्दिष्ट किया तो मुझे भ्रमित त्रुटि मिल रही थी ipv6only=off एक ही बंदरगाह के लिए दो बार। आपके जवाब ने समस्या हल की! - Bruno Sutic
इसके अलावा यदि आप 443 को सुनकर 2 vhosts का उपयोग करना चाहते हैं: listen 443; listen [::]:443; । का उपयोग करते हुए listen [::]:80 ipv6only=off; एक nginx त्रुटि फेंक देगा कि बंदरगाह पहले से ही उपयोग में है - luke_aus
बहुत उपयोगी, धन्यवाद। - Basil A


उसके साथ ipv6only=off विन्यास शैली आईपीवी 4 पते को आईपीवी 6 पते के रूप में दिखाया जा सकता है (केवल सॉफ्टवेयर) आईपीवी 4 मैप किए गए आईपीवी 6 पते उदाहरण के लिए लॉग फाइलें, पर्यावरण चर (REMOTE_ADDR) इत्यादि।


12
2017-10-20 17:08



हां, वे इस तरह से दिखाए जाते हैं। - Michael Hampton♦


मेरी समझ के लिए (और दस्तावेज़ों के अनुसार http://nginx.org/en/docs/http/ngx_http_core_module.html#listen), बस का उपयोग कर

listen 80;

... यदि आप एक ही पोर्ट पर आईपीवी 4 और आईपीवी 6 यातायात दोनों चैनल करना चाहते हैं तो पर्याप्त है।


1
2018-03-09 06:38



यह पहले ही स्थापित हो चुका है, और इस सवाल में उल्लेख किया गया है। अंतर के लिए अन्य उत्तरों को देखें। - Synchro
यह मेरे लिए नहीं था, मुझे दोनों की जरूरत थी। wget और curl जहां ipv6 का उपयोग करते समय असफल रहा जब तक मैंने लाइन को जोड़ा "सुनो [::]: 80 ipv6only = on;" - Basil A