چرا به 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;
}
}
عیبیابی مشکلات رایج
اگر سایتها درست کار نمیکنند، این مراحل را بررسی کنید:
- بررسی DNS: مطمئن شوید دامنهها به IP سرور اشاره میکنند:
dig example.com +short - بررسی فایروال: پورتهای 80 و 443 باز باشند:
sudo ufw status - بررسی لاگها: فایلهای خطا را ببینید:
sudo tail -f /var/log/nginx/error.log - تست با curl: هدرها را بررسی کنید:
curl -I http://example.com
یک اشتباه رایج دیگر، فراموش کردن www در server_name است. اگر کاربر با www وارد شود و شما آن را تعریف نکرده باشید، به سایت پیشفرض هدایت میشود. همیشه هر دو نسخه را اضافه کنید یا یک ریدایرکت 301 از www به non-www تنظیم کنید.
جمعبندی
تنظیم Nginx سرور بلاک برای چند سایت، مهارتی ضروری برای هر مدیر سروری است. با این روش میتوانید چند دامنه را روی یک سرور با پیکربندی مستقل، لاگهای جداگانه و تنظیمات امنیتی متفاوت مدیریت کنید. این کار نهتنها هزینهها را کاهش میدهد، بلکه انعطافپذیری بالایی در مدیریت زیرساخت فراهم میکند.
اگر به دنبال زیرساختی مقیاسپذیر برای میزبانی چند سایت هستید، سرورهای ابری ServerNet با امکان مدیریت آسان و منابع قابل ارتقا میتوانند انتخاب مناسبی باشند. با پیکربندی صحیح Nginx سرور بلاک، از حداکثر ظرفیت سرور خود استفاده خواهید کرد.