أريد التثبيت باستخدام وكيل عكسي لـ Apache

أردت التثبيت باستخدام وكيل عكسي من Apache وحاولت التثبيت باستخدام منفذ مخصص، لكن ذلك لم ينجح.
هل هناك طريقة للقيام بذلك؟

جارِ التحقق من اسم النطاق الخاص بك . . .
تحذير: يبدو أن المنفذ 443 على الحاسوب غير قابل للوصول باستخدام اسم المضيف:  
اسم-النطاق
تحذير: فشل الاتصال أيضًا بـ اسم-النطاق (المنفذ 80).

هذا يشير إلى أن اسم-النطاق يحل إلى عنوان IP لا يمكن الوصول إليه من هذه
الآلة التي تقوم فيها بتثبيت discourse.

أول ما يجب فعله هو التأكد من أن اسم-النطاق يحل إلى عنوان IP الخاص بهذا الخادم.
عادةً ما يتم ذلك في نفس المكان الذي اشتريت فيه النطاق.

إذا كنت متأكدًا من أن عنوان IP يُحل بشكل صحيح، فقد تكون المشكلة متعلقة بجدار الحماية.
قد تساعدك عملية بحث على الويب عن "فتح المنافذ خادمتك السحابية".

هذه الأداة مصممة فقط لأكثر حالات التثبيت شيوعًا. إذا لم تتمكن من حل
المشكلة المذكورة أعلاه، فستحتاج إلى تعديل containers/app.yml بنفسك ثم كتابة

فشل
--------------------
خطأ تنفيذ Pups::ExecError: فشل الأمر /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "إلغاء! النطاق غير مُعدّ!"; exit 1; end' مع إرجاع #<Process::Status: pid 176 exit 1>
موقع الفشل: /pups/lib/pups/exec_command.rb:112:in `spawn'
فشل التنفيذ مع المعلمات "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_HOSTNAME\"] == \"discourse.example.com\"; puts \"إلغاء! النطاق غير مُعدّ!\"; exit 1; end'"
de0d133ffdd4c51d9a870d09bd16ce8fcc0680130ced1446f0038b4175a46840
** فشل التمهيد ** يرجى التمرير للأعلى والبحث عن رسائل الخطأ السابقة، قد يكون هناك أكثر من واحدة.
قد يساعد ./discourse-doctor في تشخيص المشكلة.

app.yml

## أي منافذ TCP/IP يجب أن يعرضها هذا الحاوي؟
## إذا كنت تريد أن يشارك Discourse منفذًا مع خادم ويب آخر مثل Apache أو nginx،
## راجع https://meta.discourse.org/t/17247 للحصول على التفاصيل
expose:
  - "127.0.0.1:8100:80"   # http

params:

لا يمكنك استخدام discourse-setup، ولكن يمكنك البحث: كيفية إعداد Discourse على خادم يحتوي على مواقع Apache موجودة

إعجابَين (2)

شكرًا لك.
لقد اتبعت الدليل لبناء Discourse.
ومع ذلك، لا يعمل وكيل العكسي في Apache بشكل صحيح.

    ProxyPass / ws://var/discourse/shared/standalone/nginx.http.sock
    ProxyPassReverse / ws://var/discourse/shared/standalone/nginx.http.sock

خطأ

لم يكن معالج البروتوكول صالحًا لعنوان URL /favicon.ico (المخطط 'ws'). إذا كنت تستخدم إصدار DSO من mod_proxy، فتأكد من تضمين وحدات البروكسي الفرعية في التكوين باستخدام LoadModule.

عزيزي @Teraterayuki

إليك مجموعة أمثلة من مضيفات Apache2 الافتراضية التي تعمل كوكيل عكسي إلى مقبس نطاق يونكس (Unix domain socket) داخل حاوية Discourse:

المنفذ 80

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # مستويات السجل المتاحة: trace8، ...، trace1، debug، info، notice، warn،
        # error، crit، alert، emerg.
        # من الممكن أيضًا تكوين مستوى السجل لوحدات معينة، على سبيل المثال:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # بالنسبة لمعظم ملفات التكوين من conf-available/، والتي يتم
        # تمكينها أو تعطيلها على المستوى العالمي، من الممكن
        # تضمين سطر لمضيف افتراضي معين فقط. على سبيل المثال، السطر التالي
        # يمكّن تكوين CGI لهذا المضيف فقط
        # بعد تعطيله عالميًا باستخدام "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =mysite.mydomain.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

المنفذ 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #قم بتفعيل هذا بعد إعداد Let's encrypt على الوكيل العكسي
  	    RewriteEngine On
        
        RewriteCond %{HTTP_USER_AGENT}  (Bytespider|Yandex|Wget|seocompany|CCBot|Cincraw) [NC]
        RewriteRule . - [R=403,L]

  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # مستويات السجل المتاحة: trace8، ...، trace1، debug، info، notice، warn،
        # error، crit، alert، emerg.
        # من الممكن أيضًا تكوين مستوى السجل لوحدات معينة، على سبيل المثال:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # بالنسبة لمعظم ملفات التكوين من conf-available/، والتي يتم
        # تمكينها أو تعطيلها على المستوى العالمي، من الممكن
        # تضمين سطر لمضيف افتراضي معين فقط. على سبيل المثال، السطر التالي
        # يمكّن تكوين CGI لهذا المضيف فقط
        # بعد تعطيله عالميًا باستخدام "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/mysite.mydomain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mysite.mydomain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

@Teraterayuki

يرجى ملاحظة أنه في هذا التكوين، يعمل الوكيل عبر مقبس يونكس وليس مقبس ويب (ws)

كما يرجى ملاحظة أنه في هذا التكوين لا تحتاج إلى إضافة معلومات Let’s Encrypt يدويًا. يمكنك البدء بهذا:

المنفذ 80 قبل تشغيل Certbot

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # مستويات السجل المتاحة: trace8، ...، trace1، debug، info، notice، warn،
        # error، crit، alert، emerg.
        # من الممكن أيضًا تكوين مستوى السجل لوحدات معينة، على سبيل المثال:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # بالنسبة لمعظم ملفات التكوين من conf-available/، والتي يتم
        # تمكينها أو تعطيلها على المستوى العالمي، من الممكن
        # تضمين سطر لمضيف افتراضي معين فقط. على سبيل المثال، السطر التالي
        # يمكّن تكوين CGI لهذا المضيف فقط
        # بعد تعطيله عالميًا باستخدام "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

المنفذ 443 قبل تشغيل Certbot

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #قم بتفعيل هذا بعد إعداد Let's encrypt على الوكيل العكسي
  	    RewriteEngine On
        


  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # مستويات السجل المتاحة: trace8، ...، trace1، debug، info، notice، warn،
        # error، crit، alert، emerg.
        # من الممكن أيضًا تكوين مستوى السجل لوحدات معينة، على سبيل المثال:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # بالنسبة لمعظم ملفات التكوين من conf-available/، والتي يتم
        # تمكينها أو تعطيلها على المستوى العالمي، من الممكن
        # تضمين سطر لمضيف افتراضي معين فقط. على سبيل المثال، السطر التالي
        # يمكّن تكوين CGI لهذا المضيف فقط
        # بعد تعطيله عالميًا باستخدام "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

ثم، إذا قمت بتشغيل:

certbot -d mysite.mydomain.com

فإن certbot الودود سيقوم تلقائيًا بإضافة كود SSL المطلوب لك.

بعد أن يقوم صديقنا certbot بإضافة كود التكوين الخاص به ويعمل كل شيء كما هو متوقع، يمكنك إلغاء التعليق عن هذا السطر:

#SSLProxyEngine on   #قم بتفعيل هذا بعد إعداد Let's encrypt على الوكيل العكسي

ثم أعد تشغيل apache2 مرة أخرى.

آمل أن يكون هذا مفيدًا لك يا @Teraterayuki

اعتنِ بنفسك.


ملاحظات ختامية:

  1. يرجى ملاحظة أننا لا نستخدم haproxy في تكوينات الوكيل العكسي الخاصة بـ apache2. حيث يضيف haproxy طبقة غير ضرورية من التعقيد مع فائدة ملموسة شبه معدومة (في حالتنا)، لذلك نعمل بـ apache2 كوكيل عكسي “بالطريقة السهلة”. قد يختلف الأمر بالنسبة لك إذا أردت استخدام haproxy؛ ولكن بصراحة، نحن لا نستخدم haproxy (في عدد من إعدادات الوكيل العكسي لـ apache2 في بيئة الإنتاج) ولم نواجه أبدًا أي مشاكل مع apache2 كوكيل عكسي.
  1. إذا لم تكن تستخدم mod_pagespeed، قم بإلغاء التعليق عن تلك الأسطر. ومع ذلك، إذا كنت تشغل mod_pagespeed``، فعطّل mod_pagespeed``` لكل مضيف افتراضي عند استخدام الوكيل العكسي مع Discourse.

كل التوفيق… وآمل أن يكون هذا مفيدًا لك ولو بشكل بسيط.

6 إعجابات

لقد انتهيت
شكرًا لك!
إليك ما قمنا بإعداده فعليًا!

<VirtualHost *:80>
  ServerName DOMAIN-NAME
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

3 إعجابات

أهلاً بك!

هل ترى مدى سهولة ذلك؟

إعداد Apache2 كوكيل عكسي لـ Discourse أمر في غاية البساطة، كما تظهر في إعدادك البسيط للمنفذ 80 دون استخدام HTTPS. عمل رائع :slight_smile:

3 إعجابات

لقد قمنا أيضًا بالوصول بنجاح إلى الموقع عبر https.
وقد قمت بإعداد وكيل عكسي Apache لإعادة التوجيه إلى https.
ومع ذلك، يبدو أن الموارد يتم الوصول إليها عبر http ولا تظهر بشكل صحيح.
ما الذي يمكنني فعله؟

يجب أن تنشر ملفات التكوين الخاصة بمضيفيك الافتراضيين، لأنه لا يمكن لأحد رؤيتها أو مساعدتك إذا لم تنشرها :slight_smile:

بالمناسبة: لقد نشرت ملفات تكوين مضيف افتراضي كاملة التشغيل (لبيئة الإنتاج) لنفس التكوين الذي تحاول تطبيقه. إذا فهمتها واتبعتها، فلن تواجه أي مشاكل على الإطلاق :wink:

هكذا قمت بإعداده.
يبدو أن جميع عناوين URL التي يولدها Discourse هي من نوع http.

<VirtualHost *:80>
  ServerName DOMAIN-NAME
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
  ServerName DOMAIN-NAME
  SSLEngine On
  SSLProtocol all -SSLv2
  SSLCertificateFile /etc/letsencrypt/live/DOMAIN-NAME/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN-NAME/privkey.pem
  ProxyPreserveHost on
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

يجب عليك تعريف DISCOURSE_FORCE_HTTPS على true أو تعيين هذا الإعداد في إعدادات النظام الخاصة بك.

إعجابَين (2)

مرحبًا! يقودك نص برمجي discourse-setup إلى هنا عند استخدام المنافذ 80/443، لكن هذه التعليمات لا تنطبق على التثبيتات الجديدة. كيف يمكنني إجراء تثبيت جديد باستخدام وكيل عكسي خاص بي؟

جرّب هذا:

./discourse-setup  --skip-connection-test --skip-rebuild

ستظل بحاجة إلى تحرير ملف app.yml يدويًا بعد ذلك، لكنه على الأقل سيملأ العناصر التي يطلبها.

وأخبرني إذا كان ذلك يساعد، ثم يمكن لشخص ما تعديل ذلك الدليل وفقًا لذلك.

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

لقد قمت بتعديل السكربت لاستخدام متغير لـ HTTP_PORT و HTTPS_PORT. ومع ذلك، فهذا ليس حلاً نظيفًا لأنه سيُفقد. أعتقد أنه يمكنك المضي قدمًا وذكر ذلك في المنشور، فهذا سيكون مفيدًا للتثبيت الأولي :slight_smile:

هل قمت بإجراء التغييرات على ملف app.yml؟ متى تعتقد أنها ستُفقد؟