NGINX Virtual Host İçeriği Düzenleme

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.

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
default.conf ile birlikte gelen index.html
default.conf içeriği
default.conf dizinin silinmesi ve hala index.html verilerinin çalıştığını görmek

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
systemctl reload nginx

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;
}
default.conf

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.

nginx -t , systemctl reload nginx, curl localhost
index.html
50x.html

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;
}
example.com.conf

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
restorecon -R -v

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>
curl –header “host: example.com” localhost

Başka bir yazımızda görüşmek üzere,

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top