- Konu sahibi
- #1
Apache VirtualHost, aynı Apache sunucusunun birden fazla alan adını veya IP/port kombinasyonunu farklı site yapılandırmalarıyla sunmasını sağlar. İstemci bir alan adına bağlandığında Apache, isteğin geldiği IP ve porta bakar; HTTP isteğindeki
VirtualHost, hangi adres/port grubuna gelen isteğe nasıl davranılacağını tanımlar. Bağlantıyı kabul edecek adres/port ayrıca Listen ile açılmış olmalıdır; VirtualHost yazmak dinleyici oluşturmaz. Aşağıdaki örnek, 80 portunun zaten dinlendiği ve gerekli modüllerin yüklü olduğu bir Apache kurulumunda herkese açık statik bir deneme sitesi içindir:
Buradaki
HTTPS için ayrı bir VirtualHost kullanılır; çünkü port farklıdır ve TLS ayarları da bu blokta yer alır:
HTTPS’te sertifika seçimi HTTP isteğinden önceki TLS el sıkışmasında gerçekleşir. İstemcinin SNI adı uygun TLS VirtualHost’un seçilmesine yardım eder; SNI yoksa varsayılan blok devreye girebilir. Sertifika yolları gerçekten mevcut değilse HTTPS bloğu yüklenemez. Bu nedenle HTTPS ayarını kopyalamak tek başına yeterli değildir; sertifika ve SSL modülü de sunucuda hazır olmalıdır.
Apache önce bağlantının ulaştığı IP ve port için uygun VirtualHost grubunu seçer. Aynı grupta birden fazla blok varsa HTTP isteğindeki
Aşağıdaki örnekte iki alan adı aynı sunucuyu paylaşır, fakat farklı dizinlerden içerik sunar:
İstemci
Karar verirken temel farkları şu şekilde değerlendirebilirsiniz:
Apache kullanan Linux sistemlerde dosya yolu ve etkinleştirme komutları dağıtıma göre değişebilir. Panel yönetimli sunucuda panelin desteklediği site/ek yönerge yolunu kullanın; oluşturulmuş dosyanın üzerine yazmayın. Değişecek yapılandırmanın geri dönüş kopyasını alın. Debian/Ubuntu tarzı kurulumlarda uygulanabilir temel akış şöyledir:
ort grubunda ilk sırada bulunan varsayılan VirtualHost’u kontrol edin. Alan adı henüz DNS’e bağlı değilse yerel testte
En yaygın hata, yalnızca
Host değerini uygun <VirtualHost> bloğuyla eşleştirir. Eşleşme yoksa o IP ve port için varsayılan, genellikle yapılandırma dosyalarında ilk görünen VirtualHost kullanılır.VirtualHost nasıl eşleşir?
VirtualHost, hangi adres/port grubuna gelen isteğe nasıl davranılacağını tanımlar. Bağlantıyı kabul edecek adres/port ayrıca Listen ile açılmış olmalıdır; VirtualHost yazmak dinleyici oluşturmaz. Aşağıdaki örnek, 80 portunun zaten dinlendiği ve gerekli modüllerin yüklü olduğu bir Apache kurulumunda herkese açık statik bir deneme sitesi içindir:
Kod:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public
<Directory "/var/www/example.com/public">
Require all granted
</Directory>
</VirtualHost>
Buradaki
*:80, 80 portundaki joker adres eşleşmesini ifade eder; yalnız IPv4 anlamına gelmez. Gerçekte hangi IPv4/IPv6 adreslerinden bağlantı kabul edildiğini Listen ayarı ve platform belirler. ServerName ana alan adıdır; ServerAlias ise aynı siteye yönlenecek ek adları tanımlar. DocumentRoot, istenen dosyanın aranacağı kök dizindir. Örneğin http://example.com/index.html isteği, bu ayara göre /var/www/example.com/public/index.html dosyasını arar.HTTPS için ayrı bir VirtualHost kullanılır; çünkü port farklıdır ve TLS ayarları da bu blokta yer alır:
Kod:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public
SSLEngine on
SSLCertificateFile /etc/ssl/example.com/fullchain.pem
SSLCertificateKeyFile /etc/ssl/example.com/privkey.pem
</VirtualHost>
HTTPS’te sertifika seçimi HTTP isteğinden önceki TLS el sıkışmasında gerçekleşir. İstemcinin SNI adı uygun TLS VirtualHost’un seçilmesine yardım eder; SNI yoksa varsayılan blok devreye girebilir. Sertifika yolları gerçekten mevcut değilse HTTPS bloğu yüklenemez. Bu nedenle HTTPS ayarını kopyalamak tek başına yeterli değildir; sertifika ve SSL modülü de sunucuda hazır olmalıdır.
İstek hangi siteye gider?
Apache önce bağlantının ulaştığı IP ve port için uygun VirtualHost grubunu seçer. Aynı grupta birden fazla blok varsa HTTP isteğindeki
Host başlığını ServerName ve ServerAlias değerleriyle karşılaştırır. Alan adı eşleşirse ilgili blok seçilir. Hiçbir ad eşleşmezse grubun varsayılan bloğu devreye girer.Aşağıdaki örnekte iki alan adı aynı sunucuyu paylaşır, fakat farklı dizinlerden içerik sunar:
Kod:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example.com/public
</VirtualHost>
<VirtualHost *:80>
ServerName example.net
DocumentRoot /var/www/example.net/public
</VirtualHost>
İstemci
example.net için istek gönderdiğinde ikinci blok seçilir. Bunlar aynı eşleştirme grubunu gösteren kısa örnek bloklardır; gerçek sitede dizin erişim yetkileri de tanımlanmalıdır. Alan adını normal biçimde ziyaret ederken DNS’nin doğru sunucuya çözülmesi gerekir. Yerel Host testi ise bu DNS adımını atlayabilir.Karar verirken temel farkları şu şekilde değerlendirebilirsiniz:
| Ayar | Görevi | Yanlışsa görülebilecek sonuç |
|---|---|---|
| IP ve port | İsteğin hangi VirtualHost grubuna gireceğini belirler | Varsayılan site veya bağlantı hatası |
| ServerName | Ana alan adını eşleştirir | Alan adı başka siteye düşebilir |
| ServerAlias | Ek alan adlarını aynı siteye bağlar | www veya alternatif ad eşleşmez |
| DocumentRoot | Dosyaların aranacağı dizini belirler | 404 veya yanlış içerik |
Uygulama ve doğrulama
Apache kullanan Linux sistemlerde dosya yolu ve etkinleştirme komutları dağıtıma göre değişebilir. Panel yönetimli sunucuda panelin desteklediği site/ek yönerge yolunu kullanın; oluşturulmuş dosyanın üzerine yazmayın. Değişecek yapılandırmanın geri dönüş kopyasını alın. Debian/Ubuntu tarzı kurulumlarda uygulanabilir temel akış şöyledir:
- Site dizinini ve test dosyasını oluşturun:
/var/www/example.com/public/index.html. Dosyada ayırt edici bir metin, örneğinexample.com VirtualHost, bulunsun. - VirtualHost bloğunu Apache’nin site yapılandırma dizinine bir dosya olarak kaydedin.
ServerNameveDocumentRootdeğerlerini gerçek alan adınız ve dizininizle değiştirin. - Dağıtımınızın yöntemine göre siteyi etkinleştirin. Doğru yapılandırmayı okuyan yetkiyle
apachectl -Sçalıştırıp adres/port grubunu ve dosya sırasını görün; ardındanapachectl configtestile sözdizimini denetleyin. Beklenen sonuç Syntax OK ve başarılı çıkış kodudur. - Test başarılıysa Apache’yi yeniden yükleyin. Dağıtımınızın servis yöneticisindeki reload işlemini kullanın; restart gereksiz kesinti oluşturabilir.
- Yerel HTTP alan adı eşleşmesini denetleyin:
curl -i -H "Host: example.com" http://127.0.0.1/. Apache 127.0.0.1:80 üzerinde de dinliyorsa beklenen sonuç test dosyanızın içeriğidir. Bu komut DNS’yi veya HTTPS sertifikasını sınamaz. Sonra alan adını normal yoldan açıp DNS, içerik ve günlükleri kontrol edin.
Syntax OK alınmıyorsa yazım hatasını, bulunamayan dosyayı, okuma yetkisi sorununu veya eksik modülü hata ayrıntısına göre ayırın; hata çıktısındaki dosya ve satır numarasını düzeltmeden yeniden yükleme yapmayın. Sözdizimi doğru olduğu halde yanlış site görünüyorsa önce DNS’yi, kullandığınız portu, Host değerini ve aynı IPcurl -H yaklaşımı, doğru VirtualHost eşleşmesini DNS’ten bağımsız sınamak için kullanılabilir.Sık yapılan hatalar
En yaygın hata, yalnızca
ServerName yazıp DocumentRoot veya gerekli erişim izinlerini tanımlamamaktır. Bir diğer hata, www adını ServerAlias içine eklememektir. Ayrıca HTTP için *:80 tanımlanmışken HTTPS isteği için aynı bloğun kullanılacağını varsaymak yanlıştır; 443 portu ve TLS ayarları ayrı değerlendirilir. Aynı alan adını birden fazla etkin blokta tanımlamak da beklenmeyen eşleşmelere yol açar; tek bir ana VirtualHost belirleyip yönlendirme veya uygulama davranışını orada açıkça tanımlayın.