على الأرجح لا ترغب في استخدام ما يلي فقط:
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
هذا صحيح فقط إذا كانت كلا الحالتين التاليتين محققة:
- يقوم HAProxy فعلياً بإرسال بروتوكول PROXY إلى حاوية Discourse.
- يرى Nginx داخل حاوية Discourse أن HAProxy هو
127.0.0.1.
في العديد من إعدادات Docker لـ HAProxy → Discourse، تكون الطريقة الأبسط والأكثر شيوعاً هي استخدام X-Forwarded-For، وليس بروتوكول PROXY.
بالنسبة لـ HAProxy، تأكد من أنه يرسل رأس IP المحول:
defaults
mode http
option httplog
option forwardfor
أو في الجزء الخلفي (backend):
backend be_discourse
option forwardfor
server app 127.0.0.1:8080 check
ثم في تكوين حاوية Discourse، حافظ على تغييرات IP الحقيقية لـ Nginx من خلال app.yml. لا تقم بتعديل الملفات مباشرة داخل الحاوية قيد التشغيل، لأنها ستُفقد عند إعادة البناء.
أضف شيئاً مثل هذا إلى /var/discourse/containers/app.yml تحت قسم run: الموجود:
run:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 127.0.0.1;
# اضبط هذا ليتوافق مع نطاق جسر/شبكة Docker الفعلي الذي يتصل منه HAProxy
set_real_ip_from 172.17.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
types {
ثم أعد البناء:
cd /var/discourse
./launcher rebuild app
قد تحتاج إلى تعديل set_real_ip_from ليتطابق مع عنوان IP/النطاق الفعلي الذي يراه Nginx داخل حاوية Discourse عند اتصال HAProxy به. مع Docker، غالباً ما لا يكون هذا 127.0.0.1؛ فقد يكون عنوان جسر Docker مثل 172.17.0.1 أو نطاق شبكة Docker المعرفة من قبل المستخدم.
إذا كنت ترغب حقاً في استخدام بروتوكول PROXY بدلاً من ذلك، يجب على HAProxy إرساله صراحةً:
backend be_discourse
server app 127.0.0.1:8080 check send-proxy
ويجب على Nginx الاستماع باستخدام proxy_protocol، وليس فقط قراءة real_ip_header proxy_protocol:
run:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "listen 80;"
to: "listen 80 proxy_protocol;"
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 127.0.0.1;
set_real_ip_from 172.17.0.0/16;
real_ip_header proxy_protocol;
types {
التصحيح المهم هو: real_ip_header proxy_protocol وحده غير مكتمل. يحتاج Nginx أيضاً إلى listen 80 proxy_protocol;، ويحتاج HAProxy إلى send-proxy. وإلا، استخدم X-Forwarded-For، وهو الإعداد المعتاد لوضع HTTP في HAProxy. في HAProxy، option forwardfor هو الطريقة القياسية لإضافة رأس عنوان IP العميل X-Forwarded-For. مع بروتوكول PROXY في Nginx، يجب أن يتضمن توجيه listen عبارة proxy_protocol قبل أن يعمل real_ip_header proxy_protocol.
لذا، الإيجاز هو:
- استخدم
X-Forwarded-For ما لم يكن لديك سبب محدد لاستخدام بروتوكول PROXY.
- لا تخلط بين الوضعين.
- إذا لم يكن HAProxy يستخدم
send-proxy، فلن يعمل real_ip_header proxy_protocol.
- إذا كنت تستخدم Discourse Docker، اجعل التغيير في
app.yml، وليس مباشرة داخل الحاوية قيد التشغيل.