راهاندازی Reverse Proxy با Nginx؛ چند سایت روی یک سرور
فرض کنید روی یک سرور هم یک سایت وردپرسی دارید، هم یک برنامه Node روی پورت ۳۰۰۰ و هم یک پنل مدیریت روی پورت ۸۰۸۰. کاربران نمیتوانند و نباید شماره پورت را در آدرس وارد کنند. راهحل استاندارد «reverse proxy» است: Nginx جلوی همه قرار میگیرد و بر اساس دامنه، هر درخواست را به سرویس درست میفرستد.
Reverse proxy یعنی چه؟
Nginx روی پورتهای ۸۰ و ۴۴۳ گوش میدهد و تنها نقطه ورود است. وقتی درخواستی میآید، بر اساس نام دامنه تصمیم میگیرد آن را به کدام سرویس داخلی بفرستد. مزایا:
- چند سایت و برنامه روی یک IP و یک سرور
- مدیریت متمرکز SSL — گواهی فقط روی Nginx نصب میشود
- امنیت بیشتر: سرویسها فقط روی
127.0.0.1گوش میدهند و مستقیماً از اینترنت در دسترس نیستند - امکان افزودن کش، فشردهسازی و محدودیت نرخ درخواست در یک نقطه
نصب Nginx
apt update && apt install nginx -y
systemctl enable --now nginx
ساخت اولین پیکربندی proxy
برای برنامهای که روی پورت ۳۰۰۰ اجرا میشود:
nano /etc/nginx/sites-available/app1
server {
listen 80;
server_name app1.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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;
}
}
فعالسازی:
ln -s /etc/nginx/sites-available/app1 /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
هدر X-Forwarded-For مهم است؛ بدون آن برنامه شما IP همه کاربران را 127.0.0.1 میبیند.
افزودن سایت دوم
برای هر سایت یک فایل جدا بسازید. مثلاً یک سایت PHP معمولی:
server {
listen 80;
server_name shop.example.com;
root /var/www/shop;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
حالا دو دامنه روی یک سرور و یک IP کار میکنند و Nginx بر اساس server_name تفکیک میکند.
پشتیبانی از WebSocket
اگر برنامه شما از WebSocket استفاده میکند (چت زنده، Socket.io، ترمینال تحت وب)، این دو هدر ضروری است:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
}
بدون proxy_http_version 1.1 و هدر Upgrade، اتصال WebSocket برقرار نمیشود.
هدایت مسیرها به سرویسهای مختلف
میتوانید روی یک دامنه، مسیرهای مختلف را به سرویسهای مختلف بفرستید:
server {
listen 80;
server_name example.com;
location / {
root /var/www/frontend;
try_files $uri /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
این الگو برای سایتهای تکصفحهای (React/Vue) با بکاند جدا بسیار رایج است.
فعال کردن SSL برای همه دامنهها
apt install certbot python3-certbot-nginx -y
certbot --nginx -d app1.example.com -d shop.example.com
Certbot بهصورت خودکار برای هر دامنه بلاک https میسازد و ریدایرکت http به https را اضافه میکند.
بهینهسازیهای مفید
فشردهسازی gzip در /etc/nginx/conf.d/gzip.conf:
gzip on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml image/svg+xml;
کش فایلهای ثابت:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
محدود کردن حجم آپلود:
client_max_body_size 20m;
عیبیابی
- 502 Bad Gateway: سرویس پشت proxy اجرا نیست یا روی پورت دیگری گوش میدهد. با
ss -tlnpبررسی کنید. - 504 Gateway Timeout: پاسخ سرویس طولانی شده؛
proxy_read_timeoutرا بیشتر کنید. - سایت اشتباه باز میشود: اگر دامنه با هیچ
server_nameنخواند، Nginx اولین بلاک را نشان میدهد. یک بلاک پیشفرض بسازید. - همیشه قبل از ریلود،
nginx -tبزنید تا سایتهای در حال کار خراب نشوند.
جمعبندی
با reverse proxy میتوانید دهها سایت و سرویس را روی یک سرور مجازی اجرا کنید و همه را با دامنه و SSL در دسترس بگذارید. این کار هم در هزینه صرفهجویی میکند و هم مدیریت را سادهتر. برای شروع کار با Nginx مقاله نصب و راهاندازی Nginx را ببینید.
اگر هنوز سرور ندارید، میتوانید از صفحه پلنهای سرور مجازی ایران یک سرور با تحویل آنی تهیه کنید؛ سرور بلافاصله پس از پرداخت و در کمتر از یک دقیقه تحویل داده میشود.
سرور مجازی ایران با تحویل آنی میخواهید؟
تحویل خودکار در کمتر از یک دقیقه، دیتاسنتر داخل ایران، دسترسی کامل root و پشتیبانی 24 ساعته.
مشاهده پلنها و قیمتها