خب بیایید اول در مورد پیش نیازهامون صحبت کنیم. فرض رو بر این میگیریم که اگر شما دارید این مطلب رو میخوانید، حتماً یک سری چیزا از لحاظ لینوکس میدونید و لازم نیست خیلی وارد جزئیات بشیم.
بیایید پیش نیازهامون رو چک کنیم. کافیه یک کامپیوتر متصل به اینترنت و یک توزیع اوبونتو ۱۸.۰۴ (سرور یا دسکتاپ) نصب شده و یک کاربر با دسترسی Sudo آماده داشته باشید.
همونطور که میدونید، ودرپرس یک سیستم مدیریت محتوای (CMS) متن باز بوده که بر پایهی PHP و MySQL کار میکنه و بههمین دلیل بسیار محبوب و قدرتمنده.
خیلیها ممکنه قصد راهاندازی این سرویس رو داشته باشند و در کنارش کمی چاشنی امنیت و لود بالانسینگ رو هم بخواهند، که اصلاً درخواست عجیبی نیست. اینجاست که میرسیم به Reverse Proxy که هدفش البته فقط ایجاد امنیت نیست. معمولاً reverse proxy server بیشتر به خاطر این سه دلیل استفاده میشه:
ممکنه شما بخواهید از Apache به عنوان وب سرور استفاده کنید که باز هم کاملاً قابل انجام بوده و حتی میتونید هر دوی این وب سرورها رو روی یک سیستم اجرا و راهاندازی کنید. این امر کاملاً سلیقهای بوده و ما در اینجا nginx رو انتخاب کردیم.
ما در اینجا فرض میگیریم دو تا ماشین مجازی دارید که میتونید برای اون از Virtual Box یا Vmware Player روی اوبونتو استفاده کنید؛ یا اصلاً ممکنه شما دو تا سرور مجازی جداگانه داشته باشید که باز هم تفاوتی در اصل ماجرا نداره. ما قصد داریم از یکی به عنوان سرور اصلی که سرویس وردپرس روی آن نصب و راه اندازی میشه و بعدی رو به عنوان سرورReverse Proxy استفاده کنیم.
برای نصب و راه اندازی WordPress روی ماشین اول، شما به یک پیشنیاز مهم به نام LEMP stack نیاز دارید که به مجموعه Linux, Nginx, MySQL/MariaDB, PHP گفته میشه.
قبل از هر چیزی این دستور رو برای بهروز کردن سیستم استفاده کنید؛ و بعدش NginX رو نصب کنید.
sudo apt update && sudo apt upgrade
sudo apt install nginx
بعد از نصب وب سرور Nginx، شما باید سرویس اون رو start و Enable کنید تا همیشه بعد از Reboot هم فعال بشه و خودش شروع به کار کنه:
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
حالا وب سرور نصب شده. قبل از اینکه بریم سراغ مراحل بعدی، بیایید یک فایل تنظیمات هاست مجازی برای وردپرس درست کنیم و اون رو آماده نگه داریم؛ چون قراره به دردمون بخوره:
sudo vi /etc/nginx/sites-available/wordpress.conf
این فایل قراره شامل تنظیمات ماشینی باشه که روی اون وردپرس نصب میشه.
لطفاً یادتون نره اسامی انتخاب شده همه فرضی بوده و شما میتونید هر اسمی که دوست داشتید به جای wordpress.conf انتخاب کنید. حالا اگر فرض بگیریم که این ماشین آیپی ۱۹۲.۱۶۸.۱.۱۰۰ رو به عنوان ماشین A گرفته باشه، در فایل wordpress.conf این تنظیمات رو کپی/ پیست کنید:
server {
listen 80;
listen [::]:80;
server_name wp.localhost wp example example.com;
root /var/www/html/wordpress;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
خب بیایید ببینیم این تنظیمات بالا چی هستند. فایل تنظیمات nginx خیلی ساده ست و بهراحتی میتونید متوجه بشید که قضیه از چه قراره:
فرمت کلی نوشتن تنظیمات داخل کروشه ست و باید حواستون به این باشه آخر هر خط همیشه سِمی کالن (نقطه ویرگول) استفاده میشه.کل تنظیمات با کلمه سرور شروع میشه و بعد از کروشه باز (یعنی این } ) تمامی تنظیمات وارد میشه، که برای اونها هم کروشه جداگانه قرار میدیم و بعد با { کروشه در آخر بسته میشه. در حالت کلی همچین شکلی داره:
http {
server {
# Server configuration
}
}
حالا داخل تنظیمات سرور ما، این بخشها قرار گرفتن:
نشون میده که nginx باید به چه پورت یا پورتهایی گوش بده؛ که در اینجا پورت ۸۰ که برای web هست رو قرار دادیم.
این آدرس فایلهای اصلی سرویس مد نظر ماست (که اینجا وردپرسه) و اینکه وب سرور از چه محلی در هارد دیسک باید دنبال فایلها بگرده.
اولویت فایلهایی که وب سرور در صورت درخواست شدن و در دسترس بودن اونها، باید ارائه بده رو مشخص میکنه.
نشون میده که کدوم آدرس باید بر مبنای درخواستهای ارسالی به سمت سرور استفاده بشه.
نکته: آدرس آیپی عمومی یا نام دامنه شما در این قسمت قرار میگیره که برای مثال ما به عنوان آدرس از wp.localhost استفاده کردیم.شما میتونید فقط کلمه Test یا هر اسمی که دوست دارید رو به عنوان آدرس محلی وبسایت یا سرویستون تعریف کنین. دقت کنید این اسم هر چی شما دلتون بخواد میتونه باشه. اما اگر آیپی عمومی، یا در کل ip یه سرور یا ویپیاس رو دارید، میتونید اینجا هم وارد کنید.
اینکه در این بخش چند تا آدرس بنویسید، یعنی اینکه همه اینا میتونن همون آدرسی باشن که دنبالشیم و وب سرور اینها رو هم بپذیره.
در یک فایل تنظیمات هاست مجازی (Virtual host) برای nginx ممکنه چندین بخش location وجود داشته باشه.
این دستور میتونه در بخشهای مختلف این فایل استفاده بشه؛ اما وقتی بعد از location دستور try_files رو نوشتید، بدونید که شما دارید به وب سرور دستور میدید که فایلهای موجود در آدرس مشخص شده رو بررسی کنه و بر مبنای درخواستهای uri، ببینه مشابه اونها وجود دارن که نمایش بده یا نه. طبیعیه که nginx اگر نتونه فایلی با مشخصات درخواست uri ارسال شده پیدا کنه، خطای ۴۰۴ رو برمیگردونه.
این بخش همونطور که از دستورش مشخصه، مربوط به پروسههای php بوده و اینکه وب سرور باید چطوری با اونها برخورد کنه، چه فایل کانفیگی رو در نظر بگیره و اصلاً از چه سوکتی ( unix:/var/run/php/php7.2-fpm.sock ) استفاده کنه.
در نظر داشته باشید که این فایل میتونه بخشهای مختلف و پیچیدهای داشته باشه که فعلاً مد نظر ما نیست؛ اما شما همیشه میتونید برای اطلاعات تکمیلیتر به اسناد خود nginx به آدرس زیر مراجعه کنید:
https://docs.nginx.com/nginx/admin-guide/web-server/web-server
حالا که کارتون با فایل wordpress.conf تموم شد، فایل رو ذخیره کنید و خارج بشید. حالا باید این Virtual-host رو لینک (symlink) و فعالش کنید، ولی قبلش بهتره برای اینکه در آینده به مشکلی برنخورید تنظیمات default خودِ nginx رو unlink (یا حذف) کنید و بعد سرویس رو Reload کنید:
sudo ln –s /etc/nginx/sites-available/wordpress.conf /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default
$ sudo systemctl reload nginx
خب حالا میرسیم به مرحلهی نصب و راهاندازی MariaDB 10 که البته میتونید همون mysql server رو هم انتخاب کنید که کاملاً به خودتون بستگی داره:
sudo apt install mariadb-server mariadb-client
وقتی نصب تموم شد، باید start و enable کنید:
sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service
بعد از نصب mariadb دستور زیر رو اجرا کنید تا یک سری تنظیمات رو روی سرور انجام بدیم:
sudo mysql_secure_installation
به عنوان اولین سوال، از شما میپرسه که آیا میخوایید تنظیمات افزونه ارزیابی رمز عبور (VALIDATE PASSWORD PLUGIN) (عجب اسم دهن پر کنی ! ) رو انجام بدید؟؟ اما بهتون یه هشدار هم میده که کاملاً به خودتون مربوطه که این افزونه رو فعال کنیدیا نه؛ ولی اگر فعالش کردید نمیتونید هر رمز عبوری که دلتون خواست بدید (مثلاً ۱۲۳ و این جور چیزا !).
توصیهی ما اینه که حتماً و حتماً یک رمز عبور ایمن انتخاب کنید و مثل یک سری از عزیزان اجازه ندید پایگاه داده شما ساعتها و شاید روزها در دسترس عموم قرار بگیره اونم بدون پسورد و بعد نتونید جمعش کنید و بیایید بیانیه بدید و این داستانا …
نکته: برای تولید یک رمز عبور ایمن میتونید از دستور mkpasswd در ترمینال استفاده کنید.
برای بقیه سوالها هم باید Y و بعد Enter بزنید، اما حتماً اونها رو بخونید و بعد میتونید حتی No هم بزنید ! اگر دلتون خواست.
خب حالا که نصبش تموم شد، میرسیم به بخش ساخت یک پایگاه داده (Database) برای وردپرس.
اگر در مرحلهی قبلی پسورد خاصی برای root وارد کردید، اینجا قراره از اون استفاده کنید و بعد از اجرای دستور زیر وارد MySQL بشید.این دستور رو اجرا کنید و بعد رمز عبورتون رو وارد کنید:
sudo mysql –u root -p
دستورات زیر رو به ترتیب وارد کنید و در قسمت ساختن user، به جای passworde_amne_shoma، یک پسورد امن به دلخواه خودتون برای کاربری وردپرس (لطفا رمز اصلی root رو که قبلا انتخاب کردید برای این کاربری انتخاب نکنید و خلاق تر باشید!) انتخاب و وارد کنید:
CREATE DATABASE wordpress;
CREATE USER ‘wp_user’@’localhost’ IDENTIFIED BY ‘passworde_amne_shoma’ ;
GRANT ALL ON wordpress.* TO ‘wp_user’@’localhost’ ;
FLUSH PRIVILEGES;
EXIT;
برای نصب و راهاندازی php فقط کافیه این دستور رو اجرا کنید:
sudo apt install php-fpm php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-intl php-mysql php-cli php-ldap php-zip php-curl
و مثل همه سرویسهای دیگه، start و enable کنید تا همیشه فعال بمونه:
sudo systemctl start php7.2-fpm
sudo systemctl enable php7.2-fpm
اینجا فقط باید آخرین نسخهی وردپرس رو دانلود و نصب کنید:
cd /tmp && wget http://wordpress.org/latest.tar.gz
بعدش این فایل فشرده رو باز کنید. دقت کنید که اسم این فایل latest.tar.gz فرضی وارد شده و داخل دستور زیر اسم فایل رو درست وارد کنید، که با یه ls گرفتن داخل دایرکتوری tmp/ میتونید اسمشو دقیق ببینید چون داخل مسیر tmp/ دانلودش میکنیم:
sudo tar -xvzf latest.tar.gz -C /var/www/html
حالا با اجرای این دو دستور بالا ما در واقع فایلهای root رو که داخل تنظیمات Virtual host نوشته بودیم، ساختیم؛ و فقط باید مالکیت این فایل رو به گروه www-data بدیم:
sudo chown www-data: /var/www/html/wordpress/ -R
حالا تقریباً همه چیز آماده است تا نصب وردپرس رو با انجام تنظیماتش کامل کنیم. فقط یادتون باشه اگر یک دامنه ثبت نشده یا اصلاً دامنهای استفاده میکنید که وجود نداره (وفقط local هست)، باید اون دامنه رو داخل فایل /etc/hosts خودتون تعریف کنید. اگر فعلاً فقط دارید امتحان میکنید و مثل من یاد میگیرید، میتونید یه خطی مثل اینو وارد انتهای فایل etc/hosts/ خودتون بکنید:
۱۹۲.۱۶۸.۱.۱۰۰ wp.localhost wp
یادتون هست تو مرحله ۲ داخل فایل wordpress.conf آدرس wp.localhost رو بهعنوان اسم سرور انتخاب کردیم؟
حالا با فرض اینکه آیپی سرور شما ۱۹۲.۱۶۸.۱.۱۰۰ بوده و از دامنه localhost خودتون به نام wp.localhost استفاده میکنید، کافیه که مرورگرتون رو اجرا کرده و این آدرس رو وارد کنید و بعد میتونید تنظیمات رو انجام بدید:
http://wp.localhost
البته ممکنه شما هم مثل من روی سرور دسترسی به GUI نداشته باشید که در اونصورت میتونید از مرورگر داخل Terminal مثل links2 استفاده کنید و همونجا تنظیمات رو انجام بدید. برای تنظیمات وردپرس هم باید به شکل زیر عمل کنید:
در مرحله اول زبان مورد نظرتون رو انتخاب کنید که البته فارسی هم بین اونها هست.
بعد باید اطلاعات پایگاه داده (database) وردپرس رو بهش بدید:
و بعد از وارد کردن اینا میرسید به مرحله انتخاب عنوان وبسایت، دامنه، نام و کلمه عبور مدیر سایت.
بعد از تکمیل این مرحله کار ما با ورد پرس تموم شده و شما میتونید وارد وبسایتتون بشید و صفحاتتون رو تغییر بدید و افزونه نصب کنید و …
نکته: اگر دیدید صفحاتتون عجیب و غریب لود میشه، میتونید داخل وردپرس لاگین کنید و بجای آدرس مثلا wp.local، آی پی ماشین رو بهش بدید. با انجام این کار در بخش Setting و وارد کردن آیپی در URL های دو قسمت WordPress Address و Site Address (مثلا ۱۹۲.۱۶۸.۱.۱۰۰) صفحات بهدرستی لود خواهند شد.
یادتون نره تا به اینجا ما هر کاری که کردیم روی ماشین اولمون (A) بوده که فقط wordpress روی اون راه اندازی شده و آماده ست. حالا میریم سراغ راهاندازی Reverse Proxy .
امیدواریم تا به اینجا از این برنامه مثلا مفرح و زیبا لذت برده باشید :)) ولی هنوز قسمت اصلی مونده! برای راهاندازی reverse proxy server فقط باید چند تا کار جزئی انجام بدید. در واقع ما فقط قصدمون فعلاً بالا بردن امنیت وبسایتمون و رفع خطرات و حملات احتمالیه. پس فقط کافیه با تنظیمات reverse proxy که خود nginx فراهم میکنه، این کار رو انجام بدیم.
فرض میکنیم روی ماشین دوم (B) هم، دقیقاً همون Ubuntu 18.04 راهاندازی شده و آی پی اون ۱۹۲.۱۶۸.۱.۱۰۱ باشه.
اول مثل ماشین قبلی Nginx رو نصب کنید.
بعد با این دستور یه فایل تنظیمات Virtual Host (که فرض کنیم باز به همون اسم درست شده) ایجاد میکنیم. چون دو تا ماشین جدا هستند، هیچ اشکالی نداره اسامی هاست مجازی یکی باشه؛ ولی بازم هر اسمی که خواستید، میتونید انتخاب کنید:
sudo vi /etc/nginx/sites-available/wordpress.conf
و این تنظیمات رو وارد کنید :
server {
listen 80;
listen [::]:80;
server_name 192.168.1.101;
location / {
proxy_pass http://192.168.1.100/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
}
}
حالا میرسیم به اینکه این تنظیمات پروکسی چی هستند و چی کار میکنند؟
بخش Server و listen رو که قبلاً توضیح دادیم. اما قسمت مهم ماجرا اینجاست که وقتی دارید خط server_name رو تعریف میکنید، باید آدرس یا ip اون ماشینی رو بدید که میخواهید reverse بشه.
در واقع سرور reverse proxy در خواستهای مربوط به سرور اصلی رو کنترل کنه و به اونها جواب بده و همین امر باعث میشه که در عمل سرور اصلی شما که وبسایت و پایگاه داده شما روی اون هست (سرور backend)، در دسترس دیگران نباشه. به همین خاطر server_name 192.168.1.101 رو باید به عنوان نام سرور مورد نظرتون تعریف کنید.
بعد از اون میرسیم به بخش location که برای پروکسیها تعریف شده. هر کدوم از این خطوط وظایف خاصی دارن که خلاصهوار بهشون اشاره میکنیم.
مثلاً خط proxy_pass http://192.168.1.100 داره به سرور میگه که هر درخواستی اومد سمت من، خودم به عنوان پروکسی بعد از process کردن در این location تعریف شده، بفرست به این آدرسی که میگم. حالا این آدرس میتونه هر سرور دیگهای باشه که شما میخواهید پروکسی بشه.
“proxy_set_header” که در این بخش میبینید هر کدوم از اینها میتونن Header های خاصی رو در درخواستهایی که به سمت سرور میاد پروکسی کنند. در حالت Default، وب سرور Nginx خودش دو بخش یا دوتا فیلد (Field) رو از Header های داخل درخواستهای رسیده، بازنگری میکنه. یکی Host و اون یکی Connection، و اونهایی که Header فیلد هاشون خالی باشن رو حذف میکنه. توی این تنظیمات، Host به متغیر محیطی proxy_host$ (یا host$) اشاره میکنه و فیلد connection با دستور Close ست شده. حالا برای اینکه بتونیم این تنظیمات Default (پیش فرض) رو تغییر بدیم، میتونیم از دستور proxy_set_header در تنظیماتمون استفاده کنیم. این دستور میتونه همراه با یک location وارد بشه یا حتی در تنظیمات کلی سرور set بشه. بقیه تنظیمات وارد شده هم سلیقهای هستن و هر کدوم در شرایط خاصی کار میکنن که من خودم به دلخواه استفاده کردم.
حالا که کارتون با فایل تنظیمات تموم شد میتونید فایل رو ذخیره کنید و خارج بشید.
بعد از تمامی این اتفاقات میتونید با وارد کردن آدرس http://192.168.1.101 که آدرس سرور Reverse Proxy شماست به صفحات WordPress دسترسی داشته باشی و دیگه نیازی نیست که نگران دسترسی افراد مختلف به وب سرور اصلی و پایگاه داده تون باشید 🙂
امیدوارم لذت برده باشید. اگر دوست داشتید با یک گروه مطمئن و حرفهای کار کنید با فناوران شبکه سینداد تماس بگیرید. در هر زمان در خدمت شما هستیم، فقط کافیه یه تیکت به تیم پشتیبانی ما با عنوان Reverse Proxy بفرستید و ما میتونیم تمامی این سرویسها رو براتون راهاندازی کنیم:
جمع آوری شده توسط:
حمید نبی زاده – یک تازه کار مشتاق در دنیای زیبای لینوکس و شبکه.
سینداد یعنی هدیهی سیمرغ، یا فرزند سیمرغ؛ به عبارتی یعنی خود سیمرغ، با همه ی شگفتی هایش، اما جوانتر و سرزنده تر. و این چیزی است که ما سعی می کنیم در سینداد باشیم. از سال ۱۳۸۵ دانش مان را به صورت خدماتی در حوزه ی هاستینگ، شبکه و تولید نرم افزار در اختیار مشتریان مان قرار داده ایم و به این افتخار می کنیم که تک تک آنها تا به امروز همراه ما مانده اند. باور داریم که سینداد صرفاً یک شرکت نیست، بلکه نوعی باور است به ارائه ی شگفت انگیز از هر چیز.