هذا الدّرس هو الجزء الثّاني من سلسلة من 6 دروس حول "نظرة عامة على إنشاء تطبيقات موجهة لبيئة الإنتاج". إذا لم تقرأ الدّرس الأول فألق نظرة عليه قبل أن تواصل القراءة.
سنعدّ في هذا الجزء من السّلسلة تطبيق PHP الذي اخترناه مثالا (ووردبريس) إضافة إلى خادوم أسماء نطاقات DNS خاص.
سيستعمل مستخدمو التطبيق اسمَ النطاق للوصول إليه؛ عبر العنوان https://www.example.com
على سبيل المثال. يحيل العنوان إلى موزع الحِمل الذي سيعمل وسيطا عكسيا Reverse proxy لخواديم التطبيق التي تتصل بدورها بخادوم قاعدة البيانات. يمكِّننا استخدامُ نظام أسماء نطاقات خاصة Private DNS من الإشارة إلى عناوين الخواديم ضمن الشبكة الداخلية بأسماء المستضيفات الخاصة بها مما يسهل من عملية إعداد الخواديم.
سنعد العناصر للتوّ التي أشرنا إليها على ستة خواديم، طبقا للترتيب التالي:
- نظام أسماء نطاقات خاصة (المستضيفان
ns1
وns2
). - خادوم قاعدة البيانات (
db1
). - خواديم التطبيق (
app1
وapp2
). - موزع حمل (
lb1
).
فلنبدأ بإعداد النطاقات.
خواديم النطاقات الداخلية
يساعد استخدام أسماء نطاقات بدلا من عناوين IP في التعرف على الخواديم التي نعمل عليها، كما أنه ضروري حال إدارة الكثير من الخواديم؛ إذ يمكّن من إحلال خادوم مكان آخر بمجرد تحديث سجلات النطاق (ضمن ملف وحيد) بدلا من من تحديث عناوين IP ضمن الكثير من ملفات الإعداد. سنعدّ نظام نطاقات للإحالة إلى عناوين الشبكة الداخلية التي توجد بها الخواديم بدلا من عناوين IP.
سنشير إلى كل عنوان في الشبكة الداخلية بمستضيف ضمن النطاق الفرعي nyc3.example.com
. سيكون عنوان خادوم قاعدة البيانات ضمن الشبكة الداخلية - على سبيل المثال - db1.nyc3.example.com
؛ وهو ما ستترجمه خواديم النطاقات إلى عنوان IP داخلي (خاص). تنبغي الإشارة إلى أن اختيار اسم النطاق الفرعي nyc3.example.com
اعتباطي. في العادة يُستخدم اسم الموقع الجغرافي للنطاق الفرعي؛ في مثالنا، تشير nyc3
إلى أن الخواديم تتواجد في مركز البيانات NYC3
، وexample.com
إلى اسم النطاق الخاص بالتطبيق.
ستحصل على خادومي BIND هما ns1
وns2
. أضف عناوين IP الخاصة بجميع الخواديم التي تخطط لإعدادها إن كنت تعرفها سلفًا، وإلا أضف سجلات النطاق بالتزامن مع إنشاء الخواديم.
ننتقل لإعداد خادوم قاعدة البيانات.
إعداد خادوم قاعدة البيانات
نريد - طبقا للخطة - توزيع الحمل بين خواديم التطبيقات؛ أي تلك التي تشغِّل PHP وApache، لذا سنفْصِل قاعدة البيانات عن خواديم التطبيق لجعلها على خادوم خاص بها. من المهم جدا فصل قاعدة البيانات عن التطبيق في حال أردنا إمكانية التوسع أفقيا Horizontally Scaling (إضافة خواديم جديدة لتعمل مع تلك الموجودة) في تطبيقات PHP.
تغطي هذه الفقرة كل الخطوات الضرورية لإعداد خادوم قاعدة البيانات، لكن يمكنك معرفة المزيد عن إعداد قاعدة بيانات MySQL بعيدة بقراءة مقال كيفية إعداد قاعدة بيانات بعيدة لتحسين أداء موقع يستخدِم MySQL.
تثبيت MySQL
نفذ الأمرين التاليين على خادوم قاعدة البيانات (db1
) لتثبيت خادوم MySQL:
sudo apt-get update sudo apt-get -y install mysql-server
أدخل كلمة السر التي تريد استخدامها للحساب الإداري في MySQL عندما يُطلب منك ذلك.
نفذ:
sudo mysql_install_db sudo mysql_secure_installation
ستحتاج لإدخال كلمة سر المستخدِم الإداري التي اخترتها عند تثبيت خادوم MySQL؛ بعدها سيسألك إن كنت تريد تغيير كلمة السر هذه، اضغط زر N
إذا كنت لا تريد تغييرها. بالنسبة لبقية الأسئلة اضغط زر Enter
لتأكيد الاختيارات الافتراضية.
إعداد MySQL لاستخدام واجهة الشبكة الداخلية
افتح ملف إعداد MySQL عبر الأمر التالي:
sudo nano /etc/mysql/my.cnf
ابحث عن bind-address
وحدد قيمة المتغير بعنوان IP قاعدة البيانات ضمن الشبكة الداخلية:
bind-address = db1.nyc3.example.com
احفظ الملف ثم أغلقه.
أعد تشغيل MySQL:
sudo service mysql restart
ضبط قاعدة البيانات ومستخدميها
نحتاج الآن لإنشاء قاعدة بيانات والمستخدمين الذين ستتصل خواديم التطبيقات عن طريقهم إلى قاعدة البيانات. استخدم الأمر التالي للدخول إلى سطر أوامر MySQL:
mysql -u root -p
أدخل كلمة السر عندما تُطلب.
أنشئ قاعدة بيانات بتنفيذ الأمر التالي في سطر أوامر MySQL:
CREATE DATABASE app;
يرفق خادوم MySQL كل مستخدم بالخواديم التي يمكنه منها الاتصال بقاعدة بيانات. يوجد في مثالنا خادوما تطبيق يتصلان بقاعدة البيانات؛ لذا سننشئ مستخدما لكل واحد منهما. أنشئ مستخدما في قاعدة البيانات باسم appuser
يمكنه الاتصال من العناوين الداخلية لخواديم التطبيقات (أي app1
وapp2
). يجب استخدام نفس كلمة السر للمستخدمَيْن (اختر كلمة سر واكتبها مكان password
في الأمرين أدناه):
CREATE USER 'appuser'@'app1.nyc3.example.com' IDENTIFIED BY 'password'; CREATE USER 'appuser'@'app2.nyc3.example.com' IDENTIFIED BY 'password';
سنضبط في ما بعد امتيازات المستخدم appuser
، نكتفي الآن بإعطائه تحكما كاملا على قاعدة البيانات app
:
GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app1.nyc3.example.com'; GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app2.nyc3.example.com'; FLUSH PRIVILEGES;
تضمن الامتيازات الممتدة أن سكربت تثبيت التطبيق سيتمكن من تثبيته على قاعدة البيانات. إن كان لديك أكثر من خادومي تطبيقات، فيجب أن تنشئ حسابات المستخدمين الآن بنفس الكيفية.
للخروج من سطر أوامر MySQL:
exit
اكتمل الآن إعداد خادوم قاعدة البيانات. ننتقل لإعداد خواديم التطبيقات.
إعداد خواديم التطبيقات
تتصل خواديم التطبيق بخادوم قاعدة البيانات. اخترنا ووردبريس للتمثيل في هذا الدليل، وهو تطبيق PHP يعمل على خادوم ويب مثل Apache أو Nginx. سنضبط خادومين متطابقين لتوزيع الحِمل بينهما. تغطّي هذه الفقرة الخطوات الضرورية لإعداد خواديم التطبيق، لكن الموضوع مشروح بتفاصيل أكثر في مقال كيفية إعداد قاعدة بيانات بعيدة لتحسين أداء موقع يستخدِم MySQL انطلاقا من فقرة إعداد خادوم الويب.
تثبيت Apache وPHP
نفذ الأوامر التالية على كل واحد من الخادومين app1
وapp2
لتثبيت Apache وPHP:
sudo apt-get update sudo apt-get -y install apache2 php5-mysql php5 libapache2-mod-php5 php5-mcrypt
إعداد Apache
سنستخدم HAProxy على خادوم موزع الحمل للتعامل مع الاتصال عبر SSL
، مما يعني أننا لا نريد أن يتصل المستخدمون بخادوميْ التطبيقات مباشرة. سنربط Apache بعنوان الشبكة الداخلية الخاص بكل واحد من الخادومين.
نفّذ الأمر التالي على كل من الخادومين، app1
وapp2
:
sudo nano /etc/apache2/ports.conf
ابحث عن السطر الذي توجد فيه العبارة Listen 80
وأضف عنوان خادوم التطبيق الخاص إليها، على النحو التالي (أبدل private_IP
بعنوان IP الخاص بك):
Listen private_IP:80
احفظ الملف ثم أغلقه. يجعل هذا الإعداد خادوم Apache يُنصت لعناوين الشبكة الداخلية فقط؛ ممايعني أنه لا يمكن الوصول إليه عبر عنوان IP العمومي أو اسم المستضيف.
أعد تشغيل Apache لأخذ التغيير في الحسبان:
sudo service apache2 restart
لا يمكن - وفق الإعداد الحالي - الوصول مباشرة إلى خادوم Apache؛ إذ تقتصر الاتصالات التي يقبلها على تلك القادمة من الشبكة الداخلية. سنعدّ - بعد قليل - موزع الحمل لإرسال الطلبات إلى الخواديم.
تنزيل التطبيق وإعداده
اخترنا في هذه السّلسلة ووردبريس مثالا للتطبيق. إن كنت تستخدم تطبيق PHP مغايرا فيجب عليك تنزيله وعمل الإعدادات اللازمة (معلومات الاتصال بقاعدة البيانات على سبيل المثال)؛ ثم انتقل إلى الفقرة الموالية.
نزل أرشيف ووردبريس على خادوم التطبيق الأول، app1
:
cd ~ wget http://wordpress.org/latest.tar.gz
فك ضغط الأرشيف واستخرج ملفات ووردبريس:
tar xvf latest.tar.gz
انتقل إلى مجلّد ووردبريس المُستخرَج:
cd wordpress
يحتاج ووردبريس إلى مجلّد لوضع الملفات التي يحملها فيه؛ فلننشئ هذا المجلّد (wp-content/uploads):
ode>mkdir wp-content/uploads
سنستخدم ملف إعداد ووردبريس النموذجي قالبا للإعداد:
cp wp-config-sample.php wp-config.php
افتح الملف الإعداد من أجل تحريره:
nano wp-config.php
اضبط اتصال ووردبريس بقاعدة البيانات بتحرير المعلومات الميَّزة في الأسطر التالية:
/** The name of the database for WordPress */ define('DB_NAME', 'app'); /** MySQL database username */ define('DB_USER', 'appuser'); /** MySQL database password */ define('DB_PASSWORD', 'password'); /** MySQL hostname */ define('DB_HOST', 'db1.nyc3.example..com');
نضيف الأسطر التالية إلى ملف إعداد ووردبريس لإخباره بأنه خلف وسيط عكسي يستخدم SSL (موزع الحمل يستخدم TLS/SSL للتعميّة):
define('FORCE_SSL_ADMIN', true); if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';
احفظ الملف ثم أغلقه.
تبقّى الآن نقلُ ملفات ووردبريس إلى مجلد يمكن لخادوم الويب الوصول إليه من أجل خدمة الزوار.
نقل ملفات التطبيق إلى جذر المستند Document Root
نحتاج الآن، بعد إعداد التطبيق، لنقل ملفات ووردبريس إلى جذر المستند في Apache حيث يمكن لخادوم الويب الوصول إليها وتقديمها لزوار الموقع. جذر المستند الافتراضي في Apache هو المسار var/www/html/
وهو ما سنستخدمه في مثالنا.
احذف أولا ملف index.html
الافتراضي:
sudo rm /var/www/html/index.html
استخدم أداة rsync
لنسخ ملفات ووردبريس إلى المجلد var/www/html/
اجعل www-data
(الحساب الذي يشتغل به خادوم ويب Apache) مالكَ هذا المجلّد:
sudo rsync -avP ~/wordpress/ /var/www/html sudo chgrp -R www-data /var/www/html/*
أصبح خادوم التطبيق الأول app1
جاهزا؛ سنعد الآن خادوم التطبيق الآخر.
تكرار ملفات التطبيق على الخواديم الأخرى
يتوجب إعداد آلية لتكرار الملفات الموجودة في جذر المستند لخادوم الويب على مختلف الخواديم المكوِّنة للتطبيق؛ من أجل إبقاء ملفات التطبيق متجانسة عبر الخواديم. في حالة ووردبريس فإن استخدام واجهة الويب لتحميل الملفات وتثبيت الإضافات سيجعلها موجودة فقط على الخادوم الذي عالج الطلب. إن لم تكرَّر الملفات على جميع الخواديم فسيرى بعض زوار الموقع صفحات بصور ناقصة وإضافات مكسورة. إن كنت تستخدم تطبيقا آخر غير ووردبريس لا يحفظ بياناته (الملفات المحمَّلة والإضافات المنزّلة مثلا) على خادوم التطبيق فيمكنك الاكتفاء بنقل الملفات إلى الخادوم يدويا مرة واحدة. في هذه الحالة استخدم أداة rsync
لنقل ملفات التطبيق من الخادوم app1
إلى الخادوم app2
.
يمكن استخدام GlusterFS لإنشاء تجزئة قرص مكرَّرة من الملفات الضرورية. الطريقة مشروحة في فقرة مزامنة الملفات في تطبيقات الويب ضمن مقال كيف تستخدم HAProxy لتوزيع الحمل بين خواديم تطبيق ووردبريس. اتبع الخطوات (تجاوز فقرة إعداد ملفات المستضيف لأن خادوم النطاقات لدينا يتولى المهمة) ثم اضبُط تكرار الملفات بين app1
وapp2
.
بعد الانتهاء من إعداد تكرار الملفات بين الخواديم نكون على استعداد لتجهيز موزِّع الحمل.
إعداد موزع الحمل
اخترنا HAProxy موزعا للحمل؛ وسيعمل وسيطا عكسيا لخواديم التطبيق. سيصل المستخدمون إلى التطبيق عبر عنوان شبيه بhttps://www.example.com
بعد المرور بموزع الحمل. تشرح هذه الفقرة الخطوات الضرورية لإعداد خادوم موزِّع للحمل/
نسخ شهادة SSL
نفذ الخطوات التالية على خادوم موزع الحمل، lb1
.
ضع شهادة SSL (أحد متطلبات الجزء الأول من السّلسلة) ومفتاح الشهادة، إضافة لأي شهادات من سلطة وسيطة ضمن ملف pem.
واحد (نفترض أن شهادات SSL موجودة في المجلّد root/certs/
):
cd /root/certs cat www.example.com.crt CAintermediate.ca-bundle www.example.com.key > www.example.com.pem
ثم انسخ ملف pem
إلى المجلّد etc/ssl/private/
:
sudo cp www.example.com.pem /etc/ssl/private/
سيستخدم HAProxy هذا الملف لإنهاء SSL.
تثبيت HAProxy
نفذ الأوامر التالية على خادوم موزع الحمل، lb1
:
sudo add-apt-repository ppa:vbernat/haproxy-1.5 sudo apt-get update sudo apt-get -y install haproxy
إعداد HAProxy
نحتاج لضبط إعداداتٍ عامة في HAProxy إضافة لإنهاء SSL والنهايات الخلفية Backend والأمامية Frontend المناسبة لجعله يعمل مع خواديم التطبيق.
افتح ملف إعداد HAProxy لتحريره:
sudo nano /etc/haproxy/haproxy.cfg
خيارات عامة في إعداد HAProxy
أول ما يجب فعله هو تحديد قيمة معقولة للحد الأعلى لعدد الاتصالات maxconn
. يحدد هذا المتغير عدد الاتصالات الأكبر التي يسمح بها HAProxy في نفس الوقت؛ وهو ما قد يؤثر على جودة الخدمة ويحول دون انهيار خادوم الويب عند محاولته الإجابة على الكثير من الطلبات. يجب أن تبحث وتجرب قيما عدة لإيجاد تلك المناسبة لبيئة عملك. أضف السطر التالي إلى ملف إعداد HAProxy (اخترنا القيمة 2048):
maxconn 2048
أضف السطر التالي لضبط الحجم الأكبر للذاكرة المؤقتة لتخزين مفاتيح التعمية:
tune.ssl.default-dh-param 2048
أضف السطرين التاليين ضمن مقطع defaults
مباشرة بعد السطر الذي توجد به mode http
:
option forwardfor option http-server-close
تفعل الأسطر التالية إذا أضيفت ضمن مقطع defaults
صفحة إحصاءات HAProxy (أبدل user
وpassword
بقيم آمنة):
stats enable stats uri /stats stats realm Haproxy\ Statistics stats auth user:password
يمكن بعد التفعيل عرض إحصاءات HAProxy بالذهاب إلى الصفحة التالية https://www.example.com/stats
.
لم ننته بعد من ملف إعدادات HAProxy، سنضبط في ما يلي إعدادات الوسيط.
إعداد الوسيط في HAProxy
نبدأ بإضافة نهاية أمامية للتعامل مع اتصالات HTTP الواردة. نضيف في نهاية ملف الإعداد نهاية أمامية باسم www-http
عبر الأسطر التالية:
frontend www-http
bind www.example.com:80
reqadd X-Forwarded-Proto:\ http
default_backend app-backend
الهدف من هذا الإعداد هو قبول اتصالات HTTP من أجل توجيهها عبر اتصال HTTPS.
ثم نضيف نهاية أمامية للتعامل مع اتصالات HTTPS، تأكد من تحديد ملف pem
المناسب.
frontend www-https bind www.example.com:443 ssl crt /etc/ssl/private/www.example.com.pem reqadd X-Forwarded-Proto:\ https default_backend app-backend
نستكمل الإعداد بضبط النهاية الخلفية:
backend app-backend redirect scheme https if !{ ssl_fc } server app1 app1.nyc3.example.com:80 check server app2 app2.nyc3.example.com:80 check
تحدد النهاية الخلفية خواديم التطبيقات التي يوزَّع بينها الحمل. يطلب السطر:
redirect scheme https if !{ ssl_fc }
توجيه اتصالات HTTP إلى HTTPS.
احفظ ملف haproxy.cfg
ثم أغلقه. HAProxy جاهز الآن لبدء العمل؛ لكن سنفعل أولا السجلات Logs.
تفعيل سجلات HAProxy
افتح ملف rsyslog
للتحرير:
sudo nano /etc/rsyslog.conf
ابحث عن الأسطر التالية وانزع علامة التعليق من أجل تفعيل بروتوكول UDP عند استقبال سجلات النظام Syslog. تبدو الأسطر كما يلي بعد نزع علامة التعليق:
$ModLoad imudp $UDPServerRun 514 $UDPServerAddress 127.0.0.1
أعد تشغيل خدمة rsyslog
لتفعيل الإعداد الجديد:
sudo service rsyslog restart
سجل HAProxy مفعَّل الآن وسيُنشأ ملف var/log/haproxy.log/
فور بدء عمل HAProxy.
إعادة تشغيل HAProxy
أعد تشغيل HAProxy لأخذ التعديلات في الحسبان.
sudo service haproxy restart
اكتمل الآن إعداد موزع الحِمل، ننتقل لتثبيت التطبيق (ووردبريس).
تثبيت ووردبريس
سيتوجب علينا - قبل البدء في استخدام ووردبريس - تشغيل سكربت التثبيت الذي يهيئ قاعدة البيانات ليستخدمها ووردبريس. أدخل إلى العنوان التالي في المتصفح:
https://www.example.com/wp-admin/install.php
ستظهر شاشة تثبيت ووردبريس. املأء الحقول بما يناسب ثم انقر على زر التثبيت.
بعد انتهاء تثبيت ووردبريس يصبح التطبيق جاهزا للعمل.
خاتمة
اكتمل الآن إعداد الخواديم المكوِّنة للتطبيق، وهذا الأخير جاهز للاستخدام. يمكنك الدخول بحساب المدير كما يمكن لزوار موقعك الوصول إليه عبر HTTPS عند استخدام اسم النطاق المناسب.
تأكد قبل الانتقال إلى الجزء الموالي من الدليل أن التطبيق يعمل بطريقة صحيحة.
ترجمة -وبتصرّف- لمقال Building for Production: Web Applications — Deploying لصاحبه Mitchell Anicas.
حقوق الصورة البارزة: Designed by Freepik.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.