خیلی از پروژه های قدیمی به htaccess. و ماژول های Apache وابسته اند و مهاجرت کامل آنها هزینه دارد. از طرف دیگر Apache در تحویل فایل های ثابت و مدیریت تعداد زیاد اتصال همزمان، به کارایی Nginx نمیرسد. راه میانه این است که Nginx جلو بایستد و فقط درخواست های پویا را به Apache بدهد.
طرح کلی معماری
در این چیدمان Nginx روی پورت های ۸۰ و ۴۴۳ گوش میدهد و تنها نقطه ورود ترافیک است. Apache به پورت ۸۰۸۰ منتقل میشود و فقط روی رابط لوکال هاست گوش میدهد. این جزئیات ظاهرا کوچک اما مهم است: وقتی Apache فقط به 127.0.0.1 متصل باشد، از بیرون اصلا قابل دسترسی نیست و کسی نمیتواند Nginx را دور بزند.
فایل های ثابت مانند تصاویر و اسکریپت ها را مستقیم Nginx تحویل میدهد و اصلا به Apache نمیرسند. بیشترین سود عملکردی همینجاست.
انتقال Apache به پورت داخلی
ابتدا پورتی که Apache روی آن گوش میدهد را تغییر دهید. سپس در فایل ویرچوال هاست هم همان پورت را تنظیم کنید؛ فراموش کردن این مرحله دوم رایج ترین اشتباه این بخش است.
sudo nano /etc/apache2/ports.confListen 127.0.0.1:8080<VirtualHost 127.0.0.1:8080>
ServerName example.com
DocumentRoot /var/www/example.com
</VirtualHost>پیکربندی Nginx به عنوان ریورس پروکسی
حالا Nginx را طوری تنظیم میکنیم که درخواست ها را به Apache بفرستد. هدرهایی که در ادامه می آیند صرفا تزئینی نیستند؛ بدون آنها Apache تصور میکند تمام بازدیدها از خود سرور می آید.
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بازگرداندن آی پی واقعی کاربران در Apache
بعد از این تغییر، لاگ های Apache همه چیز را از آدرس 127.0.0.1 میبینند. این یعنی آمار بازدید بی معنی میشود و ابزارهای امنیتی که بر اساس آی پی تصمیم میگیرند از کار می افتند.
راهنماهای قدیمی برای حل این مشکل ماژول rpaf را پیشنهاد میدهند. آن ماژول سال هاست نگهداری نمیشود و در مخازن نسخه های جدید اوبونتو و دبیان هم وجود ندارد. راه درست امروز استفاده از ماژول remoteip است که خود Apache ارائه میدهد.
sudo a2enmod remoteipRemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1sudo a2enconf remoteip- در فایل apache2.conf هر جا در قالب لاگ h% دیدید، به a% تغییر دهید.
- بدون این تغییر، لاگ همچنان آدرس پروکسی را ثبت میکند نه کاربر را.
- فقط آدرس هایی را به عنوان پروکسی مورد اعتماد معرفی کنید که واقعا پروکسی شما هستند.
تحویل فایل های ثابت توسط Nginx
برای اینکه واقعا از این معماری سود ببرید، فایل های ثابت را قبل از رسیدن به Apache جدا کنید. با این بلاک، تصاویر و فایل های css و js مستقیم از دیسک تحویل داده میشوند و کش مرورگر هم فعال میشود.
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
root /var/www/example.com;
expires 30d;
access_log off;
}گواهی SSL و اعمال نهایی
گواهی را فقط روی Nginx نصب کنید. ارتباط داخلی بین Nginx و Apache روی لوکال هاست است و رمزگذاری دوباره آن فایده ای ندارد. هدر X-Forwarded-Proto که قبلا تنظیم کردیم به برنامه اطلاع میدهد که کاربر از HTTPS آمده است؛ بدون آن، برنامه هایی مثل وردپرس ممکن است در حلقه ریدایرکت بیفتند.
قبل از ری استارت، هر دو پیکربندی را تست کنید. اگر خطایی باشد، همینجا مشخص میشود و سرویس بدون قطعی باقی میماند.
sudo apache2ctl configtest
sudo nginx -tsudo systemctl restart apache2
sudo systemctl restart nginxsudo ss -tlnp | grep -E ':80|:8080|:443'پرسش های پرتکرار
چرا بعد از قرار دادن Nginx جلوی Apache همه بازدیدها از 127.0.0.1 ثبت میشود؟
چون درخواست از طریق پروکسی میرسد. با فعال کردن ماژول remoteip و تنظیم RemoteIPHeader، آدرس واقعی کاربر در لاگ ها بازگردانده میشود.
آیا ماژول rpaf هنوز قابل استفاده است؟
خیر. این ماژول سال هاست نگهداری نمیشود و در مخازن نسخه های جدید اوبونتو و دبیان وجود ندارد. جایگزین درست آن ماژول remoteip است.
گواهی SSL را روی Nginx نصب کنم یا Apache؟
فقط روی Nginx. ارتباط داخلی بین Nginx و Apache روی لوکال هاست انجام میشود و رمزگذاری دوباره آن فایده ای ندارد.
به راهنمای بیشتری نیاز دارید؟
تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.