راهنمای کامل تنظیم Nginx سرور بلاک برای چند سایت

با تنظیم Nginx سرور بلاک، چند دامنه را روی یک سرور میزبانی کنید. آموزش گام‌به‌گام پیکربندی، رفع خطاهای رایج و بهینه‌سازی performance.

۵ دقیقه به‌روزرسانی ۲۸ مرداد ۱۴۰۵

چرا به Nginx سرور بلاک نیاز دارید؟

اگر یک سرور دارید و می‌خواهید چند وب‌سایت با دامنه‌های مختلف روی آن اجرا کنید، Nginx سرور بلاک (Server Block) راه‌حل استاندارد و کارآمدی است. این قابلیت که معادل Virtual Host در Apache است، به شما اجازه می‌دهد برای هر دامنه، پیکربندی جداگانه‌ای شامل ریشه اسناد (Document Root)، تنظیمات SSL، قوانین ریدایرکت و محدودیت‌های دسترسی تعریف کنید.

بدون استفاده از سرور بلاک، Nginx به‌طور پیش‌فرض همه درخواست‌ها را به یک دایرکتوری واحد هدایت می‌کند. این یعنی اگر دو دامنه مختلف را به IP سرورتان اشاره دهید، هر دو محتوای یکسانی نشان می‌دهند. با تنظیم صحیح Nginx سرور بلاک، می‌توانید منابع سرور را بهینه مصرف کنید و هر سایت را مستقل مدیریت کنید.

پیش‌نیازهای تنظیم Nginx سرور بلاک

قبل از شروع، مطمئن شوید موارد زیر را دارید:

  • دسترسی root یا کاربر با sudo به سرور لینوکسی (Ubuntu/Debian یا CentOS/RHEL)
  • Nginx نصب‌شده (نسخه 1.18 یا بالاتر توصیه می‌شود)
  • دو دامنه که رکورد A آن‌ها به IP سرور شما اشاره می‌کند (مثلاً example.com و example.org)
  • محتوای وب‌سایت‌ها در دایرکتوری‌های جداگانه

برای نصب Nginx در Ubuntu، از دستور زیر استفاده کنید:

sudo apt update
sudo apt install nginx -y

در CentOS/RHEL:

sudo yum install nginx -y

ساختار دایرکتوری‌ها برای چند سایت

بهترین روش این است که برای هر دامنه یک دایرکتوری مجزا ایجاد کنید. این کار مدیریت فایل‌ها و دسترسی‌ها را ساده‌تر می‌کند. ساختار پیشنهادی به این شکل است:

/var/www/
├── example.com/
│   ├── html/
│   │   └── index.html
│   └── logs/
└── example.org/
    ├── html/
    │   └── index.html
    └── logs/

برای ایجاد این ساختار، دستورات زیر را اجرا کنید:

sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/example.com/logs
sudo mkdir -p /var/www/example.org/html
sudo mkdir -p /var/www/example.org/logs

سپس یک فایل index.html ساده در هر دایرکتوری بسازید تا بتوانید نتیجه را تست کنید:

echo "<h1>Welcome to Example.com</h1>" | sudo tee /var/www/example.com/html/index.html
echo "<h1>Welcome to Example.org</h1>" | sudo tee /var/www/example.org/html/index.html

ایجاد فایل‌های Nginx سرور بلاک

در Nginx، فایل‌های پیکربندی معمولاً در دایرکتوری /etc/nginx/sites-available/ قرار می‌گیرند و با یک لینک نمادین به /etc/nginx/sites-enabled/ فعال می‌شوند. این روش به شما امکان می‌دهد سایت‌ها را بدون حذف فایل اصلی، غیرفعال کنید.

پیکربندی اولین دامنه

یک فایل جدید برای example.com ایجاد کنید:

sudo nano /etc/nginx/sites-available/example.com

محتوای زیر را در آن قرار دهید:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm index.nginx-debian.html;

    access_log /var/www/example.com/logs/access.log;
    error_log /var/www/example.com/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

توضیح بخش‌های مهم:

  • listen 80 – گوش دادن به پورت 80 (HTTP)
  • server_name – نام دامنه‌هایی که این بلوک به آن‌ها پاسخ می‌دهد
  • root – مسیر ریشه اسناد برای این سایت
  • try_files – بررسی وجود فایل درخواستی و در صورت نبود، بازگرداندن 404

پیکربندی دومین دامنه

حالا فایل دوم را برای example.org ایجاد کنید:

sudo nano /etc/nginx/sites-available/example.org

محتوای مشابه با تغییرات لازم:

server {
    listen 80;
    listen [::]:80;
    server_name example.org www.example.org;

    root /var/www/example.org/html;
    index index.html index.htm;

    access_log /var/www/example.org/logs/access.log;
    error_log /var/www/example.org/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

فعال‌سازی و تست پیکربندی

برای فعال کردن سرور بلاک‌ها، لینک نمادین ایجاد کنید:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example.org /etc/nginx/sites-enabled/

قبل از اعمال تغییرات، همیشه پیکربندی را تست کنید:

sudo nginx -t

اگر همه‌چیز درست باشد، خروجی شبیه این خواهد بود:

nginx: configuration file /etc/nginx/nginx.conf test is successful

سپس Nginx را ری‌استارت کنید:

sudo systemctl reload nginx

حالا با مراجعه به http://example.com و http://example.org باید محتوای متفاوت هر سایت را ببینید.

خطای رایج: تداخل سرور بلاک پیش‌فرض

یکی از مشکلات متداول، تداخل با فایل پیش‌فرض Nginx است. فایل /etc/nginx/sites-enabled/default معمولاً به عنوان catch-all عمل می‌کند و ممکن است درخواست‌های شما را به دایرکتوری اشتباه هدایت کند.

راه‌حل: اگر نمی‌خواهید از سایت پیش‌فرض استفاده کنید، آن را غیرفعال کنید:

sudo rm /etc/nginx/sites-enabled/default

سپس دوباره تست و ری‌استارت کنید.

افزودن SSL با Let's Encrypt

برای امنیت سایت‌ها، حتماً SSL فعال کنید. ابزار certbot این کار را خودکار انجام می‌دهد:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

برای دامنه دوم:

sudo certbot --nginx -d example.org -d www.example.org

certbot به‌طور خودکار تنظیمات SSL را به فایل سرور بلاک اضافه می‌کند و ریدایرکت HTTP به HTTPS را فعال می‌کند. بعد از اجرا، فایل پیکربندی example.com شبیه این خواهد شد:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

بهینه‌سازی performance برای چند سایت

وقتی چند سایت روی یک سرور دارید، مدیریت منابع حیاتی است. چند نکته کاربردی:

فعال‌سازی gzip

فشرده‌سازی پاسخ‌ها باعث کاهش پهنای باند مصرفی می‌شود. در فایل /etc/nginx/nginx.conf مطمئن شوید این تنظیمات وجود دارد:

gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss;

تنظیم کش برای فایل‌های استاتیک

برای هر سرور بلاک می‌توانید کش مرورگر را فعال کنید:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

محدود کردن rate برای جلوگیری از سوءاستفاده

اگر یکی از سایت‌ها ترافیک سنگین یا حملات brute-force دارد، محدودیت نرخ اضافه کنید:

limit_req_zone $binary_remote_addr zone=sitelimit:10m rate=5r/s;

server {
    # ... بقیه تنظیمات
    location /login {
        limit_req zone=sitelimit burst=10 nodelay;
    }
}

عیب‌یابی مشکلات رایج

اگر سایت‌ها درست کار نمی‌کنند، این مراحل را بررسی کنید:

  1. بررسی DNS: مطمئن شوید دامنه‌ها به IP سرور اشاره می‌کنند: dig example.com +short
  2. بررسی فایروال: پورت‌های 80 و 443 باز باشند: sudo ufw status
  3. بررسی لاگ‌ها: فایل‌های خطا را ببینید: sudo tail -f /var/log/nginx/error.log
  4. تست با curl: هدرها را بررسی کنید: curl -I http://example.com

یک اشتباه رایج دیگر، فراموش کردن www در server_name است. اگر کاربر با www وارد شود و شما آن را تعریف نکرده باشید، به سایت پیش‌فرض هدایت می‌شود. همیشه هر دو نسخه را اضافه کنید یا یک ریدایرکت 301 از www به non-www تنظیم کنید.

جمع‌بندی

تنظیم Nginx سرور بلاک برای چند سایت، مهارتی ضروری برای هر مدیر سروری است. با این روش می‌توانید چند دامنه را روی یک سرور با پیکربندی مستقل، لاگ‌های جداگانه و تنظیمات امنیتی متفاوت مدیریت کنید. این کار نه‌تنها هزینه‌ها را کاهش می‌دهد، بلکه انعطاف‌پذیری بالایی در مدیریت زیرساخت فراهم می‌کند.

اگر به دنبال زیرساختی مقیاس‌پذیر برای میزبانی چند سایت هستید، سرورهای ابری ServerNet با امکان مدیریت آسان و منابع قابل ارتقا می‌توانند انتخاب مناسبی باشند. با پیکربندی صحیح Nginx سرور بلاک، از حداکثر ظرفیت سرور خود استفاده خواهید کرد.

آیا این مطلب برایتان مفید بود؟