- Konu sahibi
- #1
Nginx server block nasıl çalışır?
Nginx’te
server block, gelen HTTP isteğinin hangi alan adı, port ve site ayarlarıyla işleneceğini belirleyen yapılandırma bölümüdür. İstek önce uygun listen adresi ve portuna, ardından server_name değerine göre bir bloğa yönlendirilir. Eşleşme yoksa ilgili listen adresİstek hangi sırayla eşleşir?
Bir istemci
http://example.com/ adresine gittiğinde genel akış şöyledir:- İstemci alan adını çözer ve Nginx’in dinlediği IP adresine bağlanır.
- Nginx, isteğin geldiği IP ve portla uyumlu
listentanımlarını bulur. - Bu adaylar içinde
server_namedeğeri istek içindeki Host başlığıyla karşılaştırılır. Tam eşleşme, uygun joker eşleşme ve varsa düzenli ifade eşleşmesi değerlendirilir. - Uygun isim bulunamazsa ilgili adres ve portun varsayılan server block’u kullanılır.
- Seçilen blok içinde URL’ye en uygun
locationdeğerlendirilir; dosya sunulur, yeniden yazılır veya başka bir servise aktarılır.
Alan adı tek başına yeterli değildir. Aynı portta birden fazla site barındırılıyorsa her sitenin
server_name değeri doğru olmalıdır. Ayrıca DNS’in alan adını doğru sunucuya yönlendirmesi gerekir; Nginx yapılandırması DNS kaydının yerine geçmez.Somut server block örneği
Aşağıdaki örnek,
example.com için statik dosyaları /var/www/example.com/public dizininden sunar. server bloğu, Nginx yapılandırmasının http bağlamı içinde yer almalıdır; dosyanın dağıtıma göre yüklenen bir yapılandırma dizinine dahil edilmesi gerekir.
Kod:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Burada
listen 80 HTTP isteklerini, server_name iki alan adını, root dosyaların temel dizinini ve try_files ise istenen dosya veya dizin bulunamazsa 404 yanıtı verilmesini tanımlar. index sayesinde dizin isteğinde index.html aranır.Değişiklikten sonra uygulanabilir en küçük kontrol ve yükleme işlemi şöyledir:
- Örneği yeni ve boş bir deneme sitesinde değerlendirin. Mevcut index.html dosyasının üzerine yazmayın; gerçek kök dizini ve Nginx kullanıcısının okuma iznini doğrulayın.
- Server block dosyasının Nginx’in
httpyapılandırmasına dahil edildiğini kontrol edin. - Yapılandırmayı uygun yönetici yetkisiyle yeniden yüklemeden önce
nginx -tkomutunu çalıştırın. Başarılı sonuçta yapılandırma sözdiziminin geçerli olduğunu belirten bir çıktı görmelisiniz. - systemd kullanan Linux kurulumunda, test başarılıysa uygun yetkiyle
systemctl reload nginxile Nginx’i yeniden yükleyin. Yeniden başlatma yerine reload kullanmak mevcut bağlantıları gereksiz yere kesmeden yeni yapılandırmayı uygulamayı amaçlar. - Alan adını tarayıcıda açın veya uygun bir HTTP istemcisiyle istekte bulunun. Beklenen sonuç,
index.htmliçeriğinin dönmesidir.
nginx -t başarısız olursa reload çalıştırmayın; hata mesajındaki dosya ve satır numarasındaki eksik noktalı virgül, yanlış bağlam veya geçersiz direktifi düzeltin. Test başarılı olduğu halde başka sitenin içeriği geliyorsa önce alan adının doğru IP’ye çözüldüğünü, sonra server_name yazımını ve varsayılan bloğun seçilip seçilmediğini kontrol edin.Yaygın kararlar ve hatalar
| Durum | Kullanılacak yaklaşım | Dikkat edilecek nokta |
|---|---|---|
| Bir sunucuda birden fazla alan adı | Her site için ayrı server block | Her blokta ayırt edici server_name kullanın |
| Alan adı eşleşmiyor | Doğru server_name ve DNS yönlendirmesini kontrol edin | Eşleşme yoksa varsayılan blok yanıt verebilir |
| Statik site | root ve uygun location | Dosya yolu gerçekten mevcut olmalı |
| Uygulama sunucusu | location içinde proxy veya FastCGI yönlendirmesi | Uygulamanın dinlediği adres ve port doğru olmalı |
En sık hata,
root yolunu sunucudaki gerçek dizinle karıştırmak veya aynı server_name değerini birden fazla blokta tanımlamaktır. İkinci durumda hangi bloğun seçileceği beklenmedik hale gelebilir. HTTPS kullanılıyorsa HTTP ve HTTPS için ayrı dinleme ayarları gerekebilir; sertifika ve yönlendirme kuralları da doğru bloğa eklenmelidir.Sık sorulan sorular
server block ile location arasındaki fark nedir?
server block alan adı ve port düzeyinde sanal siteyi seçer. location ise seçilmiş sitenin içindeki URL yolunun nasıl işleneceğini belirler; örneğin dosya sunabilir veya isteği uygulamaya aktarabilir.server_name _; tüm alan adlarını yakalar mı?
Hayır. Alt çizgi özel bir “tüm alan adları” anahtarı değildir; varsayılan olma özelliğini isim değil, listen adres
Aynı portta neden birden fazla site çalışabilir?
HTTP Host başlığı, Nginx’in aynı IP ve port üzerindeki istekleri farklı
server_name değerlerine ayırmasını sağlar. İstemci doğru Host bilgisini göndermez veya alan adı eşleşmezse istek varsayılan server block’a düşebilir.