پیکربندی Nginx به عنوان وب‌سرور و Reverse Proxy برای Apache روی Ubuntu 20.04

مقدمه

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.

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *