Nginx Nedir?
Nginx, günümüzün popüler yüksek performanslı web sunucularından biridir. Geleneksel sunucuların aksine, her bir kullanıcı isteği için ayrı bir işlem başlatmak yerine event-driven (olay güdümlü) bir mimari kullanır. Bu sayede, binlerce eşzamanlı bağlantıyı çok düşük bellek tüketimiyle yönetebilir. Temel görevi statik dosyaları ışık hızında sunmak olan Nginx, aynı zamanda bir reverse proxy (ters vekil sunucusu) ve load balancer (yük dengeleyici) olarak da çalışabilir. Modern web ekosisteminde Nginx'in en güçlü yanı, karmaşık trafik kurallarını saniyeler içinde işleyebilen esnek yapılandırma dosyalarıdır.
Bu yazımızda Nginx yapılandırma dosyasının nasıl düzenleneceğini ve test edebilmek için gerekli ortamın nasıl kurulacağından bahsedeceğiz.
Nginx Yapılandırma Rehberi
Bu rehberdeki nginx.conf ayarlarını test etmek için yerel makinenizde Nginx ve PHP'nin kurulu olması gerekir.Yapılandırmanın çalışması için FastCGI ve Nginx servislerini ayağa kaldırmalıyız:
PHP-FPM (FastCGI): PHP dosyalarımızın yorumlanması için arka planda bir dinleyiciye ihtiyacımız var. Komut satırın’da (CMD) PHP’nin kurulu olduğu dizine gidiyoruz ve php-cgi.exe -b 127.0.0.1:9000 komutunu yazarak PHP'yi Nginx ile konuşacak duruma getiriyoruz.
Nginx: Sunucuyu başlatmak için Nginx klasöründe CMD üzerinden nginx.exe komutunu çalıştırın. Farklı bir CMD daha açın ve Nginx klasörüne gelin, bu CMD’yi daha sonra yapılandırma dosyasında yapılan değişiklikleri uygulamak için kullanacağız.
Yapılandırma Dosyası: Nginx’in kurulu olduğu dizinde conf/ klasörünün içine giriyoruz ve nginx.conf dosyasına sağ tıklayıp bir metin düzenleyici ile açıyoruz. Gereken tüm değişiklikleri buradan yapacağız , herhangi bir değişiklik yaptıktan sonra metin editöründe kaydet’e basacağız ve Nginx dizininde bekleyen CMD’de nginx -s reload komutunu çalıştıracağız.
Test Dosyalarının Oluşturulması: Her şey tamamlandıktan sonra test için dosyaları oluşturabiliriz. Biz bu yazımızda Nginx’in D:/webserver dizininde kurulu olduğunu kabul ediyoruz.
D:/webserver/nginx/html içerisinde admin/ ve private/ adında iki klasör ve admin.php , private.php ve public.php adında üç tane php dosyası oluşturuyoruz. Daha sonra admin ve private klasörlerinin içinde de birer tane test.php adında dosya oluşturuyoruz.
Hata ekranında özel bir sayfa göstermek için dosyalarımızın olduğu dizinde 403.html adında bir html dosyası oluşturuyoruz. Dosyaların içeriklerini istediğiniz gibi değiştirebilirsiniz ancak biz sayfaların açıldığı anlaşılsın diye <?php phpinfo(); yazmanızı tavsiye ediyoruz.
Test ortamımız kurulduğuna göre artık ayar dosyasını incelemeye başlayabiliriz.
1. Yapılandırma Dosyasının Düzenlenmesi
nginx.conf dosyasını ilk açtığımızda yapmamız gereken birkaç şey var.
Öncelikle worker_processes 1; ve events bloğu altındaki worker_connections 1024; satırları yorum halindeyse , başlarındaki # işaretini silip yorumdan çıkarıyoruz.
http{} bloğu altındaki include mime.types; , default_type application/octet-stream; ve sendfile on; satırlarını yorumdan çıkarıyoruz.2. Server bloğu
server { ... } bloğu, Nginx'in temel yapı taşıdır. Burada sunucunun hangi port'u dinleyeceği ve hangi domainlere cevap vereceği belirlenir. Bloğun başlangıcında aşağıdaki satırları yorumdan çıkarıp şu değişiklikleri yapıyoruz;
listen 80; Sunucunun 80 portunu dinlemesini sağlar.
server_name localhost; Bu server bloğunun çalışacağı domain'i belirler.
root D:/webserver/nginx/html; Dosyalarımızın olduğu kök dizini belirler.
index index.php index.html index.htm; Bir klasör çağırıldığında neleri arayacağını tanımlar.
3.Location direktifleri
Nginx'in asıl zekası location bloklarında gizlidir. Bir URL geldiğinde Nginx, hangi kuralın uygulanacağına karar vermek için bir öncelik hiyerarşisini takip eder;
= Tam eşleşme anlamına gelir, en yüksek önceliğe sahiptir. Url tam olarak aynıysa çalışır.
^~ Önek (prefix) eşleşmesi, ikinci yüksek önceliğe sahiptir. Belirli bir yolla başlıyorsa çalışır ve Regex araması durdurulur.
~* Regex eşleşmesi, üçüncü yüksek önceliğe sahiptir. Uzantılar (.php, .html) veya karmaşık desenler için kullanılır, sonundaki yıldız büyük küçük harf duyarlı olmadığını belli eder.
/ Varsayılan. Hiçbir kurala uymayan istekler buraya düşer.
Ekleyeceğimiz location bloklarında bu kuralları kullanarak admin klasörüne ve içeriklerine erişimi tamamen engelleyeceğiz, private klasörüne ve içeriklerine erişimi bazı IP’lere vereceğiz ve diğer tüm dosyalara normal erişim sağlayacağız.
İlk olarak PHP dosyalarını yakalayan bir location bloğu ekliyoruz.
location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;}~.php$ ifadesi , .php ile biten dosyaları yakalar.
fastcgi_pass php-fpm’in dinlediği adres ve portu belirtir.
fastcgi_param php dosyasının tam yolunu belirtir.
include fastcgi_params gerekli parametreleri dahil eder.
Artık PHP dosyalarını yakalayıp işleyebildiğimize göre engellemelere geçebiliriz. Öncelikle /admin ile başlayan tüm istekleri engelleyeceğimiz bir location bloğu hazırlıyoruz.
location ^~ /admin { deny all; return 403;}^~ /admin önek (prefix) eşleşmesi /admin ile başlayan tüm istekleri yakalar.
deny all; tüm gelen istekleri engeller.
return 403; erişim engellendiğinde 403 hata kodu döndürür.
Artık localhost/admin veya localhost/admin/test.php adresine ulaşmaya çalıştığımızda 403 hata kodu dönüyor.
Şimdi ise /private ile başlayan isteklerde sadece belirlediğimiz IP adreslerine izin veren bir location bloğu hazırlayalım.
location ^~ /private {allow 127.0.0.1;allow 10.10.10.10;deny all; fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}^~ /private önek (prefix) eşleşmesi, aynı admin location bloğunda olduğu gibi /private ile başlayan istekleri yakalar.
allow belirlenen IP’lere izin verir, istenen sayıda IP eklenebilir ancak bunları deny’dan önce belirtmeye dikkat etmek gerekir, eğer deny’dan sonra tanımlanırsa işlenmeyecektir.
deny all; geri kalan tüm IP’leri engeller.
Bu blokta PHP bloğundaki fastcgi adresinin ve parametrelerinin olduğu kod bloğunu tekrar yazdık. Bunu yapmamızın sebebi, bu blokta daha yüksek öncelikli bir eşleşme kullandığımız için localhost/private/test.php adresinin artık burada yakalanması ve buradan çıkıp .php location bloğunda işlenemiyor olması. Bu durumda eğer fastcgi burada tanımlanmazsa private klasörü altındaki php dosyalarına izin verilen IP’lerden ulaşmaya çalıştığımızda bu dosyalar tarayıcıda işlenip açılmak yerine indirilecektir.
İstediğimiz kısıtlamaları yaptık, geriye sadece fallback location ve hata kodlarını yakalayan location blokları hazırlamak kaldı.
location / {try_files $uri $uri/ =404;}Bu blok ile geri kalan tüm istekleri yakalayıp işliyoruz.
try_files birden fazla dosya veya dizin kontrolünün yapılıp ilk bulunanın sunulmasını sağlar.
$uri istenen URI ile eşlesen dosyayı, $uri/ ise eşleşen dizini kontrol eder.
=404 eğer bir dosya veya dizin bulunamazsa 404 hatası döndürür.
Şimdi ise 403 ve 500 gibi hata kodlarını yakalayan ve hazırladığımız hata sayfasına yönlendiren location bloklarını tanımlayalım.
error_page 500 502 503 504 /50x.html;location = /50x.html {root D:/webserver/nginx/html;}error_page 403 /403.html;location = /403.html {root D:/webserver/nginx/html;internal;}error_page ile hata kodları belirtilir. Altında bu hata kodları için tanımlanan sayfaların uzantıları location bloğunda tam eşleşme olarak belirtilir. Blokların içine de bulundukları dosya yolları belirtilir.
internal; bu dosyaların sadece yönlendirmelerle ulaşılabilir olmasını, kullanıcının url olarak aramaya yazıp ulaşamamasını sağlar.
Artık yapılandırma dosyasında yaptığımız değişiklikler sayesinde /admin ile başlayan tüm isteklere erişimi kapattık, /private ile başlayan isteklere izin verdiğimiz IP’lerden erişim sağladık ve geri kalanı engelledik, diğer tüm sayfaları herkese açık yaptık ve hata durumunda özel olarak hazırladığımız hata sayfaları gelmesini sağladık.
Eğer farklı bir dizindeki içerikler ve dosyalar için farklı bir server ve port belirlemek isterseniz bu server bloğundan sonra başka bir server bloğu daha ekleyip listen, server_name ve root bilgilerini değiştirip kendi istediğiniz location düzenlemelerini yapabilirsiniz.
Yazar: Ege Selçuk ONAY
Kaynakça




