میزبانی چند سایت و زیردامنه روی یک سرور nginx

با nginx می‌توانید ده‌ها سایت را روی یک سرور و یک IP اجرا کنید. nginx بر اساس هدر Host تشخیص می‌دهد کدام server block پاسخ دهد. هر سایت فایل کانفیگ، پوشه و لاگ جدا دارد.

وب‌سرور و SSLمتوسط8 دقیقه

۱ساختار پیشنهادی

برای هر سایت یک پوشه و یک فایل کانفیگ به نام دامنه بسازید تا مدیریت راحت شود.

text
/var/www/site-a.com/html
/var/www/site-b.com/html
/etc/nginx/sites-available/site-a.com
/etc/nginx/sites-available/site-b.com
/var/log/nginx/site-a.com.access.log

۲کانفیگ سایت اول و دوم

هر سایت server_name متفاوت دارد. nginx بر اساس نام دامنه انتخاب می‌کند.

nginx
# /etc/nginx/sites-available/site-a.com
server {
    listen 80;
    server_name site-a.com www.site-a.com;
    root /var/www/site-a.com/html;
    index index.html;
    location / { try_files $uri $uri/ =404; }
    access_log /var/log/nginx/site-a.com.access.log;
    error_log  /var/log/nginx/site-a.com.error.log;
}

# /etc/nginx/sites-available/site-b.com
server {
    listen 80;
    server_name site-b.com www.site-b.com;
    root /var/www/site-b.com/html;
    index index.html;
    location / { try_files $uri $uri/ =404; }
    access_log /var/log/nginx/site-b.com.access.log;
    error_log  /var/log/nginx/site-b.com.error.log;
}

۳فعال‌سازی هر دو سایت

لینک‌ها را بسازید، تست کنید و reload کنید.

bash
sudo ln -s /etc/nginx/sites-available/site-a.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site-b.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

۴زیردامنه‌ها (wildcard) با پوشه‌های جدا

اگر هر زیردامنه پوشهٔ خودش را دارد می‌توانید با یک server block همهٔ آن‌ها را پوشش دهید. نام زیردامنه در متغیر sub ذخیره می‌شود.

nginx
server {
    listen 80;
    server_name ~^(?<sub>[a-z0-9-]+)\.example\.com$;

    root /var/www/subdomains/$sub;
    index index.html;

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

برای HTTPS روی wildcard باید گواهی wildcard با اعتبارسنجی DNS بگیرید.

۵سایت پیش‌فرض برای دامنه‌های ناشناس

درخواست‌هایی که به IP سرور یا دامنهٔ ناشناس می‌رسند را رد کنید تا ربات‌ها سایت‌های شما را با IP پیدا نکنند.

nginx
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

۶اسکریپت ساده برای افزودن سایت جدید

این اسکریپت پوشه، کانفیگ و لینک را می‌سازد. آن را با sudo اجرا کنید: ./add-site.sh example.org

bash
#!/usr/bin/env bash
set -euo pipefail
DOMAIN="$1"
mkdir -p "/var/www/$DOMAIN/html"
cat > "/etc/nginx/sites-available/$DOMAIN" <<EOF
server {
    listen 80;
    server_name $DOMAIN www.$DOMAIN;
    root /var/www/$DOMAIN/html;
    index index.html;
    location / { try_files \$uri \$uri/ =404; }
    access_log /var/log/nginx/$DOMAIN.access.log;
    error_log  /var/log/nginx/$DOMAIN.error.log;
}
EOF
ln -sf "/etc/nginx/sites-available/$DOMAIN" "/etc/nginx/sites-enabled/$DOMAIN"
nginx -t && systemctl reload nginx
echo "سایت $DOMAIN ساخته شد."

۷دریافت SSL برای همهٔ سایت‌ها

certbot را برای هر دامنه اجرا کنید؛ تمدید همه با یک تایمر انجام می‌شود.

bash
sudo certbot --nginx -d site-a.com -d www.site-a.com
sudo certbot --nginx -d site-b.com -d www.site-b.com
sudo certbot certificates

پرسش‌های پرتکرار دربارهٔ میزبانی چند سایت و زیردامنه روی یک سرور nginx

چند سایت را می‌توان روی یک سرور اجرا کرد؟

به منابع (رم، CPU، دیسک) و ترافیک بستگی دارد نه به nginx. nginx می‌تواند صدها server block را مدیریت کند؛ محدودیت واقعی برنامه‌ها و دیتابیس هر سایت است.