بازگشت به مجله
وب سرورتیم فنی هایوهاست۹ دقیقه مطالعه

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

با server block میتوانید چند دامنه را روی یک سرور اجرا کنید؛ به شرطی که سرور پیشفرض و جداسازی لاگ ها را درست تنظیم کنید.

چند دامنه

یک سرور مجازی معمولی به راحتی میتواند چند سایت را همزمان میزبانی کند. مکانیزم آن در Nginx بلاک server است: برای هر دامنه یک بلاک تعریف میکنید و Nginx بر اساس نام دامنه درخواست را به بلاک درست هدایت میکند. آنچه معمولا فراموش میشود، تعریف بلاک پیشفرض است که مشکلات عجیبی ایجاد میکند.

1

ساختار پوشه ها

برای هر سایت یک پوشه جداگانه بسازید. این جداسازی بعدا در تنظیم دسترسی ها و پشتیبان گیری کار را ساده میکند.

ساخت پوشه ها و تنظیم مالکیت
sudo mkdir -p /var/www/site-one/public
sudo mkdir -p /var/www/site-two/public
sudo chown -R www-data:www-data /var/www/site-one /var/www/site-two
2

تعریف بلاک برای هر دامنه

برای هر سایت یک فایل جداگانه در پوشه sites-available بسازید. جدا نگه داشتن فایل ها باعث میشود بتوانید یک سایت را بدون دست زدن به بقیه غیرفعال کنید.

به دو خط access_log و error_log دقت کنید. جداسازی لاگ ها از همان ابتدا، عیب یابی را بعدا بسیار ساده تر میکند.

فایل /etc/nginx/sites-available/site-one
server {
    listen 80;
    server_name site-one.ir www.site-one.ir;
    root /var/www/site-one/public;
    index index.html index.php;

    access_log /var/log/nginx/site-one.access.log;
    error_log  /var/log/nginx/site-one.error.log;

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

فعال سازی و تست

با ساخت لینک نمادین در پوشه sites-enabled سایت فعال میشود. قبل از هر بارگذاری مجدد، حتما پیکربندی را تست کنید تا یک اشتباه تایپی همه سایت ها را از کار نیندازد.

فعال کردن سایت ها
sudo ln -s /etc/nginx/sites-available/site-one /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site-two /etc/nginx/sites-enabled/
تست و اعمال
sudo nginx -t
sudo systemctl reload nginx
4

بلاک پیشفرض؛ نکته ای که معمولا جا می افتد

اگر کسی با آی پی سرور یا با دامنه ای که به سرور شما اشاره میکند اما تعریف نشده وارد شود، Nginx اولین بلاک موجود را نمایش میدهد. نتیجه این است که سایت اول شما روی دامنه های ناشناس هم بالا می آید که هم برای سئو بد است و هم گیج کننده.

راه حل، تعریف یک بلاک پیشفرض است که چنین درخواست هایی را بدون پاسخ میبندد. کد ۴۴۴ در Nginx یعنی اتصال بدون هیچ پاسخی بسته شود.

فایل /etc/nginx/sites-available/default-catchall
server {
    listen 80 default_server;
    server_name _;
    return 444;
}
نحوه هدایت چند دامنه روی یک آی پی توسط Nginx و نقش بلاک پیشفرض
بدون بلاک پیشفرض، دامنه های ناشناس و خود آی پی سرور، سایت اول شما را نمایش میدهند.
5

گواهی SSL برای چند دامنه

هر دامنه گواهی خودش را میگیرد و همه روی یک آی پی کنار هم کار میکنند. برای هر سایت یک بار دستور را با دامنه های همان سایت اجرا کنید.

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

گرفتن گواهی برای هر سایت
sudo certbot --nginx -d site-one.ir -d www.site-one.ir
sudo certbot --nginx -d site-two.ir -d www.site-two.ir
6

نکاتی برای وقتی تعداد سایت ها زیاد میشود

با افزایش تعداد دامنه ها چند مورد اهمیت پیدا میکنند که در ابتدا به چشم نمی آیند.

  • اگر نام دامنه ها طولانی است، مقدار server_names_hash_bucket_size را افزایش دهید.
  • برای هر سایت کاربر یا استخر پردازش جداگانه در نظر بگیرید تا مشکل یک سایت بقیه را متوقف نکند.
  • چرخش لاگ ها را تنظیم کنید تا فایل های لاگ فضای دیسک را پر نکنند.
  • برای غیرفعال کردن موقت یک سایت، کافی است لینک آن را از sites-enabled حذف کنید.

پرسش های پرتکرار

آیا برای هر سایت به آی پی جداگانه نیاز دارم؟

خیر. با استفاده از server block میتوانید ده ها دامنه را روی یک آی پی میزبانی کنید. Nginx بر اساس نام دامنه ای که مرورگر ارسال میکند، بلاک درست را انتخاب میکند.

چرا وقتی آی پی سرور را باز میکنم یکی از سایت ها نمایش داده میشود؟

چون هیچ بلاکی به عنوان سرور پیشفرض تعریف نشده و Nginx اولین بلاک را انتخاب میکند. با تعریف یک بلاک پیشفرض که درخواست های بدون دامنه معتبر را رد میکند این مشکل حل میشود.

آیا میتوان برای هر دامنه گواهی SSL جداگانه گرفت؟

بله. برای هر بلاک میتوانید گواهی جداگانه بگیرید و همه روی یک آی پی کار میکنند، چون مرورگرهای امروزی از قابلیت SNI پشتیبانی میکنند.

به راهنمای بیشتری نیاز دارید؟

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

گفتگو با پشتیبانی

ادامه یادگیری

مشاهده همه