توزیع وب اپلیکیشن ها در محیط Production – راهنمای جامع
در این بخش از سلسله مطالب در مورد توزیع اپلیکیشن های وب و به عنوان یک نمونه از اپلیکیشن PHP وردپرس به همراه تنظیم یک DNS خصوصی در محیط production صحبت میکنیم.
کاربران این اپلیکیشن از طریق پروتکل HTTPS و یک نام دامنه برای مثال «https://www.example.com» به این اپلیکیشن دسترسی خواهند داشت. این دامنه به سرور توزیع بار (load balancer) ما اشاره میکند. سرور توزیع بار نیز به عنوان یک پراکسی معکوس برای سرورهای اپلیکیشن ما که به سرور پایگاه داده متصل هستند، عمل میکند. DNS خصوصی به ما اجازه میدهد که از نامها برای اشاره به آدرسهای شبکه خصوصی استفاده کنیم که فرایند پیکربندی سرورها را بسیار تسهیل میکند.
در این بخش از راهنما اجزایی را راهاندازی میکنیم که در شش سرور مورد اشاره فوق قرار دارند. فهرست این شش سرور به صورت زیر است:
- DNS خصوصی (ns1 و ns2)
- سرور پایگاه داده (db1)
- سرورهای اپلیکیشن (app1 و app2)
- سرور توزیع بار (lb1)
کار خود را با تنظیم DNS آغاز میکنیم.
سرورهای DNS خصوصی
با استفاده از نام به جای آدرس میتوان سرورهایی را که با آنها سروکار داریم را به وسیله نام شناسایی کنیم. این وضعیت برای نگهداری اپلیکیشنهای در مقیاس بزرگ ضروری است، زیرا میتوانید یک سرور را با بهروزرسانی رکوردهای DNS به سادگی تعویض کنید و لازم نیست فایلهای پیکربندی مختلف را که در آنها آدرسهای IP مورد اشاره قرار گرفتهاند بهروزرسانی کنید. در این راهنما ما DNS خودمان را راهاندازی میکنیم و میتوانیم آدرسهای شبکه خصوصی سرورهایمان را به جای آدرس IP با نام مورد اشاره قرار دهیم.
ما با استفاده از نامهای میزبانی (hostname) تحت زیردامنه nyc3.example.com به آدرسهای شبکه خصوصی هر سرور ارجاع میدهیم. برای نمونه، آدرس شبکه خصوصیِ سرور پایگاه داده میتواند به صورت db1.nyc3.example.com باشد که به آدرس IP خصوصی آن resolve میشود. توجه داشته باشید که زیردامنه مثال تقریباً به طور کامل دلخواه است و معمولاً بر اساس سازماندهی منطقی تعیین میشود. ما در مثال خودمان از db1.nyc3.example.com برای اشاره به سرورهایی که در دیتاسنتر nyc3 قرار دارند استفاده میکنیم و example.com نام دامنه اپلیکیشن ما است.
پیکربندی سرورهای DNS خصوصی خارج از حیطه این مقاله است و به این منظور میتوانید از مقالات دیگر مجله فرادرس کمک بگیرید.
در هر صورت زمانی که سرورهای DNS را تنظیم کردید دو سرور BIND به نامهای ns1 و ns2 خواهید داشت. اگر از قبل همه آدرسهای IP خصوصی خود را میدانید، آنها را هم اینک در ردیف DNS اضافه کنید؛ در غیر این صورت رکوردهای DNS مناسب را هنگام ایجاد سرورها اضافه کنید. اینک آماده هستیم تا سرور پایگاه داده خود را راهاندازی کنیم.
راهاندازی سرور پایگاه داده
از آنجا که میخواهیم از سرور توزیع بار (load balancer) برای ارتباط با سرورهای اپلیکیشن یعنی سرورهایی که تنها آپاچی و PHP را اجرا میکنند، کمک بگیریم. باید پایگاه داده را با جداسازی سرور آن، از اپلیکیشن جدا کنیم. جداسازی پایگاه داده از اپلیکیشن، گامی ضروری پیش از مقیاسبندی افقی بسیاری از انواع اپلیکیشنها محسوب میشود. در این بخش، همه مراحل مورد نیاز برای راهاندازی سرور پایگاه داده بررسی میشوند.
نصب MySQL
سرور MySQL را در سرور پایگاه داده به نام db1، نصب میکنیم:
sudo apt-get update sudo apt-get -y install mysql-server
رمز عبور root مورد نظر خود برای MySQL را در زمان ظاهر شدن اعلان مربوطه وارد کنید. سپس دستور زیر را وارد کنید:
sudo mysql_install_db sudo mysql_secure_installation
باید رمز عبور مدیر MySQL را که در مرحله قبل تعیین کردید وارد نمایید. پس از آن از شما خواسته میشود که این رمز عبور را تغییر دهید. اگر N را وارد کنید، نشان میدهد که از رمز عبور کنونی راضی هستید. به بقیه سؤالها میتوانید با مقادیر پیشفرض پاسخ دهید.
پیکربندی MySQL برای گوش دادن به رابط شبکه خصوصی
فایل پیکربندی MySQL را باز کنید:
sudo vi /etc/mysql/my.cnf
تنظیمات bind-address را یافته و آن را به آدرس شبکه خصوصی سرور پایگاه داد خود تغییر دهید:
bind-address = db1.nyc3.example.com
ذخیره کرده و خارج شوید. سپس MySQL را ریاستارت کنید:
sudo service mysql restart
تنظیم پایگاه داده و کاربران پایگاه داده
اینک باید پایگاه داده را ایجاد کرده و کاربران آن را که سرورهای اپلیکیشن برای اتصال استفاده میکنند، تنظیم کنید. بدین منظور وارد کنسول MySQL شوید:
mysql -u root -p
در اعلان رمز عبورِ root را برای MySQL وارد کنید. در ادامه میتوانید پایگاه داده اپلیکیشن را ایجاد کنید:
CREATE DATABASE app;
MySQL کاربران خود را به سرورهایی که باید به آنها وصل شوند مربوط میکند. در این مثال ما باید دو سرور اپلیکیشن داشته باشیم که کاربران به آنها وصل میشوند و از این رو باید برای هر یک باید یک کاربر ایجاد کنیم. یک کاربر پایگاه داده به نام appuser ایجاد میکنیم که میتواند از آدرس شبکه خصوصی هر کدام از سرورهای اپلیکیشن app1 و app2 به این پایگاه داده وصل شود. میتوان از رمز عبور واحد برای هر کدام از کاربرها استفاده کرد.
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 است که از طریق وبسروری مانند آپاچی یا NginX سرو میشود. از آنجا که میخواهیم سرورهای اپلیکیشن را در پس یک سرور توزیع بار قرار دهیم دو سرور مشابه هم ایجاد میکنیم. در این بخش همه مراحل ضروری برای راهاندازی سرورهای اپلیکیشن ذکر خواهند شد.
نصب آپاچی و پیاچپی
روی هر دو سرور app1 و app2 نرمافزارهای آپاچی و پیاچپی را نصب کنید:
sudo apt-get update sudo apt-get -y install apache2 php5-mysql php5 libapache2-mod-php5 php5-mcrypt
پیکربندی آپاچی
ما از HAproxy روی سرور توزیع بار استفاده میکنیم تا پروتکل SSL را اجرا کند، از این رو نمیخواهیم کاربران مستقیماً به سرورهای اپلیکیشن ما دسترسی داشته باشند. بدین ترتیب آپاچی را به آدرس شبکه خصوصی هر یک از سرورها متصل میکنیم.
روی هر سرور اپلیکیشن app1 و app2، فایل پیکربندی پورتهای آپاچی را باز کنید. به طور پیشفرض این فایل همان ports.conf است:
sudo vi /etc/apache2/ports.conf
خطی که به صورت listen 80 است را پیدا کنید و آدرس IP را به آن اضافه کنید:
Listen private_IP:80
فایل را ذخیره کرده و خارج شوید. بدین ترتیب آپاچی را طوری تنظیم کردهاید که تنها به رابط شبکه خصوصی گوش دهد یعنی کسی از بیرون و با آدرس IP عمومی یا نام میزبانی نمیتواند به آن دسترسی داشته باشد. آپاچی را ریاستارت کنید تا تغییرات اعمال شوند:
sudo service apache2 restart
آپاچی اینک از طریق آدرس شبکه خصوصی در دسترس سرورهای اپلیکیشن شما است. در بخشهای بعدی سرور توزیع بار را راهاندازی میکنیم تا کاربران درخواستهای خود را به آن بفرستند.
دانلود و پیکربندی اپلیکیشن
در این مثال از وردپرس به عنوان اپلیکیشن خود استفاده میکنیم. اگر شما از اپلیکیشن PHP دیگری استفاده میکنید آن را دانلود کرده و پیکربندیهای مشابهی را روی آن اجرا کنید. در سرور اول به نام app1 فایل فشرده وردپرس را به صورت زیر دانلود کنید:
cd ~ wget http://wordpress.org/latest.tar.gz
آن را از حالت فشرده خارج سازید:
tar xvf latest.tar.gz
به دایرکتوری مربوطه بروید:
cd wordpress
وردپرس یک دایرکتوری برای آپلودهای خود نیاز دارید. بنابراین آن را میسازیم:
mkdir wp-content/uploads
ما از فایل پیکربندی نمونه وردپرس به عنوان قالب استفاده میکنیم. آن را به مکان مناسبی کپی کنید:
mkdir wp-content/uploads
اینک فایل پیکربندی را برای ویرایش باز کنید:
vi 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');
از آنجا که قصد داریم از رمزنگاری TLS/SSL روی سرور توزیع بار استفاده کنیم باید خطوط زیر را نیز اضافه کنیم تا وردپرس بداند که در پس یک پراکسی معکوس قرار دارد که از SSL استفاده میکند:
define('FORCE_SSL_ADMIN', true); if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';
همچنین باید کلیدها و salt-ها را بهروزرسانی کنیم. بدین منظور باید ابتدا کوکیها را اعتبارزدایی (invalidate) کنیم. این موضوع خارج از حیطه این مقاله است، اما باید اطمینان حاصل کنید که این موارد روی هر دو سرور اپلیکیشن یکسان هستند. در ادامه فایل را ذخیره کرده و ببندید. وردپرس اینک پیکربندی شده است؛ اما باید در مکان مناسبی کپی شود تا نرمافزار وبسرور بتواند آن را عرضه کند.
کپی کرد فایلهای اپلیکیشن به ریشه سند
اکنون که اپلیکیشن پیکربندی شده است باید آن را به ریشه سند (Document Root) آپاچی کپی کنیم تا بازدیدکنندگان بتوانند وبسایت را ملاحظه کنند. مکان پیشفرض ریشه سند در وبسرور آپاچی دایرکتوری var/www/html/ است بنابراین در این مثال از این دایرکتوری استفاده خواهیم کرد. ابتدا فایل پیشفرض index.html را حذف کنید:
sudo rm /var/www/html/index.html
سپس از rsync برای کپی کردن فایلهای وردپرس به var/www/html/ استفاده کنید و مطمئن شوید که www-data مالکیت آنها را دارد:
sudo rsync -avP ~/wordpress/ /var/www/html sudo chgrp -R www-data /var/www/html/
سرور اپلیکیشن اول ما به نام app1 اینک راهاندازی شده است. در ادامه سرور دوم را راهاندازی میکنیم.
کپی فایلهای اپلیکیشن به سرورهای دیگر
برای این که فایلهای اپلیکیشن در میان سرورهای مختلف اپلیکیشن شما یکسان باقی بمانند، بهتر است فرایند کپی فایل را در ریشه سند وبسرور خود اجرا کنید. در مورد وردپرس با استفاده از رابط وب برای آپلود فایلها و نصب افزونهها، فایلهای مختلف روی یک سرور اصلی که درخواست را پردازش میکند ذخیره میشوند. اگر این فایلها به همه سرورها کپی شوند برخی از کاربران با صفحههایی مواجه خواهند شد که دارای تصاویر ناقص یا افزونههای از کار افتاده هستند. اگر اپلیکیشن PHP شما وردپرس نیست و هیچ دادهای به صورت تصویر یا افزونه روی سرور اپلیکیشن آن ذخیره نشده است، میتوانید فایلهای نصب را به صورت دستی یک بار برای همیشه به سرورهای دیگر کپی کنید. اما در صورتی که چنین وضعیتی وجود دارد باید از rsymc برای کپی کردن فایلهای اپلیکیشن از app1 به app2 استفاده کنید.
میتوان از GlusterFS برای ایجاد برای ایجاد درایوهای کپی از فایلهای ضروری استفاده کرد که البته بررسی این گزینه نیز خارج از حیطه این مقاله است. در هر صورت میتوانید برای همگامسازی فایلهای اپلیکیشن از راهنماهای مختلف که به این منظور وجود دارد استفاده کنید. زمانی که فرایند کپی کردن فایلها به طرز صحیحی اجرا شد، میتوان گفت هر دو سرور اپلیکیشن به طرز صحیحی پیکربندی شدهاند. اینک نوبت راهاندازی سرور توزیع بار است.
راهاندازی سرور توزیع بار (Load Balancer)
سرور توزیع بار به اجرای نرمافزار HAProxy میپردازد که به عنوان یک توزیع بار پراکسی معکوس برای سرورهای اپلیکیشن ما عمل میکند. کاربران اپلیکیشن از طریق این سرور توزیع بار و با مراجعه به دامنهای مانند «https://www.example.com» به اپلیکیشن ما دسترسی خواهند داشت. در این بخش همه مراحل ضروری برای راهاندازی سرور توزیع بار مورد اشاره قرار گرفته است:
کپی کردن گواهی SSL
این مراحل را روی سرور توزیع بار lb1 اجرا کنید. در آن دایرکتوری که شامل گواهی SSL است، فایلهای گواهی، هر گونه گواهی CA میانی و کلیدهای گواهی را به یک فایل منفرد.pem کپی کنید. برای مثال:
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/
این فایل برای خاتمه SSL از سوی HAProxy مورد استفاده قرار میگیرد.
نصب HAProxy
در سرور توزیع بار lb1 نرمافزار HAProxy را نصب کنید:
sudo add-apt-repository ppa:vbernat/haproxy-1.5 sudo apt-get update sudo apt-get -y install haproxy
اینک به پیکربندی HAProxy میپردازیم.
پیکربندی HAProxy
ما باید HAProxy را با برخی تنظیمات معقول، خاتمه SSL، و فرانتاند و بکاندهای مناسب پیکربندی کنیم تا مطمئن شویم که با سرورهای اپلیکیشن به درستی کار میکند. فایل پیکربندی HAProxy را برای ویرایش باز کنید:
sudo vi /etc/haproxy/haproxy.cfg
پیکربندی HAProxy: تنظیمات عمومی
نخستین کاری که در این مرحله باید انجام دهیم این است که مقدار maxconn را به یک عدد معقول تنظیم کنیم. این تنظیمات تعیین میکند که چه تعداد اتصال همزمان به HAProxy مجاز است و میتواند بر روی کیفیت خدمات ارائه شده و همچنین جلوگیری از کرش کردن وبسرور در نتیجه تلاش برای خدمترسانی به درخواستهای بسیار زیاد جلوگیری کند. برای این که بدانید چه مقدار برای محیط شما مناسب است باید کمی با تنظیمات خود آشنا باشید. خط زیر را به همراه عددی که فکر میکنید برای شما مناسب است به بخش global پیکربندی اضافه کنید.
maxconn 2048
در ادامه خط زیر را برای تعیین اندازه بیشینه کلیدهای موقت DHE که تولید میشوند اضافه کنید:
tune.ssl.default-dh-param 2048
سپس در بخش پیشفرضها، خطوط زیر را در زیر خطی که mode http نوشته است اضافه کنید:
option forwardfor option http-server-close
اگر دوست دارید صفحه آمار HAProxy را فعال کنید، خطوط زیر را به بخش پیشفرضها اضافه کنید. باید مقدار نام کاربری و رمز عبور خود را جایگزین نمایید:
stats enable stats uri /stats stats realm Haproxy\ Statistics stats auth user:password
بدین ترتیب میتوانید با مراجعه به صفحه https://www.example.com/stats آمار مربوط به HAProxy را ملاحظه کنید.
در این مرحله فایل پیکربندی را نبندید، چون پیکربندی پراکسی را در بخش بعدی اضافه میکنیم.
پیکربندی HAProxy: پراکسیها
نخستین کاری که در این مرحله باید انجام دهید، این است که یک فرانتاند برای مدیریت اتصالهای HTTP ورودی اضافه کنید. در انتهای این فایل، یک فرانتاند که www-http نام دارد اضافه میکنیم:
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
هدف از این فایل پذیرش اتصالهای 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 تعیین میکند که ترافیک HTTP باید به HTTPS ریدایرکت شود. اینک میتوانید فایل haproxy.cfg را ذخیره کرده و ببندید. HAProxy اکنون آماده آغاز به کار است؛ اما ابتدا باید امکان گزارشگیری (logging) را فعال کنیم.
فعالسازی گزارشگیری HAProxy
فایل پیکربندی ryslog را باز کنید:
sudo vi /etc/rsyslog.conf
سپس خطوط زیر را یافته و آنها از حالت کامنت خارج کنید تا بتوانید پذیرش syslog به صورت UDP را فعال کنید. زمانی که این کار را انجام دادید فایل به صورت زیر در خواهد آمد:
$ModLoad imudp $UDPServerRun 514 $UDPServerAddress 127.0.0.1
اینک rsyslog را ریاستارت کنید تا پیکربندی جدید فعال شود:
sudo service rsyslog restart
گزارشگیری HAProxy اینک فعال شده است. فایل لاگ زمانی که HAProxy آغاز به کار کند، در دایرکتوری /var/log/haproxy.log ایجاد میشود.
ریاستارت کردن HAProxy
sudo service haproxy restart
اینک سرور توزیع بار ما آماده است. در مرحله بعد باید اسکریپت نصب اپلیکیشن را اجرا کنیم.
نصب وردپرس
ما باید اسکریپت نصب وردپرس را اجرا کنیم که پایگاه داده را پیش از آن که بتوانیم مورد بهرهبرداری قرار دهیم، برای استفاده از آن آماده میکند. سایت خود را در یک مرورگر وب باز کنید:
https://www.example.com/wp-admin/install.php
بدین ترتیب با صفحه نصب وردپرس مواجه میشوید. فرم را پر کرده و بر روی دکمه «Install WordPress» کلیک کنید. پس از این که وردپرس نصب شد، اپلیکیشن آماده استفاده است.
سخن پایانی
در این راهنما همه سرورهایی که اپلیکیشن ما را تشکیل میدهند، راهاندازی شدند و این اپلیکیشن در حال حاضر آماده استفاده است. شما میتوانید به صورت کاربر admin وارد وبسایت شده و کاربران نیز میتوانند از طریق HTTPS و وارد کردن نام دامنه صحیح از آن استفاده کنند. در این مرحله باید اپلیکیشن خود را به طور کامل تست کنید تا قبل از رفتن به مراحل بعدی مطمئن شوید که کارکردی همانند انتظار دارد. در بخش بعدی این سلسله آموزش طرح بازیابی (recovery plan) را برای این راهنمای توزیع نهایی اپلیکیشن معرفی میکنیم.
اگر این نوشته مورد توجه شما قرار گرفته است، پیشنهاد میکنیم موارد زیر را نیز ملاحظه کنید:
- تنظیم سرورهای محیط توزیع نهایی (Production) برای وب اپلیکیشن — راهنمای مقدماتی
- مجموعه آموزش های پروژه محور برنامه نویسی
- مجموعه آموزشهای مهندسی نرم افزار
- انتخاب پلتفرم مناسب برای ساخت اپلیکیشن — رایانه شخصی، وب، موبایل یا کراسپلتفرم
- ۱۵ اپلیکیشن برتر اندروید برای آموزش برنامهنویسی
==