إذا كان موقع ويب محلي أو خادم تطوير يعمل على 127.0.0.1 ولكنه يفشل على localhost، أو يعمل على إحدى عائلتي العناوين دون الأخرى، فتحقق من عنوان استماع الخادم واختبر كل مسار بشكل منفصل. على أجهزة Mac، يُعد 127.0.0.1 عنوان الاسترجاع (loopback) لـ IPv4، ويُعد ::1 عنوان الاسترجاع لـ IPv6؛ وكلاهما يشيران إلى جهاز الكمبيوتر الخاص بك. ولا يثبت نجاح الاختبار على أحدهما أن الخدمة تستمع على الآخر.
1. التحقق مما إذا كانت الخدمة تستمع
استخدم المنفذ الذي من المفترض أن يخدم تطبيقك من خلاله. تستخدم الأمثلة أدناه المنفذ 8000؛ استبدله بالمنفذ الفعلي.
lsof -nP -iTCP:8000 -sTCP:LISTEN
يسرد الأمر lsof الملفات المفتوحة، بما في ذلك مقابس الشبكة (network sockets). تضيّق الخيارات نطاق النتائج لتقتصر على مستمعي TCP على ذلك المنفذ وتتجنب حل الأسماء (resolving names). إذا لم يكن هناك أي مخرجات، فقد لا تكون الخدمة قيد التشغيل، أو قد تستخدم منفذًا مختلفًا، أو ربما لم تفتح مستمع TCP. تحقق من مخرجات بدء تشغيل التطبيق والمنفذ المكوّن قبل تغيير إعدادات شبكة macOS. (دليل lsof)
انظر إلى العنوان في عمود NAME. المستمع المعروض على 127.0.0.1:8000 يكون مرتبطًا بعنوان استرجاع IPv4؛ والمستمع المعروض على [::1]:8000 يكون مرتبطًا بعنوان استرجاع IPv6. قد يشير عنوان البدل (wildcard) إلى الاستماع على أكثر من مجرد عنوان الاسترجاع، وذلك بناءً على الخادم ونظام التشغيل. يتمثل التشخيص الأساسي في معرفة ما إذا كان عنوان الربط الفعلي للخادم يتضمن عائلة العناوين التي تختبرها. وينبع هذا التفسير من عنوان المقبس الذي يبلّغ عنه lsof؛ حيث يحدد تكوين التطبيق العنوان الذي يفتحه الخادم.
2. اختبار IPv4 و IPv6 مباشرة
أرسل طلبًا إلى نفس المنفذ والمسار عبر كل عنوان استرجاع. تتيح لك أداة curl اختبار اتصال HTTP دون الاعتماد على اختيار المتصفح للعنوان.
curl -v --connect-timeout 3 http://127.0.0.1:8000/
curl -g -v --connect-timeout 3 'http://[::1]:8000/'
الأقواس المربعة مطلوبة حول عنوان IPv6 الحرفي في عنوان URL؛ يخبر الخيار -g أداة curl بعدم التعامل معها كبنية تطابق أنماط (URL globbing). تحافظ علامات الاقتباس المفردة على عنوان URL حرفيًا في أغلِفة macOS الافتراضية. توثق أداة Curl قواعد URL هذه وتوفر الخيارين --ipv4 و --ipv6 لتقييد حل اسم المضيف. (صيغة عناوين URL في curl، دليل curl)
عادةً ما يعني رفض الاتصال (connection refusal) عدم وجود مستمع يقبل الاتصالات عند ذلك العنوان والمنفذ. وتشير مهلة الانتظار (timeout) إلى أن الاتصال لم يكتمل ضمن الحد الزمني المحدد. وإذا قامت curl بطباعة استجابة HTTP، بما في ذلك حالة خطأ مثل 404، فهذا يعني أن اتصال TCP و HTTP قد وصل إلى خادم؛ تحقق من المسار أو استجابة التطبيق بدلاً من التعامل مع الأمر كفشل في اتصال IPv4/IPv6.
3. مقارنة localhost مع كل عنوان
الآن اختبر اسم المضيف باستخدام خيارات IPv4 و IPv6 الخاصة بـ curl، ثم جرب ذلك دون تقييد العائلة:
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/
يطلب الخياران -4 و -6 في Curl عناوين IPv4 فقط أو IPv6 فقط لأسماء المضيفين. وتشير وثائقها إلى أن macOS قد يعيد عناوين IPv4 المعينة (IPv4-mapped) عند طلب حل يقتصر على IPv6، لذا تعامل مع هذه الاختبارات على أنها محاولات اتصال مقيدة لـ curl، وليست تدقيقًا شاملاً لسلوك المحلل (resolver) في كل تطبيق. (دليل curl)
استخدم النتائج لتضييق نطاق السبب. إذا نجح اختبار IPv4 المباشر وفشل اختبار IPv6 المباشر، في حين يظهر lsof مستمع IPv4 فقط، فمن المحتمل أن الخادم يحتاج إلى تهيئة ليستمع على IPv6 أيضًا إذا كان الوصول عبر IPv6 مطلوبًا. وينطبق العكس عندما يعمل مستمع IPv6 فقط. وإذا نجح كلا الاختبارين المباشرين ولكن localhost لم ينجح، فقارن نتائج curl ذات العائلة المحددة إجباريًا وافحص إعدادات اسم المضيف أو الوكيل (proxy) أو عنوان URL للتطبيق. يمكن للتطبيقات المختلفة حل الأسماء أو الاتصال بها بطرق متباينة؛ وتوصي Apple باستخدام واجهات برمجة تطبيقات شبكية غير مقيدة بعائلة عناوين محددة (address-family-agnostic) للمطورين الذين ينشئون تطبيقات تحتاج إلى التعامل مع IPv4 و IPv6. (Apple Developer: دعم الشبكات التي تعتمد على IPv6 فقط)
4. تطبيق الإصلاح حيث تشير الأدلة
عندما يقبل عنوان استرجاع واحد فقط الاتصالات، قم بتغيير تكوين عنوان الربط (bind-address) للخادم المحلي أو استخدم عائلة العناوين التي يدعمها بالفعل. لا تفترض أن تغيير إعدادات IPv4 أو IPv6 لشبكة Wi-Fi على جهاز Mac سيؤدي إلى إصلاح مستمع الاسترجاع: إذ تستهدف طلبات الاسترجاع جهاز Mac نفسه، بينما تقوم إعدادات الشبكة تلك بتهيئة اتصال واجهة الشبكة. يمكن لعناصر تحكم TCP/IP من Apple تكوين IPv4 و IPv6 لخدمة شبكة محددة، لكنها لا تقوم بتكوين مقبس استماع تطبيق فردي. (دعم Apple: تغيير إعدادات TCP/IP على Mac)
إذا لم يعمل أي من العناوين المباشرة، فتحقق من أن الخادم قيد التشغيل، وأن المنفذ صحيح، وأن البروتوكول المتوقع هو HTTP أو HTTPS. إذا كان أحد العناوين المباشرة يعمل ولكن اختبارات اسم المضيف تختلف، فاستخدم عنوان lsof ومخرجات curl معًا لتحديد ما إذا كان يجب ضبط عنوان ربط الخادم أو عنوان URL للعميل. يميّز هذا التسلسل بين المستمع المفقود ومشكلة الربط الخاصة بعائلة معينة دون افتراض أن كل عطل في localhost هو مشكلة في نظام أسماء النطاقات (DNS).
المصادر
تغيير إعدادات TCP/IP على Mac — دعم Apple
دعم الشبكات التي تعتمد على IPv6 فقط — Apple Developer
صيغة عناوين URL في curl — curl
curl - كيفية الاستخدام — curl
صفحة الدليل lsof القسم 8 — manpagez