مقدمه
Apache و Nginx دو وبسرور متنباز و بسیار محبوب هستند که معمولاً در کنار PHP استفاده میشوند. در برخی سناریوها، زمانی که چندین وبسایت با نیازهای متفاوت روی یک سرور میزبانی میشوند، اجرای همزمان این دو وبسرور روی یک ماشین مجازی میتواند بسیار مفید باشد.
روشهای رایج برای اجرای دو وبسرور روی یک سیستم عبارتاند از:
- استفاده از چند آدرس IP
- استفاده از پورتهای متفاوت
سرورهایی که از IPv4 و IPv6 پشتیبانی میکنند میتوانند سایتهای Apache را روی یک پروتکل و سایتهای Nginx را روی پروتکل دیگر ارائه دهند، اما با توجه به فراگیر نبودن IPv6 در بسیاری از ISPها، این راهکار همیشه عملی نیست.
راهکار دیگر استفاده از پورتهای متفاوت مانند 81 یا 8080 است؛ اما استفاده از URLهایی مانند زیر چندان ایدهآل نیست:
http://your_domain:8080
در این آموزش، Nginx را بهعنوان:
- وبسرور
- Reverse Proxy برای Apache
روی یک سرور Ubuntu 20.04 پیکربندی خواهیم کرد.
همچنین برای اینکه Apache بتواند به درستی پشت Reverse Proxy کار کند، ماژولی به نام mod_rpaf نصب خواهیم کرد که برخی متغیرهای محیطی را بازنویسی میکند تا Apache تصور کند درخواستها مستقیماً از سمت کاربران دریافت شدهاند.
در این آموزش چهار دامنه را روی یک سرور میزبانی میکنیم:
دامنههای Nginx
nginx1.your_domain
nginx2.your_domain
دامنههای Apache
apache1.your_domain
apache2.your_domain
همچنین Apache را به گونهای تنظیم میکنیم که برنامههای PHP را از طریق PHP-FPM اجرا کند که نسبت به mod_php عملکرد بهتری ارائه میدهد.
پیشنیازها
برای انجام این آموزش به موارد زیر نیاز دارید:
- یک سرور Ubuntu 20.04
- کاربر غیر Root با دسترسی sudo
- فایروال فعال
- چهار دامنه که به IP سرور اشاره کنند
مرحله اول: نصب Apache و PHP-FPM
ابتدا فهرست بستهها را بهروزرسانی کنید:
sudo apt update
سپس Apache و PHP-FPM را نصب نمایید:
sudo apt install apache2 php-fpm
برای پشتیبانی از FastCGI نیز ماژول زیر را نصب میکنیم:
wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
مرحله دوم: پیکربندی Apache و PHP-FPM
در این مرحله Apache را از پورت پیشفرض 80 به پورت 8080 منتقل میکنیم.
ابتدا فایل تنظیمات پورت را تغییر نام دهید:
sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
فایل جدید ایجاد کنید:
echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
سپس Virtual Host پیشفرض را غیرفعال کنید:
sudo a2dissite 000-default
یک Virtual Host جدید بسازید:
sudo cp /etc/apache2/sites-available/000-default.conf \
/etc/apache2/sites-available/001-default.conf
فایل را ویرایش کنید:
sudo nano /etc/apache2/sites-available/001-default.conf
و مقدار زیر را قرار دهید:
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
فعالسازی سایت:
sudo a2ensite 001-default
بارگذاری مجدد Apache:
sudo systemctl reload apache2
برای بررسی پورت در حال استفاده:
sudo apt install net-tools
sudo netstat -tlpn
باید خروجی مشابه زیر مشاهده شود:
tcp6 0 0 :::8080 :::* LISTEN apache2
این یعنی Apache روی پورت 8080 فعال است.
مرحله سوم: تنظیم Apache برای استفاده از mod_fastcgi
ابتدا ماژول actions را فعال کنید:
sudo a2enmod actions
فایل پیکربندی FastCGI را تغییر نام دهید:
sudo mv /etc/apache2/mods-enabled/fastcgi.conf \
/etc/apache2/mods-enabled/fastcgi.conf.default
فایل جدید بسازید:
sudo nano /etc/apache2/mods-enabled/fastcgi.conf
و محتوای زیر را قرار دهید:
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/apache2/fastcgi
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fcgi
Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi \
-socket /run/php/php7.4-fpm.sock \
-pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
بررسی صحت تنظیمات:
sudo apachectl -t
اگر پیام زیر نمایش داده شد:
Syntax OK
Apache را ریلود کنید:
sudo systemctl reload apache2
مرحله چهارم: تست عملکرد PHP
فایل تست PHP ایجاد کنید:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
پورت 8080 را در فایروال باز کنید:
sudo ufw allow 8080
همچنین اجازه دسترسی به HTTP و HTTPS:
sudo ufw allow "Apache Full"
بررسی وضعیت:
sudo ufw status
سپس آدرس زیر را باز کنید:
http://your_server_ip:8080/info.php
اگر صفحه phpinfo() نمایش داده شد و در بخش:
Server API
مقدار:
FPM/FastCGI
را مشاهده کردید، یعنی Apache و PHP-FPM به درستی کار میکنند.
مرحله ۵: ایجاد Virtual Host برای Apache
اکنون دو Virtual Host مجزا برای Apache ایجاد میکنیم تا دامنههای apache1.your_domain و apache2.your_domain را میزبانی کنند.
ابتدا پوشههای ریشه سایتها را ایجاد کنید:
sudo mkdir -v /var/www/apache1.your_domain
sudo mkdir -v /var/www/apache2.your_domain
سپس برای هر سایت یک فایل HTML آزمایشی ایجاد کنید:
echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html
همچنین فایلهای تست PHP را ایجاد کنید:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php
فایل پیکربندی Virtual Host اول را ایجاد کنید:
sudo nano /etc/apache2/sites-available/apache1.your_domain.conf
محتوای زیر را قرار دهید:
<VirtualHost *:8080>
ServerName apache1.your_domain
ServerAlias www.apache1.your_domain
DocumentRoot /var/www/apache1.your_domain
<Directory /var/www/apache1.your_domain>
AllowOverride All
</Directory>
</VirtualHost>
برای دامنه دوم نیز فایل زیر را ایجاد کنید:
sudo nano /etc/apache2/sites-available/apache2.your_domain.conf
و تنظیمات زیر را قرار دهید:
<VirtualHost *:8080>
ServerName apache2.your_domain
ServerAlias www.apache2.your_domain
DocumentRoot /var/www/apache2.your_domain
<Directory /var/www/apache2.your_domain>
AllowOverride All
</Directory>
</VirtualHost>
سایتها را فعال کنید:
sudo a2ensite apache1.your_domain
sudo a2ensite apache2.your_domain
سپس تنظیمات را بررسی و Apache را ریلود کنید:
sudo apachectl -t
sudo systemctl reload apache2
اکنون هر دو سایت باید از طریق پورت 8080 در دسترس باشند.
مرحله ۶: نصب و پیکربندی Nginx
Nginx را نصب کنید:
sudo apt install nginx
سپس Virtual Host پیشفرض را حذف کنید:
sudo rm /etc/nginx/sites-enabled/default
پوشههای سایتهای Nginx را ایجاد کنید:
sudo mkdir -v /usr/share/nginx/nginx1.your_domain
sudo mkdir -v /usr/share/nginx/nginx2.your_domain
فایلهای تست را ایجاد کنید:
echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
سپس برای هر سایت یک Server Block تعریف کنید و آنها را در مسیر sites-enabled فعال نمایید.
پس از پایان تنظیمات:
sudo nginx -t
sudo systemctl reload nginx
اکنون دامنههای Nginx به صورت مستقیم توسط Nginx سرو میشوند.
مرحله ۷: تنظیم Nginx به عنوان Reverse Proxy برای Apache
اکنون باید Nginx را طوری تنظیم کنیم که درخواستهای مربوط به دامنههای Apache را به پورت 8080 فوروارد کند.
فایل زیر را ایجاد کنید:
sudo nano /etc/nginx/sites-available/apache
محتوای آن:
server {
listen 80;
server_name apache1.your_domain
www.apache1.your_domain
apache2.your_domain
www.apache2.your_domain;
location / {
proxy_pass http://YOUR_SERVER_IP:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
سپس آن را فعال کنید:
sudo ln -s /etc/nginx/sites-available/apache \
/etc/nginx/sites-enabled/apache
و تنظیمات را بررسی نمایید:
sudo nginx -t
sudo systemctl reload nginx
از این لحظه کاربران از طریق Nginx به سایتهای Apache متصل میشوند.
مرحله ۸: نصب و پیکربندی mod_rpaf
هنگامی که Apache پشت Reverse Proxy قرار میگیرد، آدرس IP واقعی کاربران از بین میرود. ماژول mod_rpaf این مشکل را برطرف میکند.
پیشنیازهای کامپایل را نصب کنید:
sudo apt install unzip build-essential apache2-dev
سپس آخرین نسخه ماژول را دانلود و نصب نمایید:
wget https://github.com/gnif/mod_rpaf/archive/stable.zip
unzip stable.zip
cd mod_rpaf-stable
make
sudo make install
فایل بارگذاری ماژول:
sudo nano /etc/apache2/mods-available/rpaf.load
محتوا:
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
فایل تنظیمات:
sudo nano /etc/apache2/mods-available/rpaf.conf
محتوا:
<IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_Header X-Real-IP
RPAF_ProxyIPs YOUR_SERVER_IP
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
</IfModule>
فعالسازی ماژول:
sudo a2enmod rpaf
sudo apachectl -t
sudo systemctl reload apache2
اکنون Apache آدرس IP واقعی کاربران را مشاهده خواهد کرد.
مرحله ۹: فعالسازی HTTPS با Let’s Encrypt
برای دریافت گواهی SSL، Certbot را نصب کنید:
sudo snap install --classic certbot
برای دامنه اول:
sudo certbot \
--agree-tos \
--no-eff-email \
--email you@example.com \
--nginx \
-d apache1.your_domain \
-d www.apache1.your_domain
برای دامنه دوم:
sudo certbot \
--agree-tos \
--no-eff-email \
--email you@example.com \
--nginx \
-d apache2.your_domain \
-d www.apache2.your_domain
پس از پایان، وبسایتها از طریق HTTPS در دسترس خواهند بود.
مرحله ۱۰: مسدود کردن دسترسی مستقیم به Apache
از آنجا که Apache روی پورت 8080 اجرا میشود، بهتر است دسترسی مستقیم به آن را مسدود کنیم:
sudo iptables -I INPUT \
-p tcp \
--dport 8080 \
! -s YOUR_SERVER_IP \
-j REJECT \
--reject-with tcp-reset
با این کار فقط Nginx قادر به ارتباط با Apache خواهد بود.
مرحله ۱۱: سرو فایلهای استاتیک توسط Nginx
Nginx در سرو فایلهای استاتیک مانند:
- تصاویر
- فایلهای CSS
- فایلهای JavaScript
بسیار سریعتر از Apache عمل میکند.
به همین دلیل بهتر است Nginx مستقیماً این فایلها را سرو کند و فقط درخواستهای PHP را به Apache ارسال نماید.
نمونه پیکربندی:
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://YOUR_SERVER_IP:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
دستور try_files ابتدا فایل را در Nginx جستجو میکند و در صورت پیدا نشدن، درخواست را به Apache ارسال میکند.
برای محافظت از فایلهای حساس Apache نیز از این بخش استفاده کنید:
location ~ /\.ht {
deny all;
}
این تنظیم از دسترسی کاربران به فایلهایی مانند .htaccess و .htpasswd جلوگیری میکند.
نتیجهگیری
در این آموزش یاد گرفتیم چگونه روی یک سرور Ubuntu 20.04:
- Apache و Nginx را همزمان اجرا کنیم.
- Nginx را به عنوان Reverse Proxy برای Apache پیکربندی کنیم.
- PHP-FPM را برای افزایش عملکرد فعال کنیم.
- با استفاده از mod_rpaf آدرس IP واقعی کاربران را به Apache منتقل کنیم.
- گواهی SSL رایگان Let’s Encrypt را راهاندازی کنیم.
- دسترسی مستقیم به Apache را مسدود کنیم.
- سرو فایلهای استاتیک را به Nginx بسپاریم تا سرعت و کارایی وبسایت افزایش یابد.
این معماری ترکیبی، مزایای هر دو وبسرور را در اختیار شما قرار میدهد؛ سرعت بالای Nginx در کنار انعطافپذیری و سازگاری گسترده Apache.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران