यदि कोई स्थानीय वेबसाइट या डेवलपमेंट सर्वर 127.0.0.1 पर काम करता है लेकिन localhost पर विफल हो जाता है, या एक एड्रेस फ़ैमिली पर काम करता है लेकिन दूसरी पर नहीं, तो सर्वर के लिसनिंग एड्रेस की जाँच करें और प्रत्येक पाथ का अलग-अलग परीक्षण करें। Mac पर, 127.0.0.1 IPv4 लूपबैक एड्रेस है और ::1 IPv6 लूपबैक एड्रेस है; दोनों आपके अपने कंप्यूटर को संदर्भित करते हैं। एक पर सफल परीक्षण यह साबित नहीं करता है कि सर्विस दूसरे पर भी सुन रही है।
1. जाँचें कि क्या सर्विस सुन रही है (listening)
उस पोर्ट का उपयोग करें जिस पर आपके एप्लिकेशन को सर्व करना चाहिए। नीचे दिए गए उदाहरण पोर्ट 8000 का उपयोग करते हैं; इसे वास्तविक पोर्ट से बदलें।
lsof -nP -iTCP:8000 -sTCP:LISTEN
lsof नेटवर्क सॉकेट्स सहित खुली फाइलों को सूचीबद्ध करता है। विकल्प परिणामों को उस पोर्ट पर TCP लिसनर्स तक सीमित करते हैं और नामों को रिज़ॉल्व करने से बचते हैं। यदि कोई आउटपुट नहीं आता है, तो हो सकता है कि सर्विस नहीं चल रही हो, किसी अन्य पोर्ट का उपयोग कर रही हो, या उसने TCP लिसनर नहीं खोला हो। macOS नेटवर्क सेटिंग्स बदलने से पहले एप्लिकेशन के स्टार्टअप आउटपुट और कॉन्फ़िगर किए गए पोर्ट की जाँच करें। (lsof मैनुअल)
NAME कॉलम में एड्रेस देखें। 127.0.0.1:8000 पर दिखाया गया लिसनर IPv4 लूपबैक से बाउंड है; [::1]:8000 पर दिखाया गया लिसनर IPv6 लूपबैक से बाउंड है। सर्वर और ऑपरेटिंग सिस्टम के आधार पर, वाइल्डकार्ड एड्रेस लूपबैक से अधिक पर सुनने का संकेत दे सकता है। मुख्य निदान यह है कि सर्वर का वास्तविक बाइंड एड्रेस उस एड्रेस फ़ैमिली को शामिल करता है या नहीं जिसका आप परीक्षण कर रहे हैं। यह व्याख्या lsof द्वारा रिपोर्ट किए जा रहे सॉकेट एड्रेस पर आधारित है; एप्लिकेशन कॉन्फ़िगरेशन यह तय करता है कि सर्वर कौन सा एड्रेस खोलता है।
2. IPv4 और IPv6 का सीधे परीक्षण करें
प्रत्येक लूपबैक एड्रेस के माध्यम से समान पोर्ट और पाथ पर एक अनुरोध (request) भेजें। curl आपको ब्राउज़र के एड्रेस चयन पर निर्भर हुए बिना HTTP कनेक्शन का परीक्षण करने की अनुमति देता है।
curl -v --connect-timeout 3 http://127.0.0.1:8000/
curl -g -v --connect-timeout 3 'http://[::1]:8000/'
URL में IPv6 लिटरल के चारों ओर ब्रैकेट आवश्यक हैं; -g curl को निर्देश देता है कि वह उन्हें URL ग्लॉबिंग सिंटैक्स न माने। सिंगल कोट्स डिफ़ॉल्ट macOS शेल्स में URL को हूबहू बनाए रखते हैं। Curl इन URL नियमों का दस्तावेज़ीकरण करता है और होस्टनेम रिज़ॉल्यूशन को सीमित करने के लिए --ipv4 और --ipv6 प्रदान करता है। (curl URL सिंटैक्स, curl मैनुअल)
कनेक्शन रिफ्यूज़ल का आम तौर पर मतलब है कि उस एड्रेस और पोर्ट पर कनेक्शन स्वीकार करने वाला कोई लिसनर नहीं है। टाइमआउट यह संकेत देता है कि कनेक्शन समय सीमा के भीतर पूरा नहीं हुआ। यदि curl कोई HTTP रिस्पॉन्स प्रिंट करता है, जिसमें 404 जैसी त्रुटि स्थिति (error status) शामिल है, तो TCP और HTTP कनेक्शन सर्वर तक पहुँच गया था; इसे IPv4/IPv6 कनेक्शन विफलता मानने के बजाय पाथ या एप्लिकेशन रिस्पॉन्स की जाँच करें।
3. प्रत्येक एड्रेस के साथ localhost की तुलना करें
अब curl के IPv4 और IPv6 विकल्पों का उपयोग करके होस्टनेम का परीक्षण करें, फिर बिना किसी फ़ैमिली प्रतिबंध के प्रयास करें:
curl -4 -v --connect-timeout 3 http://localhost:8000/
curl -6 -v --connect-timeout 3 http://localhost:8000/
curl -v --connect-timeout 3 http://localhost:8000/
Curl के -4 और -6 विकल्प होस्टनेम के लिए केवल-IPv4 या केवल-IPv6 एड्रेस का अनुरोध करते हैं। इसके दस्तावेज़ीकरण में उल्लेख किया गया है कि macOS केवल-IPv6 रिज़ॉल्व अनुरोध पर IPv4-मैप्ड एड्रेस लौटा सकता है, इसलिए इन परीक्षणों को curl के सीमित कनेक्शन प्रयासों के रूप में देखें, न कि प्रत्येक एप्लिकेशन के रिज़ॉल्वर व्यवहार के पूर्ण ऑडिट के रूप में। (curl मैनुअल)
कारण को स्पष्ट करने के लिए परिणामों का उपयोग करें। यदि डायरेक्ट IPv4 परीक्षण काम करता है और डायरेक्ट IPv6 परीक्षण विफल रहता है, जबकि lsof केवल एक IPv4 लिसनर दिखाता है, तो यदि IPv6 एक्सेस की आवश्यकता है तो सर्वर को IPv6 पर भी सुनने के लिए कॉन्फ़िगर करने की आवश्यकता होगी। इसके विपरीत स्थिति तब लागू होती है जब केवल IPv6 लिसनर काम करता है। यदि दोनों डायरेक्ट परीक्षण काम करते हैं लेकिन localhost काम नहीं करता है, तो फ़ोर्स्ड-फ़ैमिली curl परिणामों की तुलना करें और एप्लिकेशन के होस्टनेम, प्रॉक्सी या URL सेटिंग्स का निरीक्षण करें। अलग-अलग एप्लिकेशन नामों को अलग-अलग तरीके से रिज़ॉल्व या कनेक्ट कर सकते हैं; Apple ऐसे ऐप्स बनाने वाले डेवलपर्स के लिए एड्रेस-फ़ैमिली-एग्नॉस्टिक नेटवर्किंग API की अनुशंसा करता है जिन्हें IPv4 और IPv6 दोनों को संभालने की आवश्यकता होती है। (Apple Developer: Supporting IPv6-only Networks)
4. जहाँ प्रमाण संकेत करते हैं, वहाँ समाधान लागू करें
जब केवल एक लूपबैक एड्रेस कनेक्शन स्वीकार करता है, तो स्थानीय सर्वर के बाइंड-एड्रेस कॉन्फ़िगरेशन को बदलें या उस एड्रेस फ़ैमिली का उपयोग करें जिसे वह वास्तव में सपोर्ट करता है। यह न मान बैठें कि Mac की Wi-Fi IPv4 या IPv6 सेटिंग्स बदलने से लूपबैक लिसनर ठीक हो जाएगा: लूपबैक अनुरोध स्वयं Mac को लक्षित करते हैं, जबकि वे नेटवर्क सेटिंग्स किसी इंटरफ़ेस के नेटवर्क कनेक्शन को कॉन्फ़िगर करती हैं। Apple के TCP/IP नियंत्रण किसी चयनित नेटवर्क सेवा के लिए IPv4 और IPv6 को कॉन्फ़िगर कर सकते हैं, लेकिन वे किसी अलग एप्लिकेशन के लिसनिंग सॉकेट को कॉन्फ़िगर नहीं करते हैं। (Apple Support: Mac पर TCP/IP सेटिंग्स बदलें)
यदि कोई भी डायरेक्ट एड्रेस काम नहीं करता है, तो सत्यापित करें कि सर्वर चल रहा है, पोर्ट सही है, और अपेक्षित प्रोटोकॉल HTTP या HTTPS है। यदि एक डायरेक्ट एड्रेस काम करता है लेकिन होस्टनेम परीक्षण अलग परिणाम देते हैं, तो यह तय करने के लिए lsof एड्रेस और curl आउटपुट का एक साथ उपयोग करें कि सर्वर बाइंड एड्रेस को समायोजित करना है या क्लाइंट URL को। यह क्रम यह माने बिना कि प्रत्येक localhost विफलता DNS समस्या है, एक अनुपलब्ध लिसनर और एक फ़ैमिली-विशिष्ट बाइंड समस्या के बीच अंतर करता है।
स्रोत
Mac पर TCP/IP सेटिंग्स बदलें — Apple Support
Supporting IPv6-only Networks — Apple Developer
curl URL syntax — curl
curl - How To Use — curl
man page lsof section 8 — manpagez