الوسيط العكسي عبارة عن نوع من الخواديم الوسيطة Proxy servers تستقبل طلبات HTTP(S) وتوزّعها بصورة شفّافة على خادوم خلفيّ Backend server واحد أو أكثر. الوسيط العكسي مُفيد لأنّ مُعظم تطبيقات الويب في أيّامنا هذه تستعمل خواديم لم تكن قد صُمّمت لأخذ الطّلبات مُباشرة من المُستخدم وفي العادة لا تدعم إلّا ميزات HTTP بدائيّة.
يُمكنك استخدام وسيط عكسيّ لتجنّب وصول المستخدم إلى الخواديم الخلفيّة مُباشرة. يُمكن استخدامها كذلك لتوزيع الحمل Load balancing من الطّلبات على عدّة خواديم، ما يُحسّن الأداء ويُوفّر حماية من تعطّل التّطبيق. يُمكها كذلك أن تمنحك ميزات لا تمنحها خواديم التّطبيقات مثل التّخبئة Caching، ضغط الملفّات Compression، وحتى تشفير SSL.
سنضبُط في هذا الدّرس Apache ليعمل على وسيطًا عكسيًّا بسيطًا باستخدام وحدة mod_proxy
لإعادة توجيه الطّلبات القادمة إلى خادوم خلفيّ أو أكثر من خادوم يعمل على نفس الشّبكة. سنستعمل في هذا الدّرس واجهة خلفيّة بسيطة مكتوبة بإطار العمل Flask، لكنّك تستطيع استعمال أي خادوم خلفيّ تُريده وأي لغة برمجيّة مُناسبة لك.
مُلاحظة: أبدِل your_server_ip
في عناوين URL التي تجدها في هذا الدّرس بعنوان IP الخاصّ بخادومك.
المُتطلّبات
لاتّباع هذا الدّرس، ستحتاج إلى:
-
خادوم أوبونتو 16.04 مضبوط باتّباع الخطوات في هذا الدّرس، وذلك يشمل مُستخدما ذا صلاحيّات
sudo
مع ضبط مُسبق لتمكينه من تنفيذ مهام إداريّة، غير المستخدم الجذر root، بالإضافة إلى جدار ناري. -
Apache 2 مُنصّب على خادومك باتّباع الخطوة الأولى من هذا الدّرس.
الخطوة الأولى – تفعيل وحدات Apache اللازمة
يمتلك Apache الكثير من الوحدات المبنيّة مُسبقا لكنّها لا تكون مُفعّلة عند التّنصيب. لذا سيتوجّب علينا تفعيل الوحدات التي سنستخدمها في هذا الدّرس.
الوحدات التّي نحتاج إليها هي mod_proxy
وبضعة إضافات خاصّة بها للحصول على بضعة ميزات أخرى لدعم بروتوكولات شبكيّة مُتعدّدة. سنستعمل ما يلي بالتّحديد:
-
mod_proxy
، الوحدة الرّئيسيّة لإعادة توجيه الطّلبات، وتُمكّننا من تحويل Apache إلى بوابّة لخواديم التّطبيقات المُعتمدة. -
وحدة
mod_proxy_http
لتمكيننا من توسيط اتّصالات HTTP. -
وحدتا
mod_proxy_balancer
وmod_lbmethod_byrequests
لإضافة ميّزات مُوازنة الحمل على عدّة خواديم.
لتفعيل الوحدات الأربع، نفّذ الأوامر التّاليّة:
sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod proxy_balancer sudo a2enmod lbmethod_byrequests
لتطبيق التّغييرات، أعد تشغيل Apache:
sudo systemctl restart apache2
يُمكن الآن استخدام Apache ليعمل وسيطًا عكسيًّا لطلبات HTTP. في الخطوة – الاختياريّة - التّاليّة، سننشئ خادومين خلفيّين بسيطين. ما سيُخوّلنا التّحقّق من أنّ الإعدادات تعمل جيّدا، لكن إن كانت لديك تطبيقات تعمل في الواجهة الخلفيّة، يُمكنك تخطي الخطوة التّاليّة والانتقال مُباشرة إلى الخطوة الثّالثة.
الخطوة الثّانيّة – إعداد خواديم خلفيّة Backend Servers للاختبار
إنشاء خواديم خلفيّة بسيطة طريقة سهلة لاختبار ما إذا كانت إعدادات Apache الخاصّة بك تعمل جيّدًا أو لا. في هذه الفقرة، سنعدّ خادومين يجيبان على طلبات HTTP بمقطع نصّي صغير. أحد الخادومين سيُجيب بالمقطع Hello world!
والآخر بالمقطع Howdy world!
.
مُلاحظة: في الحالات غير الاختباريّة، عادة ما يجب على الخواديم أن تُجيب بنفس الإجابة. لكن بالنّسبة لهذا الاختبار، فامتلاك إجابتين مُختلفتين يُمكّننا من التّأكّد من أنّ خاصيّة مُوازنة الحمل تستخدم كلا الخادومين.
Flask إطار عمل مُصغّر مبني بلغة بايثون لبناء تطبيقات الويب. استعملنا Flask لإنشاء خادوميْ الاختبار لأنّ تطبيقا بسيطا باستخدامه لا يتطلّب سوى بضعة أسطر برمجيّة. ليس من الضّروري أن تكون لديك معرفة بلغة بايثون لإعداد الخادومين، لكن إن أردت تعلّمها، فيُمكنك الاطّلاع على هذه الدّروس.
أولا، حدّث قائمة الحزم:
sudo apt-get update
بعدها، نصّب أداة pip
لإدارة حزم لغة بايثون:
sudo apt-get -y install python3-pip
استخدام pip
لتنصيب أداة Flask:
sudo pip3 install flask
بعد تنصيب المُكوّنات المطلوبة، ابدأ بإنشاء ملفّ جديد ليحتوي على شفرة الخادوم الأول في المُجلّد الشخصي للمستخدم الحاليّ:
nano ~/backend1.py
انسخ ما يلي إلى الملفّ ثمّ احفظه وأغلقه:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello world!'
السّطران الأول والثّاني عبارة عن تهيئة لإطار العمل Flask. لدينا دالّة واحدة باسم home()
تُرجع النّص Hello world!
. السّطر @app.route('/')
المتواجد فوق الدّالة home()
يُخبر Flask بالإجابة على أي طلب يصل إلى العنوان الجذر /
بما تُرجعه الدّالّة.
الخادوم الثّاني مُشابه للأول، الاختلاف الوحيد أنّ الجواب مُختلف قليلا. لذا انسخ الملفّ الأول:
cp ~/backend1.py ~/backend2.py
عدّل الملفّ الجديد:
nano ~/backend2.py
عدّل ما تُرجعه الدّالة من Hello world!
إلى Howdy world!
ثمّ احفظ وأغلق الملفّ.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Howdy world!'
استخدم الأمر التّالي لتشغيل الخادوم الأول على المنفذ رقم 8080
. سيقوم هذا الأمر بتحويل المخرجات إلى /dev/null
كذلك لتفادي مُقاطعة المُخرج للطّرفيّة.
FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
في السّطر أعلاه، عرّفنا مُتغيّر البيئة FLASK_APP
ثمّ نفّذنا الأمر flask
لتشغيل الخادوم في نفس السّطر. مُتغيّرات البيئة طريقة سهلة لتمرير المعلومات إلى العمليّات المبدوءة على الطّرفيّة.
في هذه الحالة، باستعمال مُتغيّرات البيئة فإنّنا نتأكّد من أنّ الإعداد يُطبّق على الأمر الذي سيكون قيد التّشغيل فقط ولن يكون مُتوفّرا بعد ذلك، وهذا مُناسب لنا لأنّنا سنمرّر اسم ملفّ آخر بنفس الطّريقة لإخبار flask
بتشغيل الخادوم الثّاني.
استعمل الأمر التّالي لتشغيل الخادوم الثّاني على المنفذ 8081
بطريقة مُشابهة لما سبق. لاحظ بأنّ قيمة مُتغيّر البيئة FLASK_APP
مُختلفة في هذه الحالة:
FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
يُمكنك اختبار عمل الخادومين باستخدام أداة curl
.
اختبار الخادوم الأول:
curl http://127.0.0.1:8080/
يجب على المُخرج أن يساوي Hello world!
. الخادوم الثّاني:
curl http://127.0.0.1:8081/
يجب على المُخرج أن يكون Howdy world!
.
مُلاحظة: لإغلاق كلا الخادومين بعد أن تنتهي من استخدامهما، عند إنهائك لهذا الدّرس مثلا، فيُمكنك تنفيذ الأمر killall flask
.
في الخطوة التّاليّة، سنعدّل ملفّ إعدادات Apache لتمكيننا من استخدامه وسيطًا عكسيًّا.
الخطوة الثّالثة – تعديل الإعدادات المبدئيّة لجعل Apache يعمل وسيطًا عكسيًّا
سنعدّ في هذه الفقرة مُضيفًا افتراضيًّا Virtual host على Apache للعمل وسيطًا عكسيًّا لخادوم خلفي واحد أو عدّة خواديم موزونة الحمل.
مُلاحظة: سنُطبّق الإعدادات في هذا الدّرس على مُستوى المُضيف الافتراضي. يوجد في الإعداد المبدئي لـApache مُضيف افتراضي واحد مُفعّل. لكنّك تستطيع استعمال جميع أجزاء هذه الإعدادات على أي مُضيف افتراضي آخر.
إن كان خادوم Apache الخاص بك يجيب على طلبات HTTP و HTTPS، فسيتوجّب عليك وضع إعدادات الوسيط العكسي في كلا المُضيفَين الافتراضيّيْن لـHTTP وHTTPS.
افتح ملفّ إعدادات Apache المبدئي باستخدام nano
أو أي مُحرّر مُفضّل لديك:
sudo nano /etc/apache2/sites-available/000-default.conf
ستجد داخل هذا الملفّ الجزء <VirtualHost *:80>
بدءا من السّطر الأول. يشرح المثال الأول أسفله كيفيّة ضبط هذا الجزء لإعداد وسيط عكسي لخادوم واحد، وفي المثال الثّاني سنضبط وسيطا عكسيّا يوازن الحمل على أكثر من خادوم.
المثال الأول – إعداد وسيط عكسي لخادوم خلفيّ واحد
أبدل جميع المُحتويات داخل الوسم VirtualHost
بما يلي ليصير ملفّ الإعدادات الخاصّ بك كما يلي:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
إن تابعت الأمثلة في الخطوة الثّانيّة أعلاه، فاستخدم العنوان 127.0.0.1:8080
كما هو مكتوب أعلاه. إن كان لديك تطبيق ويب خاصّ بك، فاستعمل عنوان التّطبيق عوضا عمّا فعلنا.
لدينا ثلاثة تعليمات في هذا الإعداد:
-
ProxyPreserveHost
مسؤولة عن جعل Apache يُمرّر الترويسة Header المسمَّاةHost
الأصليّة إلى الخادوم الخلفيّ. هذا الأمر مُفيد لأنّه يُخبر الخادوم بالعنوان المُستخدَم للوصول إلى التّطبيق. -
ProxyPass
عبارة عن تعليمة الإعداد الرّئيسيّة للوسيط. في هذه الحالة، نحدّد كلّ شيء تحت عنوان URL الجذر/
ليُربط مع الخادوم الخلفيّ المرتبط بالعنوان المُعطى. على سبيل المثال، إن استقبل Apache طلبا للموجّه/example
، فسيقوم بالاتّصال بالعنوانhttp://your_backend_server/example
وإرجاع الإجابة إلى العميل. -
ينبغي على
ProxyPassReverse
أن يحمل نفس الإعداد الذي يحملهProxyPass
. ويُخبر Apache بتعديل ترويسة الجواب من طرف الخادوم الخلفيّ. بهذه الطّريقة سنتأكّد من إعادة توجيه العميل إلى عنوان الوسيط وليس الخادوم الخلفيّ في حالة وُجدت ترويسة إعادة توجيه في جواب الخادوم لتجنّب أخطاء إعادة التّوجيه.
لتطبيق هذه التّغييرات، أعد تشغيل Apache:
sudo systemctl restart apache2
إن حاولت الآن الوصول إلى http://your_server_ip
في مُتصفّح ويب، ستجد جواب الخادوم الخلفيّ عوضا عن رسالة ترحيب Apache المألوفة. إن تابعت الخطوة الثّانيّة، فهذا يعني بأنّ النّتيجة ستكون Hello world!
.
المثال الثّاني – موازنة الحمل على عدّة خواديم خلفيّة
إن كان لديك أكثر من خادوم خلفيّ واحد، فاستخدام ميزة مُوازنة الحمل في mod_proxy
طريقة جيّدة لتوزيع الطّلبات على الخواديم.
استبدل جميع مُحتويات الجزء VirtualHost
بما يلي ليبدو ملفّ الإعدادات كما يلي:
<VirtualHost *:80>
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080
BalancerMember http://127.0.0.1:8081
</Proxy>
ProxyPreserveHost On
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
الإعدادات هنا مُشابهة لما سبق، لكن عوضا عن تخصيص خادوم واحد مُباشرة، استعملنا وسم Proxy
إضافيّا لتعيين خواديم مُتعدّدة.سمّينا الوسم بـbalancer://mycluster
(يُمكنك تغيير الاسم إن شئت) ليحتوي على أكثر من تعليمة BalancerMember
، والذي يُحدّد عناوين الخواديم الخلفيّة. هكذا تستعمل التّعليمتان ProxyPass
وProxyPassReverse
مجموعة موازنة الحمل المُسمّاة mycluster
عوضا عن خادم مُحدّد.
إن تابعت الخطوة الثّانيّة من هذا الدّرس، فاستعمل العنوانين 127.0.0.1:8080
و127.0.0.1:8081
للتّعليمة BalancerMember
كما هو مُبيّن في الإعدادات أعلاه. أمّا إن كانت لديك خواديم خاصّة بك فاستعمل عناوينها.
لتطبيق هذه التّغييرات، أعد تشغيل Apache:
sudo systemctl restart apache2
إن حاولت الآن الوصول إلى http://your_server_ip
في مُتصفّح ويب، ستجد جواب الخواديم الخلفيّة عوضا عن رسالة ترحيب Apache المألوفة. إن تابعت الخطوة الثّانيّة، فعند إعادة تحميل الصّفحة عدّة مرّات، ستُلاحظ بأنّ النّتيجة ستكون إمّا Hello world!
أو Howdy world!
، ما يعني بأنّ الوسيط العكسي يعمل على مُوازنة الحمل بين الخادومين.
خاتمة
لديك الآن معرفة بكيفيّة إعداد خادوم Apache ليعمل وسيطًا عكسيًّا لخادوم تطبيق أو أكثر. يُمكن استعمال mod_proxy
لضبط وسيط عكسي لخواديم تطبيقات مكتوبة بلغات مثل Python مع Django أو Ruby مع Ruby on Rails.
يُمكن كذلك استخدامها لموازنة الحمل على عدّة خواديم للتّطبيقات التي تستقبل العديد من الزّوار، بالإضافة إلى إمكانيّة استخدامه لتوفير حماية SSL للخواديم الخلفيّة التي لا تدعم SSL.
رغم أنّ mod_proxy
وmod_proxy_http
أكثر تركيب يتمّ استخدامه، إلّا أنّ هناك العديد من الوحدات الأخرى التّي تدعم بروتوكولات اتّصال أخرى. إليك بعضا من الوحدات الشّهيرة التي لم نستخدمها في هذا الدّرس:
-
mod_proxy_ftp
لبروتوكول FTP. -
mod_proxy_connect
لإعداد أنفاق SSL. -
mod_proxy_ajp
لبروتوكول AJP (Apache JServ Protocol) لخواديم خلفيّة مبنيّة على Tomcat. -
mod_proxy_ftp
لمقابس الويب Web sockets.
يُمكنك قراءة التّوثيق الرّسمي للاستزادة حول mod_proxy
.
ترجمة – بتصرّف - للمقال How To Use Apache as a Reverse Proxy with mod_proxy on Ubuntu 16.04 لكاتبه Mateusz Papiernik.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.