يعمل HTTPS بشكل مثالي، لكن عنوان URL الخاص بـ HTTP يعرض صفحة الترحيب بـ NGINX ولا يعيد التوجيه

لقد قمت مؤخرًا بتثبيت Discourse على خادم VPS يعمل بنظام Ubuntu Focal Fossa، وهو يعمل بشكل ممتاز، إلا أنني أعاني من بعض الغرابة في عناوين URL.

إليك السلوك الذي ألاحظه (في متصفح Safari). لقد أنشأت سجلات A باسم @ و WWW و * لدى مسجّل النطاق الخاص بي.

example.com [يعرض صفحة "مرحبًا بك في nginx"] فشل
www.example.com [يعيد التوجيه إلى https://example.com] نجاح
http://example.com [يعرض صفحة "مرحبًا بك في nginx"] فشل
http://www.example.com [يعيد التوجيه إلى https://example.com ويعمل بشكل جيد] نجاح
https://example.com [يعمل كما هو متوقع، ولا يعيد التوجيه] نجاح
https://www.example.com [يظهر خطأ برسالة المتصفح "هذه الاتصال ليس آمنًا"] فشل

أود أن يكون التثبيت الخاص بي في الجذر/القمّة، لذا أدخلت example.com أثناء الإعداد.

أي نصيحة تُقدّم بسخاء مُرحّب بها!

هل تقوم بتشغيل nginx خارجي على خادم Discourse؟ ولماذا؟

يأتي Discourse مرفقًا بـ nginx مُعدّ مسبقًا للتعامل مع ذلك، بشرط السماح له بالاستماع إلى المنافذ 80 و443.

إعجاب واحد (1)

مرحبًا @Falco، شكرًا لك على ردك. إلى علمي لا، صورة مزود VPS تُسمى ببساطة “Focal Fossa Clean OS”، وأعتقد أن هذا يعني أنها لا تحتوي على أدوات من جهات خارجية.

هذا مجرد إعداد مباشر من الصندوق باستخدام مسار التثبيت “30 دقيقة” المنشور.

sudo su

wget -qO- https://get.docker.com/ | sh

git clone https://github.com/discourse/discourse_docker.git /var/discourse

cd /var/discourse

./discourse-setup
إعجاب واحد (1)

أوه، هذا سلوك غريب حقًا!

هل يمكنك مشاركة ملف app.yml هنا (قم بإزالة البيانات الحساسة مثل كلمات المرور). يقع الملف في /var/discourse/containers/app.yml.

أيضًا، اذكر مخرجات docker ps -a.

بالتأكيد، شكرًا لك. هل قد يتسبب امتلاك نطاق بـ TLD غريب في أي مشاكل؟ (إنه .community).

## هذا قالب حاوية 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

params:
  db_default_text_search_config: "pg_catalog.english"

  ## اضبط db_shared_buffers إلى الحد الأقصى 25% من إجمالي الذاكرة.
  ## سيتم تعيينه تلقائيًا بواسطة bootstrap بناءً على ذاكرة الوصول العشوائي المكتشفة، أو يمكنك تجاوز ذلك
  db_shared_buffers: "768MB"

  ## يمكن أن يحسن أداء الفرز، لكنه يزيد من استخدام الذاكرة لكل اتصال
  #db_work_mem: "40MB"

  ## أي إصدار Git يجب أن تستخدم هذه الحاوية؟ (الافتراضي: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## كم عدد طلبات الويب المتزامنة المدعومة؟ يعتمد على الذاكرة وأنوية المعالج.
  ## سيتم تعيينه تلقائيًا بواسطة bootstrap بناءً على وحدات المعالجة المركزية المكتشفة، أو يمكنك تجاوز ذلك
  UNICORN_WORKERS: 8

  ## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
  ## مطلوب. لن يعمل Discourse مع عنوان IP عاري.
  DISCOURSE_HOSTNAME: example.com

  ## قم بإلغاء التعليق إذا كنت تريد بدء الحاوية بنفس اسم النطاق
  ## (-h option) كما هو محدد أعلاه (الافتراضي "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل سيتم تعيينها كمسؤول ومطور
  ## عند التسجيل الأولي، مثال 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'email@gmail.com'

  ## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
  ## مطلوب عنوان SMTP واسم مستخدم وكلمة مرور
  # تحذير: قد يتسبب الحرف '#' في كلمة مرور SMTP في حدوث مشاكل!
  DISCOURSE_SMTP_ADDRESS: smtp.postmarkapp.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: username
  DISCOURSE_SMTP_PASSWORD: "password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (اختياري، الافتراضي true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (مطلوب من بعض المزودين)

  ## إذا أضفت قالب Lets Encrypt، قم بإلغاء التعليق أدناه للحصول على شهادة SSL مجانية
  LETSENCRYPT_ACCOUNT_EMAIL: email@gmail.com


  ## عنوان CDN http أو https لهذه النسخة من Discourse (مُعد للاستخراج)
  ## راجع https://meta.discourse.org/t/14857 للحصول على التفاصيل
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## مفتاح عنوان IP للتحديد الجغرافي من Maxmind
  ## راجع https://meta.discourse.org/t/-/137387/23 للحصول على التفاصيل
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## حاوية Docker عديمة الحالة؛ يتم تخزين جميع البيانات في /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## تذهب الإضافات هنا
## راجع https://meta.discourse.org/t/19157 للحصول على التفاصيل
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## أي أوامر مخصصة للتشغيل بعد البناء
run:
  - exec: echo "Beginning of custom commands"
  ## إذا كنت تريد تعيين عنوان البريد الإلكتروني 'From' لأول تسجيل، قم بإلغاء التعليق وتغييره:
  ## بعد الحصول على أول بريد إلكتروني للتسجيل، قم بإعادة التعليق على السطر. يجب تشغيله مرة واحدة فقط.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

و

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                      NAMES
465fbf1c3fb8   local_discourse/app   "/sbin/boot"   47 minutes ago   Up 46 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app

ربما تأتي هذه التوزيعة التي يوفرها لك المزود مع nginx مُثبّتة مسبقًا؟

ماذا يطبع الأمر curl -I localhost؟

HTTP/1.1 301 Moved Permanently
Server : nginx/1.18.0
Date : Mon, 25 Jan 2021 20:18:00 GMT
Content-Type : text/html
Content-Length : 169
Connection : keep-alive
Location : https://example.com

هل يعني هذا أنه تم تثبيته بالفعل؟ (آسف، أنا مبتدئ في هذا المجال)

هذا هو الرد المتوقع تمامًا عند عمله بشكل صحيح. إذن، هل لا يزال http://example.com يعرض صفحة الترحيب الخاصة بـ nginx؟

https://example.com تعمل بشكل جيد، لكن http://example.com (HTTP) توجهك إلى صفحة مرحبًا بك في nginx! :sob:

هل يمكنك مشاركة النطاق الفعلي؟

إذن، هذا لا يعرض لي صفحة الترحيب الخاصة بـ nginx على الإطلاق.

هل يمكنك تجربتها على جهاز آخر مثل هاتفك؟

curl -I example.com -L
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Mon, 25 Jan 2021 20:35:21 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/

HTTP/2 200 
server: nginx
date: Mon, 25 Jan 2021 20:35:22 GMT
content-type: text/html; charset=utf-8
vary: Accept-Encoding
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: finish_installation/index
cache-control: no-cache, no-store
content-security-policy: base-uri 'none'; object-src 'none'; script-src https://example.com/logs/ https://example.com/sidekiq/ https://example.com/mini-profiler-resources/ https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/extra-locales/ https://example.com/highlight-js/ https://example.com/javascripts/ https://example.com/plugins/ https://example.com/theme-javascripts/ https://example.com/svg-sprite/; worker-src 'self' https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/javascripts/ https://example.com/plugins/
x-request-id: 8755d4fa-387f-4509-8709-b6075f274d09
x-runtime: 0.026020
strict-transport-security: max-age=31536000
إعجاب واحد (1)

حسنًا، أنا بالتأكيد أحمق. جربت من هاتفي عبر شبكة 4G (للتحقق من DNS المحلي)، فعملت جميع عناوين URL تلك بشكل جيد. ثم أعدت الاتصال بشبكة WiFi، فعملت جميعها بشكل جيد أيضًا. لذا قمت بمسح ذاكرة التخزين المؤقت لمتصفح Safari على سطح المكتب، وفجأة… يعمل كل شيء هناك أيضًا.

يجب أن يكون الأمر مرتبطًا بمرحلة الاختبار الأولي للمضيف، ولم يتم تفريغ الذاكرة المؤقتة منذ ذلك الحين. شكرًا جزيلاً لمساعدتك في استكشاف المشكلة وحلها، واعتذر عن إضاعة وقتك.

إعجابَين (2)

للعلم فقط، لقد واجهت نفس المشكلة اليوم مع Ubuntu 22.04. مسح ذاكرة التخزين المؤقت لـ Safari وتحديث الصفحة أدى أيضًا إلى حل المشكلة.