Bu yazımızda NGINX default server üzerinde Virtual Host un nasıl çalıştığını ele alacağız. İşlemlerimizi root kullanıcsında gerçekleştirmeyi unutmayalım.
Yapacağimiz işlemlerin nginx üzerindeki referans sayfalarını aşağıda paylaşıyorum.
- NGINX
http
module - NGINX
server
directive - NGINX
listen
directive - NGINX
server_name
directive - NGINX
root
directive
Varsayılan NGINX Virtual Host Yapılandırması
NGINX’in varsayılan dizin sayfasını sunması için herhangi bir yapılandırma yapmamıza gerek yoktur. Bunun nedeni, NGINX’in /etc/nginx/conf.d/default.conf adresinde bulunabilen varsayılan bir yapılandırmayla gelmesidir. Bu konfigurasyon dosyasında çok kayda değer bir veri yok onun için silerek yenisi biz oluşturalım.
$ sudo su [root] & cd /etc/nginx [root] $ rm conf.d/default.conf
curl ya da browser üzeridnen sayfamızı çağırdığımızda, yapılandırma dosyasını kaldırmış olsak bile hala çalıştığını görüyoruz. Yapılandırma, sunucu başladığında okunur ve yapılandırma değişikliklerinin alınması için hizmetin yeniden başlatılması gerekir. Yapılandırmamız üzerinde çalışmaya başlayalım.
NGINX’in yapılandırmasını systemctl kullanarak yeniden çalıştıralım ve tekrar deneyelim:
[root] $ systemctl reload nginx [root] $ curl localhost curl: (7) Failed connect to localhost:80; Connection refused
Artık sunucularımızı sıfırdan oluşturmaya başlayabiliriz.
HTTP Sunucusu için En Basit Yapılandırma
80 port numarası dinleyen ve NGINX’in varsayılan HTML dizininden içerik sunan, oluşturabileceğimiz en basit konfigurasyon;
/etc/nginx/conf.d/default.conf
server { listen 80; root /usr/share/nginx/html; }
Bu dosya /etc/nginx/nginx.conf içinde http bağlamının içine eklenecek, bu nedenle http bağlamını kendimiz tanımlamamız gerekmiyor. NGINX ile bir virtual host yapılandırmak, server direktifini kullanmamızı gerektirir. Bağlantı noktasını, iyi adlandırılmış listen direktifini kullanarak bağlantı noktası 80 portunu dinlemek üzere ayarlayacağız. Root direktifi, HTML’mizi yüklenmek üzere nereye koyacağımızı belirlememize olanak tanır.
Yapılandırmamızın geçerli olup olmadığını görmek için şimdilik burada duralım. Nginx binary dosyası, yeniden yüklediğimizde yüklenecek yapılandırmayı test etmemiz için bir test imkanı sağlar; nginx servisini yeniden başlatmadan önce her defasında denemekte fayda var. Her konfigurasyonu yeniden gerçekleştirdikten sonra.
[root] $ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Yapılandırmamız iyi görünüyor, bu yüzden şimdi yapılandırmayı yükleyebilir ve localhost’u tekrar reboot edip, servisi yeniden başlatıp, curl ya da browser üzerinden hizmetimizi çağırabiliriz.
Harika, konfigurasyonumuz sonrası işlemlerimiz çalışmakta. Yapılandırmada root olarak belirttiğimiz dizinde bir index.html dosyası var ve curl ve browser üzerinden gelen sayfalar bunlar.
server_name ile birden fazla Virtual Host yönetme
Sunucumuz üzerinde farklı yapılandırmalara sahip farklı domainlere yönelik istekleri işlemesini ele alalım. Bu işlem için server blogunu kullanacağız. Bu işlem için server_name yönergesini kullanarak gerçekleştireceğiz. İşlemlere başlarken default server konfigurasyonunun bulunduğu alan içerisine server_name kullanarak testipimizi yapalım _ içeriği kullanacağız.
/etc/nginx/conf.d/default.conf
server { listen 80 default_server; server_name _; root /usr/share/nginx/html; }
Konfigurasyonumuzda küçük değişiklik yaptık, 80 portuna gelen taleplerde host headerinda eşleşen herhangi bir veri yoktu ancak artık eşleşme gerçekleşecek olup default olarak default.conf dizinimizdeki tanımlamalar ile eşeleşerek bu servera eşleşme sağlanacak. Default sayfamız için bu işlemi yapmamıza gerek yoktu ancak testlerimizin başarılı olması için ekleme gereği duydum.
Bu işlemi yeni bir bir virtual host oluşturarak deneyelim. Her test işlemlerinde olduğu gibi example.com adresini nginx sunucumuz üzerinde tanımlayalım.
/etc/nginx/conf.d/example.com.conf
server { listen 80; server_name example.com www.example.com; root /var/www/example.com/html; }
Bu sunucu yalnızca host bilgisi example.com veya www.example.com olarak edilen isteklere yanıt verecektir. NGINX konfigurasyonumuzu yeniden başlatmadan önce, root olarak belirtilen dizini oluşturmamız ve bir index.html dosyası eklememiz gerekecek.
root] $ mkdir -p /var/www/example.com/html [root] $ echo "<h1>Hello, Example.com</h1>" > /var/www/example.com/html/index.html
Yapılandırmayı nginx binary dosyasını kullanarak doğrulayın:
[root] $ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Son olarak, NGINX yapılandırmasını yeniden yükleyelim ve farkı görmek için bazı URL isteklerinde bulunalım:
[root] $ systemctl reload nginx [root] $ curl localhost <html> <head> <title>Welcome to nginx!</title> <style> ... [root] $ curl --header "Host: www.example.com" localhost <html> <head><title>403 Forbidden</title></head> <body bgcolor="white"> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.12.2</center> </body> </html>
Ah burada bir sorun var. Bakalım bu sorunu neden aldığımızı log kayıtlarına bakarak anlamaya çalışalım:
[root] $ less /var/log/nginx/error.log ... xxxxx: *15 "/var/www/example.com/html/index.html" is forbidden (13: Permission denied), client: 127.0.0.1, server: example.com, request: "GET / HTTP/1.1", host: "www.example.com"
“Permission denied” bu, SELinux’un NGINX’in yeni /var/www dizinine erişmesine izin vermemesinden kaynaklı. Yeni sitemizi görebilmemiz için yapılandırmayı değiştirmemiz gerekecek.
NGINX için SELinux Kurallarını Ayarlama
Bunun işe yaradığını bildiğimizden, /usr/share/nginx/html için hangi yapılandırmanın kullanıldığını görelim ve sonra yeni dizinimizi eşleşecek şekilde ayarlayabiliriz.
[root] $ semanage fcontext -l | grep /usr/share/nginx/html /usr/share/nginx/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
Httpd_sys_content_t’yi kullanmak isteyeceğiz. Şunu kullanarak yeni bir dosya bağlam satırı ekleyelim:
[root] $ semanage fcontext -a -t httpd_sys_content_t '/var/web(/.*)?'
Şimdi header kullanarak curl aracılığıyla sayfamızı çağırırsak, /var/www içindeki dosyalardaki SELinux etiketleri eşleşecek şekilde güncellenmediği için bir hata alacağız. Restorecon komutunu kullanarak bu etiketleri güncelleyebiliriz:
[root] $ restorecon -R -v /var/www restorecon reset /var/www context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /var/www/example.com context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /var/www/example.com/html context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /var/www/example.com/html/index.html context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
Son olarak, example.com sunucumuzla eşleşen belirli bir server_configuration headeri çağırdığımızda, doğru yanıtı alacağız.
[root] $ curl --header "Host: example.com" localhost <h1>Merhaba, Example.com</h1>
Başka bir yazımızda görüşmek üzere,