یک سرور مجازی معمولی به راحتی میتواند چند سایت را همزمان میزبانی کند. مکانیزم آن در Nginx بلاک server است: برای هر دامنه یک بلاک تعریف میکنید و Nginx بر اساس نام دامنه درخواست را به بلاک درست هدایت میکند. آنچه معمولا فراموش میشود، تعریف بلاک پیشفرض است که مشکلات عجیبی ایجاد میکند.
ساختار پوشه ها
برای هر سایت یک پوشه جداگانه بسازید. این جداسازی بعدا در تنظیم دسترسی ها و پشتیبان گیری کار را ساده میکند.
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تعریف بلاک برای هر دامنه
برای هر سایت یک فایل جداگانه در پوشه sites-available بسازید. جدا نگه داشتن فایل ها باعث میشود بتوانید یک سایت را بدون دست زدن به بقیه غیرفعال کنید.
به دو خط access_log و error_log دقت کنید. جداسازی لاگ ها از همان ابتدا، عیب یابی را بعدا بسیار ساده تر میکند.
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;
}
}فعال سازی و تست
با ساخت لینک نمادین در پوشه 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بلاک پیشفرض؛ نکته ای که معمولا جا می افتد
اگر کسی با آی پی سرور یا با دامنه ای که به سرور شما اشاره میکند اما تعریف نشده وارد شود، Nginx اولین بلاک موجود را نمایش میدهد. نتیجه این است که سایت اول شما روی دامنه های ناشناس هم بالا می آید که هم برای سئو بد است و هم گیج کننده.
راه حل، تعریف یک بلاک پیشفرض است که چنین درخواست هایی را بدون پاسخ میبندد. کد ۴۴۴ در Nginx یعنی اتصال بدون هیچ پاسخی بسته شود.
server {
listen 80 default_server;
server_name _;
return 444;
}گواهی 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نکاتی برای وقتی تعداد سایت ها زیاد میشود
با افزایش تعداد دامنه ها چند مورد اهمیت پیدا میکنند که در ابتدا به چشم نمی آیند.
- اگر نام دامنه ها طولانی است، مقدار server_names_hash_bucket_size را افزایش دهید.
- برای هر سایت کاربر یا استخر پردازش جداگانه در نظر بگیرید تا مشکل یک سایت بقیه را متوقف نکند.
- چرخش لاگ ها را تنظیم کنید تا فایل های لاگ فضای دیسک را پر نکنند.
- برای غیرفعال کردن موقت یک سایت، کافی است لینک آن را از sites-enabled حذف کنید.
پرسش های پرتکرار
آیا برای هر سایت به آی پی جداگانه نیاز دارم؟
خیر. با استفاده از server block میتوانید ده ها دامنه را روی یک آی پی میزبانی کنید. Nginx بر اساس نام دامنه ای که مرورگر ارسال میکند، بلاک درست را انتخاب میکند.
چرا وقتی آی پی سرور را باز میکنم یکی از سایت ها نمایش داده میشود؟
چون هیچ بلاکی به عنوان سرور پیشفرض تعریف نشده و Nginx اولین بلاک را انتخاب میکند. با تعریف یک بلاک پیشفرض که درخواست های بدون دامنه معتبر را رد میکند این مشکل حل میشود.
آیا میتوان برای هر دامنه گواهی SSL جداگانه گرفت؟
بله. برای هر بلاک میتوانید گواهی جداگانه بگیرید و همه روی یک آی پی کار میکنند، چون مرورگرهای امروزی از قابلیت SNI پشتیبانی میکنند.
به راهنمای بیشتری نیاز دارید؟
تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.