إنه معطل. X-Forwarded-Proto موجود في كتلة الخادم الخاصة بي. إذن، العنصر (العناصر) الوحيد الذي لا أستخدمه - استنادًا إلى الروابط التي شاركتموها جميعًا - هو هذا:
# القوالب الأساسية المستخدمة؛ يمكن تقليلها لتشمل وظائف أقل لقوالب الحاويات: # - "templates/cron.template.yml" # تم تضمين cron الآن في صورة الأساس - "templates/postgres.template.yml" - "templates/redis.template.yml" - "templates/sshd.template.yml" - "templates/web.template.yml" # - "templates/web.ssl.template.yml" # إزالة - سيتم التعامل مع HTTPS بواسطة nginx الخارجي - "templates/web.ratelimited.template.yml" - "templates/web.socketed.template.yml" # <-- تمت الإضافة # أي المنافذ التي سيتم كشفها؟ # expose: قم بتعليق القسم بأكمله
لقد فتحت الموقع في ثلاثة متصفحات (إيدج، فايرفوكس، وكروم للجوال) وحصلت على شهادة آمنة تمامًا كمستخدم مجهول. ما هي الخطوات التي اتبعتها لتكرار هذه المشكلة؟
لم يحدث انفجار في الجحيم هنا. إحدى المشكلات المحتملة هي أن رسائل البريد الإلكتروني الخاصة بك لا تزال تحتوي على رابط http://. ومع ذلك، تم إعادة توجيهي بشكل صحيح إلى موقع HTTPS لتفعيل حسابي، ولا أرى أي أخطاء متعلقة بـ SSL هنا.
هناك حيث تخطئ. إذا تم تمكين فرض HTTPS، فيجب على Discourse إرسال جميع الروابط كـ HTTPS. يجب تحميل كل رابط متعلق بالمنتدى عبر HTTPS. إذا كنت لا تزال تقوم بأشياء غريبة ولا تتبع الطريقة المقترحة، فأنت وحدك المسؤول. لا يمكننا المساعدة بما يتجاوز الإجراءات القياسية التي تعمل.
force_https ليست مجرد إعادة كتابة؛ فهي تقوم بأكثر من ذلك داخليًا. إذا كنت تريد حل مشاكلك، فقد تم تقديم حل بالفعل. وإذا رفضت الحل، فانت لك أن تتحمل مسؤولية الأمر وتبحث عن سبل جديدة.
السبب في ذلك هو وكيل العكسي غير المستقر لديك. سيتعيّن عليك تحديد ما الخطأ وإتباع الطريقة الصحيحة. لا يمكننا تقديم مساعدة فيما يتعلق بحلولك الخاصة.
جميع “الحلول” التي طُرحت لا تتناسب مع حالت الاستخدام المحددة لدي:
خادم بعيد (ضمن الشبكة نفسها) — أعتقد أن جميع الأمثلة تفترض أن Nginx يعمل على نفس الخادم الذي يعمل عليه Discourse، بينما أنا أستخدم proxy_pass للوصول إلى عنوان IP داخلي آخر.
لماذا فعلت ذلك؟ من أجل أمان أعلى وتوزيع الموارد. هذا هو السبب نفسه الذي دفعني إلى تقسيم الخدمات بطريقتين: عبر الحاويات وآلات افتراضية. يبدو أن الوثائق المقترحة تميل إلى افتراض حالة تعمل فيها جميع الخدمات على نفس الخادم.
أتخيل أن الظروف المذكورة أعلاه شائعة إلى حد ما. إذا كان أي من هذه الظروف يمكن استخدامه لاستيعاب حالة proxy_pass، فسأكون سعيدًا جدًا بتعديل إعداداتي لتناسب ذلك. لكنني أشعر أن تقديم عبارة عامة مثل “أنت وحدك في هذه الحالة” لمجرد أنني أحاول تجنب وضع “كل بيضاتي في سلة واحدة” أمر غير مبرر إلى حد ما.
السلوك الذي أواجهه يحدث تحت الشروط المذكورة أعلاه.
يبدو بداية ملف app.yml كالتالي:
## هذا هو قالب حاوية Docker المستقل الشامل لـ Discourse ## ## بعد إجراء تغييرات على هذا الملف، يجب عليك إعادة البناء ## /var/discourse/launcher rebuild app ## ## كن *حذرًا جدًا* عند التعديل! ## ملفات YAML حساسة للغاية للأخطاء في المسافات البادئة أو المحاذاة! ## قم بزيارة http://www.yamllint.com/ للتحقق من صحة هذا الملف عند الحاجة
templates: - "templates/postgres.template.yml" - "templates/redis.template.yml" - "templates/web.template.yml" - "templates/web.ratelimited.template.yml" ## قم بإلغاء التعليق عن هذين السطرين إذا كنت ترغب في إضافة Lets Encrypt (https) #- "templates/web.ssl.template.yml" #- "templates/web.letsencrypt.ssl.template.yml"
## ما هي منافذ TCP/IP التي يجب أن تعرضها هذه الحاوية؟ ## إذا كنت تريد لـ Discourse مشاركة منفذ مع خادم ويب آخر مثل Apache أو nginx، ## راجع https://meta.discourse.org/t/17247 للحصول على التفاصيل expose: - "80:80" # http - "443:443" # https
## قم بتعيين db_shared_buffers إلى الحد الأقصى 25% من إجمالي الذاكرة. ## سيتم تعيينها تلقائيًا بواسطة bootstrap بناءً على الذاكرة المكتشفة، أو يمكنك تجاوزها db_shared_buffers: "1024MB"
## يمكن أن يحسن أداء الفرز، لكنه يزيد من استخدام الذاكرة لكل اتصال #db_work_mem: "40MB"
## أي إصدار Git يجب أن تستخدمه هذه الحاوية؟ (الافتراضي: tests-passed) #version: tests-passed
أنت تتصل بالمنفذ 80 على خادم nginx الثاني، لذا يعتقد أنه اتصال بـ http وليس https.
حاول العثور على X-Forwarded-Proto في خادم nginx الداخلي، وقم بتغيير proxy_set_header X-Forwarded-Proto $thescheme; إلى proxy_set_header X-Forwarded-Proto https;
أو قم بتوجيه حركة المرور الخاصة بك إلى https proxy_pass https://192.168.86.108