سامانه فعالآپتایم 99.9%دیتاسنتر: ایران / مبین‌وانتحویل آنی و خودکار
← بلاگ

راه‌اندازی Reverse Proxy با Nginx؛ چند سایت روی یک سرور

2 مرداد 1405

فرض کنید روی یک سرور هم یک سایت وردپرسی دارید، هم یک برنامه 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 را ببینید.

اگر هنوز سرور ندارید، می‌توانید از صفحه پلن‌های سرور مجازی ایران یک سرور با تحویل آنی تهیه کنید؛ سرور بلافاصله پس از پرداخت و در کمتر از یک دقیقه تحویل داده می‌شود.

Nginxآموزشسرور مجازیوب‌سرور

سرور مجازی ایران با تحویل آنی می‌خواهید؟

تحویل خودکار در کمتر از یک دقیقه، دیتاسنتر داخل ایران، دسترسی کامل root و پشتیبانی 24 ساعته.

مشاهده پلن‌ها و قیمت‌ها