بازگشت به مجله
وب سرورتیم فنی هایوهاست۱۲ دقیقه مطالعه

اجرای همزمان Nginx و Apache روی یک سرور

ترکیب سرعت Nginx در تحویل فایل های ثابت با انعطاف Apache در اجرای برنامه های قدیمی، بدون از دست دادن آی پی واقعی کاربران.

ریورس پروکسی

خیلی از پروژه های قدیمی به htaccess. و ماژول های Apache وابسته اند و مهاجرت کامل آنها هزینه دارد. از طرف دیگر Apache در تحویل فایل های ثابت و مدیریت تعداد زیاد اتصال همزمان، به کارایی Nginx نمیرسد. راه میانه این است که Nginx جلو بایستد و فقط درخواست های پویا را به Apache بدهد.

1

طرح کلی معماری

در این چیدمان Nginx روی پورت های ۸۰ و ۴۴۳ گوش میدهد و تنها نقطه ورود ترافیک است. Apache به پورت ۸۰۸۰ منتقل میشود و فقط روی رابط لوکال هاست گوش میدهد. این جزئیات ظاهرا کوچک اما مهم است: وقتی Apache فقط به 127.0.0.1 متصل باشد، از بیرون اصلا قابل دسترسی نیست و کسی نمیتواند Nginx را دور بزند.

فایل های ثابت مانند تصاویر و اسکریپت ها را مستقیم Nginx تحویل میدهد و اصلا به Apache نمیرسند. بیشترین سود عملکردی همینجاست.

مسیر درخواست از مرورگر به Nginx و سپس Apache روی پورت داخلی
Nginx تنها نقطه ورود است و Apache فقط از لوکال هاست در دسترس قرار دارد.
2

انتقال Apache به پورت داخلی

ابتدا پورتی که Apache روی آن گوش میدهد را تغییر دهید. سپس در فایل ویرچوال هاست هم همان پورت را تنظیم کنید؛ فراموش کردن این مرحله دوم رایج ترین اشتباه این بخش است.

ویرایش فایل پورت ها
sudo nano /etc/apache2/ports.conf
به جای Listen 80 این خط را بگذارید
Listen 127.0.0.1:8080
ویرچوال هاست را هم به همان پورت تغییر دهید
<VirtualHost 127.0.0.1:8080>
    ServerName example.com
    DocumentRoot /var/www/example.com
</VirtualHost>
3

پیکربندی Nginx به عنوان ریورس پروکسی

حالا Nginx را طوری تنظیم میکنیم که درخواست ها را به Apache بفرستد. هدرهایی که در ادامه می آیند صرفا تزئینی نیستند؛ بدون آنها Apache تصور میکند تمام بازدیدها از خود سرور می آید.

فایل /etc/nginx/sites-available/example.com
server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1: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/example.com /etc/nginx/sites-enabled/
sudo nginx -t
4

بازگرداندن آی پی واقعی کاربران در Apache

بعد از این تغییر، لاگ های Apache همه چیز را از آدرس 127.0.0.1 میبینند. این یعنی آمار بازدید بی معنی میشود و ابزارهای امنیتی که بر اساس آی پی تصمیم میگیرند از کار می افتند.

راهنماهای قدیمی برای حل این مشکل ماژول rpaf را پیشنهاد میدهند. آن ماژول سال هاست نگهداری نمیشود و در مخازن نسخه های جدید اوبونتو و دبیان هم وجود ندارد. راه درست امروز استفاده از ماژول remoteip است که خود Apache ارائه میدهد.

فعال سازی ماژول
sudo a2enmod remoteip
فایل /etc/apache2/conf-available/remoteip.conf
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1
فعال سازی پیکربندی
sudo a2enconf remoteip
  • در فایل apache2.conf هر جا در قالب لاگ h% دیدید، به a% تغییر دهید.
  • بدون این تغییر، لاگ همچنان آدرس پروکسی را ثبت میکند نه کاربر را.
  • فقط آدرس هایی را به عنوان پروکسی مورد اعتماد معرفی کنید که واقعا پروکسی شما هستند.
5

تحویل فایل های ثابت توسط Nginx

برای اینکه واقعا از این معماری سود ببرید، فایل های ثابت را قبل از رسیدن به Apache جدا کنید. با این بلاک، تصاویر و فایل های css و js مستقیم از دیسک تحویل داده میشوند و کش مرورگر هم فعال میشود.

افزودن به بلاک server
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
    root /var/www/example.com;
    expires 30d;
    access_log off;
}
6

گواهی SSL و اعمال نهایی

گواهی را فقط روی Nginx نصب کنید. ارتباط داخلی بین Nginx و Apache روی لوکال هاست است و رمزگذاری دوباره آن فایده ای ندارد. هدر X-Forwarded-Proto که قبلا تنظیم کردیم به برنامه اطلاع میدهد که کاربر از HTTPS آمده است؛ بدون آن، برنامه هایی مثل وردپرس ممکن است در حلقه ریدایرکت بیفتند.

قبل از ری استارت، هر دو پیکربندی را تست کنید. اگر خطایی باشد، همینجا مشخص میشود و سرویس بدون قطعی باقی میماند.

تست پیکربندی هر دو سرویس
sudo apache2ctl configtest
sudo nginx -t
اعمال تغییرات
sudo systemctl restart apache2
sudo systemctl restart nginx
بررسی اینکه هر کدام روی پورت درست هستند
sudo ss -tlnp | grep -E ':80|:8080|:443'

پرسش های پرتکرار

چرا بعد از قرار دادن Nginx جلوی Apache همه بازدیدها از 127.0.0.1 ثبت میشود؟

چون درخواست از طریق پروکسی میرسد. با فعال کردن ماژول remoteip و تنظیم RemoteIPHeader، آدرس واقعی کاربر در لاگ ها بازگردانده میشود.

آیا ماژول rpaf هنوز قابل استفاده است؟

خیر. این ماژول سال هاست نگهداری نمیشود و در مخازن نسخه های جدید اوبونتو و دبیان وجود ندارد. جایگزین درست آن ماژول remoteip است.

گواهی SSL را روی Nginx نصب کنم یا Apache؟

فقط روی Nginx. ارتباط داخلی بین Nginx و Apache روی لوکال هاست انجام میشود و رمزگذاری دوباره آن فایده ای ندارد.

به راهنمای بیشتری نیاز دارید؟

تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.

گفتگو با پشتیبانی

ادامه یادگیری

مشاهده همه