Nginx ile tek sunucuda birden fazla web sitesi (server block)
Tek bir VDS sunucuda birden fazla web sitesi çalıştırmak mümkündür ve çoğu kişinin ilk yaptığı iş budur. Nginx bunu server block ile yapar: her alan adı için ayrı bir ayar bloğu yazarsınız ve Nginx gelen isteğin Host başlığına bakarak hangi bloğa gideceğine karar verir. Bu sistem Apache'deki "sanal host"un karşılığıdır.
Önce: DNS
Her alan adının A kaydı sunucunun IP adresini göstermeli. Nasıl yapıldığı: alan adını sunucuya yönlendirme.
Her site için bir dosya
Ubuntu ve Debian'da ayarlar /etc/nginx/sites-available/ içinde yazılır, etkinleştirmek için sites-enabled/ klasörüne bağlantı verilir. İki site örneği:
# /etc/nginx/sites-available/ornek.com
server {
listen 80;
server_name ornek.com www.ornek.com;
root /var/www/ornek.com/public;
index index.html;
location / { try_files $uri $uri/ =404; }
}
# /etc/nginx/sites-available/blog.ornek.com
server {
listen 80;
server_name blog.ornek.com;
root /var/www/blog;
index index.html;
location / { try_files $uri $uri/ =404; }
}
Klasörleri oluşturun, dosyalara bir deneme sayfası koyun ve ayarları etkinleştirin:
sudo mkdir -p /var/www/ornek.com/public /var/www/blog
echo "ornek.com" | sudo tee /var/www/ornek.com/public/index.html
echo "blog" | sudo tee /var/www/blog/index.html
sudo ln -s /etc/nginx/sites-available/ornek.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/blog.ornek.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
nginx -t ayar hatasını yazar; hata yoksa "syntax is ok" der. Önce sınayıp sonra yeniden yüklemek, hatalı bir ayarın çalışan siteleri kapatmasını önler.
İstek hangi bloğa gidiyor?
Nginx server_name eşleşmesine bakar. Hiçbirine uymayan istek (örneğin alan adı olmadan doğrudan IP ile gelen) varsayılan sunucuya gider; hiçbir blok işaretlenmediyse dosya sırasına göre ilk olana. Rastgele bir sitenin bu isteklere cevap vermesini önlemek için açık bir varsayılan tanımlayın:
server {
listen 80 default_server;
server_name _;
return 444;
}
444 Nginx'e özgü bir koddur: bağlantıyı cevap vermeden kapatır. Böylece botlar IP adresinizi tarayınca sitelerinizden birine düşmez.
Sık yapılan hatalar
- Aynı
server_nameiki dosyada: "conflicting server name" uyarısı verir ve ikincisi yok sayılır. Alan adlarını tek yerde tanımlayın. - Yanlış sitenin açılması: Çoğunlukla A kaydı doğrudur ama
server_nameyanlış yazılmıştır ya da www eksiktir.server_namelistesinde hemornek.comhemwww.ornek.combulunsun. - Bağlantıyı unutmak:
sites-availableiçindeki dosyasites-enabled'a bağlanmadıkça kullanılmaz. - Dosya sahipliği: Site klasörü
www-datatarafından okunabilir olmalı: izinler. - 403 ya da 404: 403 Forbidden nedenleri.
https ekleyin
Her alan adı için ayrı sertifika alın: sudo certbot --nginx -d ornek.com -d www.ornek.com ve sudo certbot --nginx -d blog.ornek.com. Hatalar için Certbot hataları makalesine bakın. PHP siteleri için ayar: WordPress ve PHP kurulumu.
Sık sorulanlar
Kaç site barındırabilirim?
Teknik sınır yoktur; asıl sınır sunucunun RAM ve işlemcisidir. Her PHP sitesi bellek tüketir, bu yüzden küçük bir sunucuda birkaç site makuldür. Kaynakları izleyin.
Her siteye ayrı PHP-FPM havuzu gerekir mi?
Gerekmez ama güvenlik için ayrı kullanıcı ve havuz önerilir; bir sitedeki açık diğerlerine geçmesin. Küçük kurulumlarda tek havuz da kullanılır.
Alt alan adlarını tek blokta toplayabilir miyim?
Evet, server_name *.ornek.com; ile joker kullanabilirsiniz, ama joker sertifika DNS doğrulaması ister.
İlgili makaleler
- Linux sunucuya web sitesi (Nginx) nasıl kurulur?
- Nginx'te http'den https'ye ve www yönlendirmesi (301) nasıl yapılır?
- Nginx 502 Bad Gateway hatası: nedenleri ve çözümü
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!