Aynı makinede çalışan bazı sunucular var, bazıları yalnızca http, bazıları hem http, hem de https. Ana yapılandırma dosyasında bulunan ayrı dosyalarda tanımlanmış birkaç sunucu bloğu vardır.
Diğer yapılandırma dosyalarındaki diğer sunucu_adılarından hiçbiriyle eşleşmeyen isteklere genel bir "bakım sayfası" sunacak olan http için "varsayılan" bir sunucu kurdum. Http varsayılan sunucusu beklendiği gibi çalışır, sunucu_adı "_" kullanır ve içerdiği listede ilk sırada yer alır (çünkü sunucular arasında yinelenen sunucu_adı olması durumunda, ilk önce görünenin kullanıldığını gözlemledim). Bu harika çalışıyor.
Aynı tam sunucu bloğunu beklerdim (sadece "80'i varsayılan_ayarı dinle" yi "443 varsayılan_ınıver dinle" ve ayrıca "dönüş 444'ü" yerine sayfa döndürmek yerine) değiştirirdim. Bunun yerine, yeni varsayılan https sunucusunun gerçekte gelen tüm https bağlantılarını alıp, başarısız olmasına neden olmasına rağmen, diğer sunucu blokları gelen istekler için daha uygun sunucu_isimlerine sahip görünüyor. Yeni varsayılan https sunucusunu kaldırmak yarı-doğru davranışın devam etmesine neden olacaktır: https'li web siteleri tamamen doğru yüklenecektir; ancak https içermeyen web sitelerinin tümü, içerme dosyalarındaki ilk https sunucusuna yönlendirilir (bu, "default_server" görünmezse belgelere göre, sonra görünen ilk sunucu bloğu "varsayılan" olur).
Öyleyse sorum şu, ssl bağlantıları için nginx'te bir "varsayılan sunucu" tanımlamanın doğru yolu nedir? Neden açıkça bir "default_server" ayarladığımda açgözlülük ve tüm bağlantıları kaparken nginx'in "varsayılan sunucu" 'nun beklediğim gibi çalıştığına karar vermeme izin verdiğimde (yanlış sunucu varsayılan ve diğer gerçek sunucular olarak ayarlanmışken) doğru davranmak)?
İşte benim "varsayılan sunucular". Http, diğer sunucuları bozmadan çalışır. Https diğer sunucuları kırar ve hepsini tüketir.
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
Aranızda neyin yanlış olabileceğini gördünüz mü?