Takip et

Nginx Location Direktifi Neden Bu Kadar Önemli ve Nasıl Bir Rol Oynar?

Nginx Location Direktifi: Tam Eşleşme, Regex ve Proxy Ayarları

Web sunucunuzun istekleri nasıl işlediğini, hangi içeriği nerede bulacağını veya hangi uygulamaya yönlendireceğini kontrol etmekte zorlanıyor musunuz? Nginx Location direktifi ile web sunucunuzun istekleri nasıl işleyeceğini, tam eşleşme, regex ve proxy ayarlarıyla performansı nasıl optimize edeceğinizi öğrenin.

Nginx Location Direktifi Neden Bu Kadar Önemli ve Nasıl Bir Rol Oynar?

Modern web uygulamalarının karmaşıklığı arttıkça, gelen HTTP isteklerini doğru bir şekilde yönetmek ve yönlendirmek hayati bir önem taşır. İşte tam bu noktada Nginx’in kalbinde yer alan location direktifi devreye girer. Bu direktif, Nginx’in bir istemciden gelen URI’yi (Uniform Resource Identifier) nasıl işleyeceğini belirleyen temel yapı taşıdır. Kısacası, bir web sunucusunun “beyni” gibi çalışarak, hangi isteğin hangi dosyaya, hangi uygulama sunucusuna veya hangi özel işleme yönlendirileceğine karar verir.

Bir Nginx sunucusu, bir istemciden istek aldığında, öncelikle server bloğu içinde tanımlanmış listen ve server_name direktiflerine bakarak hangi sanal ana bilgisayarın bu isteği işleyeceğini belirler. Ardından, isteğin URI’sini alarak bu server bloğu içindeki location direktifleriyle eşleştirmeye çalışır. Bu eşleştirme süreci, Nginx’in esnekliğinin ve gücünün temelini oluşturur. Örneğin, statik dosyaları doğrudan sunmak, dinamik içerik için bir uygulama sunucusuna (örneğin Node.js, Python Flask veya PHP-FPM) istekleri iletmek, belirli URL’lere erişimi kısıtlamak, önbellekleme yapmak veya belirli istekleri başka bir URL’ye yönlendirmek gibi birçok farklı senaryo location direktifleri aracılığıyla yönetilir.

location direktifi olmadan, Nginx yalnızca varsayılan bir davranış sergilerdi ki bu da çoğu karmaşık web sitesi için yetersiz kalırdı. Bu direktif sayesinde, sunucunuzun performansını artırabilir, güvenlik katmanları ekleyebilir ve farklı servisleri tek bir alan adı altında sorunsuz bir şekilde entegre edebilirsiniz. Örneğin, bir web sitesinde hem statik HTML/CSS/JS dosyaları, hem bir blog için PHP tabanlı WordPress, hem de bir API için Node.js uygulaması çalıştırıyor olabilirsiniz. location direktifleri, Nginx’in bu farklı bileşenler arasındaki trafiği sorunsuz bir şekilde yönlendirmesini sağlar. Bu, geliştiricilere büyük bir esneklik sunarken, son kullanıcılara da hızlı ve güvenilir bir deneyim vaat eder.

Dolayısıyla, Nginx ile profesyonel düzeyde çalışmak isteyen herkesin location direktiflerinin inceliklerini ve farklı eşleşme türlerini anlaması kritik önem taşır. Bu bilgi, sadece bir web sunucusunu ayakta tutmakla kalmaz, aynı zamanda onu optimize etmek, ölçeklendirmek ve potansiyel güvenlik açıklarını kapatmak için de temel bir araçtır. Şimdi, bu güçlü direktifin farklı türlerine ve nasıl kullanıldıklarına daha yakından bakalım.

Nginx Location Direktifi Türleri Nelerdir ve Nasıl Çalışır?

Nginx’in location direktifi, gelen isteğin URI’sine göre farklı blokları işlemek için çeşitli eşleşme türleri sunar. Bu eşleşme türleri, Nginx’in bir isteği hangi location bloğunun yöneteceğine karar verirken belirli bir öncelik sırasına uymasını sağlar. Bu öncelik sırasını anlamak, beklenmedik davranışları önlemek ve sunucunuzu doğru şekilde yapılandırmak için hayati öneme sahiptir. Temelde, Nginx en spesifik eşleşmeyi bulmaya çalışır, ancak bu “spesifiklik” farklı operatörlerle farklı şekillerde yorumlanır.

İşte Nginx’in ana location eşleşme türleri ve bunların nasıl çalıştığı:

  1. Tam Eşleşme (=): En yüksek önceliğe sahiptir ve sadece URI tam olarak eşleştiğinde tetiklenir.
  2. Önek Eşleşmesi (Prefix, operatörsüz veya ^~): URI’nin başlangıcıyla eşleşir. ^~ ile kullanıldığında düzenli ifade eşleşmelerinden daha yüksek öncelik kazanır.
  3. Düzenli İfade Eşleşmesi (Regex, ~ veya ~*): URI’nin belirli bir desene uyup uymadığını kontrol eder. ~ büyük/küçük harfe duyarlıdır, ~* ise duyarsızdır.

Nginx, bir istek aldığında, bu eşleşme türlerini belirli bir sırayla kontrol eder. İlk olarak tam eşleşme aranır. Eğer bir tam eşleşme bulunursa, o location bloğu kullanılır ve arama durur. Tam eşleşme yoksa, Nginx önek eşleşmelerine bakar. Eğer ^~ ile başlayan bir önek eşleşmesi bulunursa, bu da düzenli ifade eşleşmelerinden önce kullanılır ve arama durur. Eğer bu da yoksa veya ^~ kullanılmamışsa, Nginx düzenli ifade eşleşmelerine bakar ve ilk eşleşeni kullanır. Son olarak, hiçbir özel eşleşme bulunamazsa, varsayılan önek eşleşmesi (genellikle location / bloğu) kullanılır.

Tam Eşleşme (=) Nasıl Kullanılır ve Ne Zaman Tercih Edilmelidir?

Tam eşleşme operatörü (=), Nginx’teki en yüksek önceliğe sahip location eşleşme türüdür. Adından da anlaşılacağı gibi, bu operatör sadece gelen isteğin URI’si, location bloğunda belirtilen değerle tamamen aynı olduğunda tetiklenir. Bu, onu belirli, tekil dosyalar veya URI’ler için ideal bir seçenek haline getirir.

Neden ve Ne Zaman Kullanılır?

  • Performans: Tam eşleşme, Nginx’in URI’yi hızlı bir şekilde kontrol edip arama sürecini durdurmasını sağlar. Bu, özellikle sıkça erişilen statik dosyalar (favicon, robots.txt gibi) için performansı artırır.
  • Kesinlik: Sadece belirli bir URI için özel kurallar uygulamak istediğinizde çok kullanışlıdır. Örneğin, bir dosya için farklı bir önbellekleme politikası veya erişim kısıtlaması belirleyebilirsiniz.
  • Öncelik: Diğer tüm location eşleşme türlerinden (önek veya düzenli ifade) daha yüksek önceliğe sahip olduğu için, diğer daha genel kuralların önüne geçmek istediğinizde tercih edilir.

Kullanım Örneği:

Diyelim ki web sitenizin ana sayfasındaki index.html dosyasını doğrudan sunmak ve bu dosya için özel bir HTTP başlığı eklemek istiyorsunuz. Ayrıca, sitenizin favicon.ico dosyasını da ayrı bir şekilde yönetmek isteyebilirsiniz.

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    # Tam eşleşme: Sadece /index.html isteği için geçerli
    location = /index.html {
        add_header X-Custom-Header "Ana Sayfa";
        # Bu blokta başka kurallar da tanımlanabilir
    }

    # Tam eşleşme: Sadece /favicon.ico isteği için geçerli
    location = /favicon.ico {
        access_log off;
        log_not_found off;
        expires 365d; # Favicon için uzun süreli önbellekleme
    }

    # Diğer tüm istekler için varsayılan blok
    location / {
        try_files $uri $uri/ =404;
    }
}

Yukarıdaki örnekte:

  • location = /index.html bloğu, sadece tam olarak /index.html URI’si istendiğinde tetiklenir. Burada özel bir başlık eklenir.
  • location = /favicon.ico bloğu, sadece /favicon.ico URI’si istendiğinde çalışır. Bu blokta erişim günlükleri kapatılır ve uzun süreli bir önbellekleme başlığı (expires 365d) eklenir. Bu, tarayıcıların favicon’u uzun süre önbelleğinde tutmasını sağlayarak performansı artırır.
  • location / bloğu, diğer tüm eşleşmeyen istekleri (önek eşleşmesi olarak) ele alır.
Uzman İpucu: Tam eşleşmeler, Nginx’in eşleşme algoritmasını erken durdurduğu için, özellikle sıkça erişilen küçük, statik dosyalar (favicon, robots.txt, sitemap.xml gibi) için kullanarak sunucu yükünü azaltabilir ve yanıt sürelerini iyileştirebilirsiniz. Bu, Nginx’in diğer, daha karmaşık eşleşme kurallarını değerlendirmesini engeller.

Vaka Analizi: Yüksek Trafikli Bir Blogda Favicon ve Robots.txt Yönetimi

Yüksek trafik alan bir blog sitesinde, her sayfa yüklemesinde tarayıcılar /favicon.ico ve arama motoru botları /robots.txt dosyalarını ister. Bu dosyalar genellikle nadiren değişir. Eğer bu istekleri genel bir location / bloğu üzerinden işlerseniz, Nginx her seferinde daha fazla kuralı değerlendirmek zorunda kalabilir. Tam eşleşme kullanarak bu dosyaları doğrudan ve optimize bir şekilde sunmak, sunucu kaynaklarını korur ve gereksiz işlem yükünü ortadan kaldırır. Örneğin, favicon.ico için uzun süreli önbellekleme ve günlük kaydını kapatma, hem sunucu yükünü azaltır hem de istemcinin daha hızlı yanıt almasını sağlar.

Önek Eşleşmesi (Prefix, operatörsüz veya ^~) Ne Anlama Gelir ve Ne Zaman Kullanılmalıdır?

Önek eşleşmesi, Nginx’teki en yaygın kullanılan ve varsayılan location eşleşme türüdür. Bu tür, URI’nin başlangıcının (önek) location bloğunda belirtilen değerle eşleşip eşleşmediğini kontrol eder. Herhangi bir operatör (=, ~, ~*) olmadan kullanılan location blokları önek eşleşmesi olarak kabul edilir.

Neden ve Ne Zaman Kullanılır?

  • Genel Amaçlı: Belirli bir dizindeki tüm dosyaları veya belirli bir URL yapısına sahip tüm istekleri işlemek için idealdir. Örneğin, /static/ ile başlayan tüm istekleri belirli bir dizinden sunmak.
  • Esneklik: Tam eşleşmeye göre daha esnektir ve belirli bir önekle başlayan farklı dosya türlerini veya alt dizinleri kapsayabilir.
  • ^~ Operatörü: Eğer önek eşleşmesinin düzenli ifade eşleşmelerinden daha yüksek önceliğe sahip olmasını istiyorsanız ^~ operatörünü kullanırsınız. Bu, Nginx’in bu önekle eşleşen bir URI bulduğunda düzenli ifade aramayı durdurmasını sağlar. Bu, özellikle bir dizindeki statik dosyaları sunarken, o dizinle ilgili herhangi bir düzenli ifade kuralının devreye girmesini engellemek için kullanışlıdır.

Kullanım Örneği:

Bir web uygulamanız olduğunu ve statik dosyalarınızı (CSS, JS, resimler) /static/ dizini altında, kullanıcı tarafından yüklenen medya dosyalarını ise /media/ dizini altında tuttuğunuzu varsayalım. Ayrıca, uygulamanızın API’si için /api/ önekiyle başlayan tüm istekleri bir uygulama sunucusuna yönlendirmek isteyebilirsiniz.

server {
    listen 80;
    server_name example.com;

    root /var/www/html; # Varsayılan root dizini

    # Statik dosyalar için önek eşleşmesi (düzenli ifadelerden önce işlensin)
    location ^~ /static/ {
        alias /var/www/static_assets/; # Farklı bir fiziksel dizinden sun
        expires 30d; # Uzun süreli önbellekleme
        add_header Cache-Control "public, max-age=2592000";
    }

    # Medya dosyaları için önek eşleşmesi
    location /media/ {
        alias /var/www/user_uploads/; # Kullanıcı yüklemeleri için
        expires 7d;
    }

    # API istekleri için önek eşleşmesi, bir uygulama sunucusuna proxy
    location /api/ {
        proxy_pass http://backend_app_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # Varsayılan önek eşleşmesi: Diğer tüm istekler için (genellikle tek bir slash ile)
    location / {
        try_files $uri $uri/ /index.html; # Tek sayfa uygulamaları için
    }
}

Yukarıdaki örnekte:

  • location ^~ /static/ bloğu, /static/ ile başlayan tüm URI’leri /var/www/static_assets/ dizininden sunar ve düzenli ifade eşleşmelerinden önce işlenir. Bu, statik varlıkların hızlı ve verimli bir şekilde sunulmasını sağlar.
  • location /media/ bloğu, /media/ ile başlayan tüm URI’leri /var/www/user_uploads/ dizininden sunar.
  • location /api/ bloğu, /api/ ile başlayan tüm URI’leri backend_app_server adlı bir uygulama sunucusuna yönlendirir.
  • location / bloğu, diğer tüm eşleşmeyen istekleri ele alır ve bir tek sayfa uygulaması (SPA) senaryosunda index.html‘e geri düşer.

Vaka Analizi: Mikroservis Mimarisi ve API Yönlendirmesi

Büyük bir e-ticaret platformunun mikroservis mimarisinde çalıştığını düşünün. Ürünler için /api/products/, kullanıcılar için /api/users/ ve siparişler için /api/orders/ gibi farklı API’ler farklı arka uç servisleri tarafından yönetiliyor olabilir. Nginx’teki önek eşleşmeleri, bu API isteklerini ilgili mikroservislere yönlendirmek için mükemmel bir çözümdür. Örneğin:

location /api/products/ {
    proxy_pass http://product_service_cluster;
}

location /api/users/ {
    proxy_pass http://user_service_cluster;
}

Bu yapılandırma, Nginx’in gelen istekleri URI öneklerine göre akıllıca dağıtmasını sağlayarak, karmaşık bir sistemin tek bir giriş noktası üzerinden tutarlı bir şekilde hizmet vermesine olanak tanır.

Düzenli İfadeler (Regex, ~ ve ~*) ile Dinamik Yönlendirmeler Nasıl Yapılır?

Düzenli ifade (regex) eşleşmeleri, Nginx’te en esnek location eşleşme türüdür ve karmaşık URL desenlerini veya dinamik içerikleri yönetmek için kullanılır. Ancak, tam eşleşme ve ^~ ile başlayan önek eşleşmelerine göre daha düşük önceliğe sahiptirler. Nginx, birden fazla düzenli ifade eşleşmesi bulduğunda, yapılandırma dosyasında ilk karşılaştığı eşleşmeyi kullanır.

İki ana düzenli ifade operatörü vardır:

  • ~ (Büyük/küçük harfe duyarlı): URI’nin belirtilen düzenli ifadeyle büyük/küçük harf ayrımı yaparak eşleşip eşleşmediğini kontrol eder.
  • ~* (Büyük/küçük harfe duyarsız): URI’nin belirtilen düzenli ifadeyle büyük/küçük harf ayrımı yapmadan eşleşip eşleşmediğini kontrol eder.

Neden ve Ne Zaman Kullanılır?

  • Dinamik İçerik: URL’nin bir kısmının değişken olduğu durumlar için idealdir. Örneğin, dosya uzantısına göre işlem yapmak (.php, .jpg, .css).
  • SEO Dostu URL’ler: Eski, karmaşık URL yapılarını yeni, daha okunabilir URL’lere yönlendirmek için kullanılabilir.
  • Karmaşık Desenler: Basit önek eşleşmeleriyle yönetilemeyecek kadar karmaşık URL desenlerini ele almak için gereklidir.

Kullanım Örneği:

Diyelim ki web sitenizdeki tüm PHP dosyalarını bir PHP-FPM servisine yönlendirmek istiyorsunuz. Ayrıca, tüm resim dosyalarını (JPG, PNG, GIF) belirli bir önbellekleme politikasıyla sunmak isteyebilirsiniz.

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    # PHP dosyalarını PHP-FPM'e yönlendirme (büyük/küçük harfe duyarlı)
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHP-FPM soket yolu
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # Resim dosyalarını önbellekleme (büyük/küçük harfe duyarsız)
    location ~* \.(jpg|jpeg|gif|png|webp|svg)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
        # Hotlinking'i önlemek için referer kontrolü eklenebilir
        valid_referers none blocked server_names ~\.google\. ~\.bing\.;
        if ($invalid_referer) {
            return 403;
        }
    }

    # Gizli dosyaları engelleme
    location ~ /\. {
        deny all;
    }

    # Varsayılan blok
    location / {
        try_files $uri $uri/ =404;
    }
}

Yukarıdaki örnekte:

  • location ~ \.php$ bloğu, URI’si .php ile biten tüm istekleri yakalar ve bunları PHP-FPM servisine yönlendirir. $ işareti URI’nin sonunu belirtir, böylece sadece dosya uzantısı .php olanlar eşleşir.
  • location ~* \.(jpg|jpeg|gif|png|webp|svg)$ bloğu, URI’si .jpg, .jpeg, .gif, .png, .webp veya .svg ile biten tüm resim dosyalarını büyük/küçük harf ayrımı yapmaksızın yakalar. Bu dosyalar için uzun süreli önbellekleme başlıkları eklenir ve basit bir hotlinking önleme mekanizması uygulanır.
  • location ~ /\. bloğu, . ile başlayan (gizli) dosyalara erişimi tamamen engeller, bu da güvenlik için iyi bir uygulamadır.

Vaka Analizi: Eski URL’leri Yeni Yapıya Yönlendirme

Bir web sitesinin URL yapısını değiştirdiğinizi ve eski URL’lerin hala internette referans gösterildiğini varsayalım. SEO değerini kaybetmemek ve kullanıcı deneyimini bozmamak için eski URL’leri yeni URL’lere yönlendirmeniz gerekir. Düzenli ifadeler bu senaryo için idealdir:

server {
    listen 80;
    server_name old-example.com;

    # Eski blog gönderisi URL'lerini yeni yapıya yönlendirme
    # Örneğin: /blog/id/123 -> /yeni-blog/post-basligi-123
    location ~ ^/blog/id/(\d+)$ {
        return 301 /yeni-blog/post-basligi-$1; # $1 yakalanan ID'yi temsil eder
    }

    # Eski ürün URL'lerini yeni e-ticaret platformuna yönlendirme
    # Örneğin: /urun.php?id=456 -> /urunler/456
    location ~ ^/urun\.php\?id=(\d+)$ {
        return 301 /urunler/$1;
    }

    # Tüm diğer eski domain isteklerini yeni domain'e yönlendirme
    location / {
        return 301 http://new-example.com$request_uri;
    }
}

Bu örnekte, regex yakalama grupları (parantez içindeki (\d+) gibi) kullanılarak dinamik değerler (ID’ler) yakalanır ve $1 gibi değişkenlerle yeni URL’de kullanılır. Bu, binlerce eski URL’yi tek bir kural ile yönetmenizi sağlar.

Nginx Location Direktifinde Proxy Ayarları Nasıl Yapılır ve Neden Kullanılmalıdır?

Nginx, bir web sunucusu olarak doğrudan dosya sunmanın yanı sıra, gelen istekleri başka bir sunucuya (genellikle bir uygulama sunucusu veya başka bir mikroservis) iletmek için de yaygın olarak kullanılır. Bu işleme “ters proxy” (reverse proxy) denir ve location direktifi içinde proxy_pass komutu ile yapılandırılır. Ters proxy, modern web mimarilerinin temel taşlarından biridir.

Neden Ters Proxy Kullanılır?

  • Yük Dengeleme: Birden fazla uygulama sunucusu arasında trafiği dağıtarak yüksek erişilebilirlik ve ölçeklenebilirlik sağlar.
  • Güvenlik: Uygulama sunucularını doğrudan internete maruz bırakmak yerine Nginx’in arkasına saklayarak bir güvenlik katmanı oluşturur. Nginx, DDoS saldırılarına karşı koruma, SSL/TLS sonlandırma gibi görevleri üstlenebilir.
  • Önbellekleme: Nginx, proxy’lediği içerikleri önbelleğe alarak uygulama sunucularının yükünü azaltabilir ve yanıt sürelerini iyileştirebilir.
  • Statik İçerik Sunumu: Dinamik içerik isteklerini uygulama sunucusuna yönlendirirken, statik dosyaları (CSS, JS, resimler) doğrudan Nginx’ten sunarak uygulama sunucusunun bu tür görevlerle meşgul olmasını engeller.
  • API Ağ Geçidi: Farklı arka uç servislerine (mikroservislere) giden API isteklerini tek bir giriş noktasından yönlendirme.

Temel Proxy Direktifleri:

  • proxy_pass URL;: İsteğin iletileceği hedef sunucunun adresini belirtir. URL’nin sonundaki slash (/) karakteri önemlidir ve farklı davranışlara neden olur.
    • Eğer proxy_pass URL’nin sonunda slash varsa (http://backend/), location bloğundaki eşleşen URI kısmı kaldırılır ve kalan kısım hedefe gönderilir.
    • Eğer proxy_pass URL’nin sonunda slash yoksa (http://backend), location bloğundaki eşleşen URI kısmı da hedefe gönderilir.
  • proxy_set_header Header-Name Value;: Nginx’in proxy’lediği isteğe ekleyeceği veya değiştireceği HTTP başlıklarını belirtir. En sık kullanılanlar:
    • Host: Orijinal ana bilgisayar adını arka uç sunucusuna iletir.
    • X-Real-IP: İstemcinin gerçek IP adresini arka uç sunucusuna iletir.
    • X-Forwarded-For: İstemcinin gerçek IP adresini (veya proxy zincirindeki diğer proxy’lerin IP’lerini) arka uç sunucusuna iletir.
    • X-Forwarded-Proto: İsteğin orijinal protokolünü (HTTP veya HTTPS) arka uç sunucusuna iletir.
  • proxy_redirect: Arka uç sunucudan gelen yönlendirme (301, 302) yanıtlarındaki Location başlığını Nginx’in yeniden yazmasını sağlar.
  • proxy_buffering on|off;: Nginx’in arka uç sunucudan gelen yanıtları tamponlayıp tamponlamayacağını kontrol eder. Performans için genellikle açık bırakılır.
  • proxy_cache: Proxy’lenen yanıtları önbelleğe almak için kullanılır.

Kullanım Örneği:

Bir Node.js uygulamasını Nginx’in arkasında çalıştırmak istediğinizi varsayalım. Nginx gelen tüm istekleri (statik dosyalar hariç) Node.js uygulamasına yönlendirecek ve SSL sonlandırmasını da Nginx yapacaktır.

server {
    listen 80;
    listen 443 ssl; # SSL/TLS sonlandırması
    server_name myapp.com;

    ssl_certificate /etc/nginx/certs/myapp.com.crt;
    ssl_certificate_key /etc/nginx/certs/myapp.com.key;

    # Statik dosyaları doğrudan Nginx'ten sun
    location /static/ {
        root /var/www/myapp/public; # Statik dosyaların bulunduğu dizin
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
    }

    # Geri kalan tüm istekleri Node.js uygulamasına proxy et
    location / {
        proxy_pass http://127.0.0.1:3000; # Node.js uygulamasının çalıştığı adres ve port
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_pragma;
        proxy_cache_revalidate on; # Önbelleği yeniden doğrula
        proxy_cache_min_uses 1;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_redirect off; # Arka uçtan gelen yönlendirmeleri Nginx'in değiştirmemesi
    }
}

Bu yapılandırmada:

  • Nginx, 80 ve 443 portlarından gelen istekleri dinler ve SSL/TLS sonlandırmasını yapar.
  • location /static/ bloğu, /static/ ile başlayan tüm istekleri doğrudan Nginx’in dosya sisteminden sunar ve uzun süreli önbellekleme başlıkları ekler.
  • location / bloğu, diğer tüm istekleri (statik olmayan) http://127.0.0.1:3000 adresinde çalışan Node.js uygulamasına iletir.
  • proxy_set_header direktifleri, orijinal isteğe ait önemli bilgileri (Host, IP, protokol) Node.js uygulamasına ileterek uygulamanın doğru çalışmasını sağlar. Özellikle Host başlığı, uygulamanın sanal ana bilgisayar adını doğru bir şekilde algılaması için kritik öneme sahiptir.

Vaka Analizi: Mikroservisler Arası API Yönlendirmesi ve Güvenlik

Büyük bir SaaS (Hizmet Olarak Yazılım) platformunda, farklı işlevsellikler için ayrılmış birden fazla mikroservis bulunur: Kullanıcı Yönetimi, Ödeme İşlemleri, Bildirimler. Bu servislerin her biri kendi sunucusunda çalışır ve belirli bir API yoluyla erişilebilir. Nginx, bu servislerin önüne bir API ağ geçidi olarak konumlandırılabilir:

server {
    listen 443 ssl;
    server_name api.saasplatform.com;
    # SSL config...

    # Kullanıcı Yönetimi Servisi
    location /users/ {
        proxy_pass http://user_service_internal:8081/;
        proxy_set_header Host $host;
        # ... diğer proxy_set_header ayarları
    }

    # Ödeme İşlemleri Servisi
    location /payments/ {
        proxy_pass http://payment_service_internal:8082/;
        proxy_set_header Host $host;
        # ... diğer proxy_set_header ayarları
        # Bu servise sadece belirli IP'lerden erişim izni verilebilir
        allow 192.168.1.0/24;
        deny all;
    }

    # Bildirim Servisi
    location /notifications/ {
        proxy_pass http://notification_service_internal:8083/;
        proxy_set_header Host $host;
        # ... diğer proxy_set_header ayarları
    }
}

Bu senaryoda, Nginx:

  • Tüm API isteklerini api.saasplatform.com üzerinden alır.
  • URI’ye göre ilgili mikroservise (user_service_internal, payment_service_internal vb.) yönlendirir.
  • /payments/ API’sine erişimi belirli bir dahili IP aralığıyla kısıtlayarak ek bir güvenlik katmanı sağlar.
  • Arka uç servislerini doğrudan internete maruz bırakmaz, böylece güvenlik açıklarını azaltır.

Bu yapılandırma, karmaşık dağıtık sistemlerde API yönetimini basitleştirir, güvenliği artırır ve esnek bir mimari sunar.

Nginx Location Direktifleri Arasındaki Öncelik Çatışmaları Nasıl Çözülür?

Nginx’in location direktifleri, gelen istek URI’sini eşleştirmek için çeşitli operatörler sunar. Ancak, birden fazla location bloğu aynı URI ile eşleşebilecek durumlarda, Nginx’in hangi bloğu seçeceğini bilmek kritik öneme sahiptir. Bu, “öncelik çatışmaları” olarak adlandırılabilir ve Nginx’in belirli bir algoritmayı takip ederek bu çatışmaları çözdüğünü anlamak, beklenmeyen davranışları önlemenin anahtarıdır.

Nginx, bir isteği işlerken aşağıdaki öncelik sırasını izler:

  1. Tam Eşleşme (=): Nginx önce tam eşleşmeleri kontrol eder. Eğer isteğin URI’si bir location = /uri bloğu ile tam olarak eşleşirse, bu blok kullanılır ve Nginx başka hiçbir eşleşme aramaz. Bu, en yüksek önceliğe sahiptir.
  2. Önek Eşleşmesi (^~): Tam eşleşme bulunamazsa, Nginx ^~ (caret tilde) operatörü ile tanımlanmış önek eşleşmelerine bakar. Eğer bir location ^~ /prefix bloğu isteğin URI’sinin başlangıcıyla eşleşirse, bu blok kullanılır ve Nginx düzenli ifade eşleşmeleri de dahil olmak üzere başka hiçbir eşleşme aramaz. Bu operatör, düzenli ifade eşleşmelerinden daha yüksek öncelik kazanmak için tasarlanmıştır.
  3. Düzenli İfade Eşleşmeleri (~ ve ~*): Eğer yukarıdaki eşleşmelerden hiçbiri bulunamazsa veya ^~ ile başlayan bir önek eşleşmesi yoksa, Nginx düzenli ifade eşleşmelerini kontrol eder. Nginx, yapılandırma dosyasında tanımlandığı sıraya göre düzenli ifade bloklarını tarar ve ilk eşleşen bloğu kullanır. ~ (büyük/küçük harfe duyarlı) ve ~* (büyük/küçük harfe duyarsız) operatörleri bu kategoriye girer.
  4. En Uzun Önek Eşleşmesi (Operatörsüz): Eğer yukarıdaki eşleşmelerden hiçbiri bulunamazsa, Nginx operatörsüz (yani =, ^~, ~, ~* olmadan) tanımlanmış önek eşleşmelerine bakar. Bu durumda, Nginx isteğin URI’si ile en uzun eşleşen önek bloğunu seçer. Bu, en düşük önceliğe sahiptir ve genellikle location / bloğu bu kategoriye girer.

Öncelik Sırası Özeti:

= (Tam eşleşme) > ^~ (Önek, regex’ten önce) > ~ veya ~* (Düzenli ifade, tanım sırasına göre) > Önek (En uzun eşleşme)

Uzman İpucu: Nginx’in eşleşme algoritmasını test etmek için nginx -t komutuyla yapılandırmanızı doğrulayabilir ve hata ayıklama günlüklerini (error_log /var/log/nginx/error.log debug;) kullanarak bir isteğin hangi location bloğu tarafından işlendiğini görebilirsiniz. Bu, özellikle karmaşık yapılandırmalarda çok yardımcı olur.

Çakışan Kuralları Düzeltme Örneği:

Aşağıdaki yapılandırmayı göz önünde bulunduralım:

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    # Blok A: Tüm PNG dosyalarını önbellekle
    location ~* \.png$ {
        expires 30d;
        add_header X-Cache-Hit "PNG-Cache";
    }

    # Blok B: /images/ dizinindeki tüm dosyaları doğrudan sun, regex'ten önce
    location ^~ /images/ {
        alias /opt/static/images/;
        expires 7d;
        add_header X-Cache-Hit "Image-Dir-Cache";
    }

    # Blok C: Belirli bir PNG dosyasını özel olarak işle
    location = /images/logo.png {
        add_header X-Special-File "Logo";
        # Bu dosya için önbellekleme yapma
        expires off;
    }

    # Blok D: Varsayılan
    location / {
        try_files $uri $uri/ =404;
    }
}

Şimdi farklı isteklerin nasıl işleneceğine bakalım:

  • İstek: /images/logo.png
    • Nginx önce tam eşleşmelere bakar. location = /images/logo.png (Blok C) ile tam eşleşme bulur.
    • Sonuç: Blok C tetiklenir. X-Special-File: Logo başlığı eklenir ve önbellekleme kapatılır. Diğer bloklar değerlendirilmez.
  • İstek: /images/background.png
    • Tam eşleşme yok.
    • Nginx ^~ önek eşleşmelerine bakar. location ^~ /images/ (Blok B) ile eşleşme bulur.
    • Sonuç: Blok B tetiklenir. /opt/static/images/background.png dosyasını sunar, X-Cache-Hit: Image-Dir-Cache başlığı eklenir ve 7 günlük önbellekleme uygulanır. Düzenli ifade (Blok A) değerlendirilmez, çünkü ^~ öncelik alır.
  • İstek: /assets/icon.png
    • Tam eşleşme yok.
    • ^~ önek eşleşmesi yok.
    • Nginx düzenli ifade eşleşmelerine bakar. location ~* \.png$ (Blok A) ile eşleşme bulur.
    • Sonuç: Blok A tetiklenir. X-Cache-Hit: PNG-Cache başlığı eklenir ve 30 günlük önbellekleme uygulanır.
  • İstek: /about/contact.html
    • Hiçbir özel eşleşme bulunamaz.
    • Sonuç: En uzun önek eşleşmesi olan location / (Blok D) tetiklenir. try_files direktifi devreye girer.

Bu örnek, Nginx’in eşleşme algoritmasının karmaşık bir yapılandırmada bile nasıl deterministik (belirlenebilir) çalıştığını göstermektedir. Bu öncelik sırasını iyi anlamak, sunucu yapılandırmalarınızda beklenmeyen davranışları gidermek ve istediğiniz kuralların doğru şekilde uygulanmasını sağlamak için hayati önem taşır.

Gerçek Dünya Senaryolarında Nginx Location Direktifi Kullanımı Nasıl Olur?

Nginx location direktifleri, sadece temel dosya sunumu veya proxy işlemlerinden çok daha fazlasını yapabilen, oldukça esnek ve güçlü araçlardır. Gerçek dünya senaryolarında, bu direktifler web uygulamalarının performansını, güvenliğini ve kullanıcı deneyimini doğrudan etkileyen karmaşık sorunları çözmek için kullanılır. İşte birkaç pratik örnek:

Statik İçerik Sunumu ve Performans Optimizasyonu Nasıl Sağlanır?

Web sitelerinin büyük bir kısmı resimler, CSS dosyaları, JavaScript kodları ve yazı tipleri gibi statik varlıklardan oluşur. Bu dosyaların hızlı ve verimli bir şekilde sunulması, site performansını ve dolayısıyla kullanıcı deneyimini doğrudan etkiler. Nginx, statik içerik sunumu konusunda oldukça yeteneklidir ve location direktifleri ile bu yetenekler en üst düzeye çıkarılabilir.

Neden Önemli?

  • Hız: Tarayıcılar, statik dosyaları hızlı bir şekilde indirerek sayfayı daha çabuk oluşturur.
  • Sunucu Yükü: Uygulama sunucularının (PHP, Node.js vb.) statik dosyalarla uğraşmasını engelleyerek onların dinamik içerik üretimine odaklanmasını sağlar.
  • Bant Genişliği Tasarrufu: Önbellekleme ve sıkıştırma ile ağ trafiği azaltılır.

Nasıl Yapılır?

server {
    listen 80;
    server_name example.com;

    root /var/www/html/mysite; # Varsayılan site kök dizini

    # Statik dosyalar için ayrı bir konum ve uzun süreli önbellekleme
    location ~* \.(css|js|gif|jpg|jpeg|png|webp|svg|ico|woff2|ttf|otf|eot)$ {
        # Dosyaların bulunduğu gerçek kök dizin (eğer root'tan farklıysa)
        # alias /var/www/html/mysite/static_assets/;
        # root kullanılıyorsa, yukarıdaki root direktifi yeterlidir.

        expires 30d; # Tarayıcının 30 gün boyunca önbellekte tutmasını sağlar
        add_header Cache-Control "public, max-age=2592000, immutable"; # Gelişmiş önbellek kontrolü
        access_log off; # Bu tür istekler için günlük kaydını kapat
        log_not_found off; # Dosya bulunamazsa hata günlüğüne yazma

        # Gzip sıkıştırması (eğer dosyalar zaten gzip'lenmemişse)
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_vary on;

        # Önceden sıkıştırılmış (pre-compressed) gzip dosyalarını sunma
        # Eğer /var/www/html/mysite/style.css.gz varsa, Nginx onu sunar
        gzip_static on;
    }

    # Varsayılan olarak tüm istekleri ana uygulamaya yönlendir veya dosyaları sun
    location / {
        try_files $uri $uri/ /index.php?$query_string; # PHP uygulaması için
        # Veya tek sayfa uygulaması için:
        # try_files $uri $uri/ /index.html;
    }
}

Bu örnekte:

  • location ~* \.(css|js|gif|jpg|jpeg|png|webp|svg|ico|woff2|ttf|otf|eot)$ bloğu, yaygın statik dosya uzantılarına sahip tüm istekleri yakalar (büyük/küçük harf duyarsız).
  • expires 30d; ve add_header Cache-Control "public, max-age=2592000, immutable"; direktifleri, tarayıcıların bu dosyaları uzun süre önbelleğinde tutmasını sağlayarak tekrar tekrar indirme ihtiyacını ortadan kaldırır. immutable özelliği, dosyanın içeriğinin değişmeyeceğini belirtir.
  • access_log off; ve log_not_found off;, bu yüksek hacimli statik isteklerin sunucu günlüklerini doldurmasını engeller.
  • gzip on; ve gzip_static on;, dosyaların sıkıştırılarak sunulmasını sağlar. gzip_static on; özellikle önemlidir; Nginx’in, istenen dosyanın önceden sıkıştırılmış (.gz uzantılı) bir versiyonu varsa, onu doğrudan sunmasını sağlar. Bu, Nginx’in her istekte sıkıştırma yapma yükünü azaltır.

Güvenlik İçin Belirli İstekler Nasıl Engellenir veya Yönlendirilir?

Nginx, location direktifleri aracılığıyla web sunucunuza temel güvenlik katmanları eklemek için de kullanılabilir. Belirli dosyalara veya dizinlere erişimi kısıtlamak, kötü niyetli botları engellemek veya hassas bilgilere erişimi kontrol etmek mümkündür.

Neden Önemli?

  • Veri Güvenliği: Hassas yapılandırma dosyalarının veya yedeklerin genel erişime kapalı tutulması.
  • DDoS Koruması: Belirli kaynaklara aşırı istek gönderen botları engelleme.
  • Hotlinking Önleme: Resimlerinizin başka siteler tarafından doğrudan kullanılmasını engelleme.

Nasıl Yapılır?

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    # Gizli dosyalara (nokta ile başlayan) erişimi engelle
    location ~ /\. {
        deny all;
        # return 404; # Alternatif olarak 404 döndürülebilir
    }

    # Belirli bir dizine (örn. yönetim paneli) sadece belirli IP'lerden erişim izni ver
    location /admin/ {
        auth_basic "Admin Area";
        auth_basic_user_file /etc/nginx/.htpasswd; # Temel kimlik doğrulama
        allow 192.168.1.0/24; # Sadece bu IP aralığına izin ver
        allow 10.0.0.1;       # Bu tek IP'ye izin ver
        deny all;             # Diğer tüm IP'leri engelle
    }

    # Hotlinking'i önleme (resimlerin başka sitelerden doğrudan kullanılmasını engelleme)
    location ~* \.(jpg|jpeg|gif|png|webp|svg)$ {
        valid_referers none blocked server_names ~\.google\. ~\.bing\. ~\.yandex\.;
        if ($invalid_referer) {
            return 403; # Referer geçerli değilse 403 Forbidden döndür
            # rewrite ^ /images/no-hotlink.png break; # Alternatif olarak başka bir resme yönlendir
        }
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
    }

    # XML-RPC'ye (WordPress için) erişimi sadece belirli IP'lerden veya tamamen engelle
    location = /xmlrpc.php {
        deny all;
        # allow 123.123.123.123; # Eğer belirli bir IP'den izin vermek isterseniz
    }

    location / {
        try_files $uri $uri/ =404;
    }
}

Bu örnekte:

  • location ~ /\. bloğu, .htaccess, .env gibi nokta ile başlayan gizli dosyalara doğrudan erişimi engeller.
  • location /admin/ bloğu, /admin/ dizinine erişimi .htpasswd ile temel kimlik doğrulamasına tabi tutar ve sadece belirli IP adreslerinden erişime izin verir.
  • location ~* \.(jpg|jpeg|gif|png|webp|svg)$ bloğu, resim hotlinking’ini önler. valid_referers direktifi, isteğin geldiği referans URL’sini kontrol eder. Eğer referans, izin verilen listelerde yoksa (none, blocked, server_names veya regex ile belirtilen arama motorları hariç), $invalid_referer değişkeni 1 olur ve if ($invalid_referer) { return 403; } ile erişim engellenir.
  • location = /xmlrpc.php bloğu, WordPress sitelerinde sıkça hedef alınan xmlrpc.php dosyasına erişimi tamamen engeller.

Mobil Cihazlara Özel İçerik Sunumu Nasıl Yapılır? (Media Query Örneği ile)

Modern web siteleri, farklı cihaz boyutlarına uyum sağlamak zorundadır. Nginx, doğrudan responsive HTML üretmez, ancak gelen isteğin User-Agent başlığına bakarak mobil cihazlara özel farklı içerikleri veya farklı sunucuları proxy etme yeteneğine sahiptir. Bu, özellikle eski veya çok spesifik mobil site versiyonları için kullanışlı olabilir.

Neden Önemli?

  • Optimizasyon: Mobil cihazlara daha hafif veya özelleştirilmiş içerik sunumu.
  • Deneyim: Farklı cihazlar için en iyi kullanıcı deneyimini sağlama.
  • Kaynak Tasarrufu: Mobil cihazlar için gereksiz kaynakları yüklememe.

Nasıl Yapılır?

server {
    listen 80;
    server_name example.com;

    root /var/www/html/desktop_site; # Varsayılan olarak masaüstü sitesi

    # User-Agent başlığına göre mobil cihazları tespit et
    # Bu regex, yaygın mobil cihaz ve tablet User-Agent'larını yakalar
    if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|rim)|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino"|android|ipad|playbook|silk) {
        set $mobile_device "true";
    }

    # Eğer mobil cihaz ise, mobil site dizininden veya mobil sunucuya proxy et
    location / {
        if ($mobile_device = "true") {
            root /var/www/html/mobile_site; # Mobil site içeriğini sun
            # Veya mobil uygulama sunucusuna proxy et:
            # proxy_pass http://mobile_app_server;
        }
        try_files $uri $uri/ =404;
    }

    # Mobil uyumlu CSS media query örneği (Bu Nginx konfigürasyonu içinde HTML/CSS üretmez,
    # ancak Nginx'in mobil cihazlara farklı CSS dosyaları sunabileceğini gösterir)
    location ~* \.css$ {
        # Eğer mobil cihaz ise, mobil.css'i sun, değilse ana.css'i
        if ($mobile_device = "true") {
            # Bu kısım sadece bir mantık örneğidir, Nginx direkt olarak
            # CSS dosyalarını dinamik olarak değiştirmez.
            # Genellikle, farklı bir CSS dosyasını yönlendirmek için
            # rewrite veya farklı bir root kullanılır.
        }
        # Örnek: Mobil cihazlar için farklı bir CSS sunumu
        # rewrite ^/css/style.css$ /css/mobile-style.css last;

        add_header Content-Type text/css;
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
    }
}

Yukarıdaki Nginx yapılandırması, gelen isteğin User-Agent başlığını inceleyerek bir cihazın mobil olup olmadığını tespit eder ve $mobile_device değişkenini ayarlar. Daha sonra, location / bloğu içinde bu değişkene göre farklı bir root dizini belirleyerek mobil cihazlara özel içeriği sunar.

Mobil Uyumlu HTML (Media Query) Örneği:

Nginx, doğrudan HTML içinde media query yazmaz. Ancak, bir web sayfasının HTML veya CSS’inde media query’ler kullanılarak responsive tasarım sağlanır. Nginx’in bu konfigürasyonla yaptığı, mobil cihazlara farklı bir HTML dosyası veya farklı bir CSS dosyası sunmak olabilir. Aşağıda, bir HTML dosyasında kullanılan standart bir CSS media query örneği verilmiştir. Nginx, bu HTML dosyasını mobil cihaza sunduğunda, tarayıcı bu media query’yi yorumlayarak içeriği cihaza uygun şekilde stilize edecektir.


  <!DOCTYPE html>
  <html lang="tr">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Mobil Uyumlu Sayfa</title>
      <style>
          body {
              font-family: Arial, sans-serif;
              margin: 20px;
              color: #333;
          }
          .container {
              max-width: 960px;
              margin: 0 auto;
              padding: 15px;
              background-color: #f9f9f9;
              border-radius: 8px;
          }
          h1 {
              color: #0056b3;
          }
          p {
              line-height: 1.6;
          }

          /* Mobil cihazlar için stil kuralları (max-width 768px'e kadar) */
          @media screen and (max-width: 768px) {
              body {
                  margin: 10px;
              }
              .container {
                  padding: 10px;
                  border-radius: 0;
              }
              h1 {
                  font-size: 1.8em;
              }
              p {
                  font-size: 0.9em;
              }
              /* Mobil cihazlarda bu elemanı gizle */
              .desktop-only {
                  display: none;
              }
          }

          /* Küçük mobil cihazlar için stil kuralları (max-width 480px'e kadar) */
          @media screen and (max-width: 480px) {
              h1 {
                  font-size: 1.5em;
              }
              p {
                  font-size: 0.8em;
              }
          }
      </style>
  </head>
  <body>
      <div class="container">
          <h1>Nginx ve Mobil Uyumlu İçerik</h1>
          <p>Bu sayfa, Nginx'in mobil cihazlara özel içerik sunumu yeteneğini ve HTML/CSS içindeki media query'lerin nasıl çalıştığını göstermektedir. Nginx, farklı User-Agent başlıklarına göre farklı HTML veya CSS dosyaları sunarak, tarayıcının doğru responsive kuralları uygulamasını sağlayabilir.</p>
          <p class="desktop-only">Bu paragraf sadece masaüstü cihazlarda görünür.</p>
      </div>
  </body>
  </html>

Bu HTML örneği, CSS içinde @media screen and (max-width: ...) kurallarını kullanarak farklı ekran boyutlarına göre elementlerin stilini değiştirmektedir. Nginx’in görevi, bu HTML dosyasını veya bu HTML dosyasının referans verdiği CSS dosyasını (örneğin mobile.css veya desktop.css) doğru cihaza sunmaktır. Bu şekilde, Nginx ve responsive tasarım birlikte çalışarak tüm cihazlarda optimize bir kullanıcı deneyimi sağlar.

Nginx Location Direktifi Kullanımında İleri Düzey İpuçları ve En İyi Uygulamalar Nelerdir?

Nginx location direktiflerinin temel kullanımını anladıktan sonra, daha verimli, güvenli ve ölçeklenebilir yapılandırmalar oluşturmak için bazı ileri düzey ipuçları ve en iyi uygulamaları bilmek önemlidir. Bu bilgiler, sadece sorunları çözmekle kalmayacak, aynı zamanda sunucunuzun performansını da artıracaktır.

1. try_files Direktifi ile Esnek Dosya Sunumu

try_files direktifi, Nginx’in bir isteği işlerken belirli bir sıraya göre dosyaları veya URI’leri denemesini sağlar. Bu, özellikle tek sayfa uygulamaları (SPA’lar) için veya özel 404 sayfaları oluştururken çok kullanışlıdır.

location / {
    # Önce $uri'yi (istenen dosya), sonra $uri/ (istenen dizin) dene.
    # Eğer ikisi de bulunamazsa, /index.html dosyasını sun (SPA için).
    try_files $uri $uri/ /index.html;
}

location /admin/ {
    # Önce $uri'yi, sonra $uri/'yi dene.
    # Eğer ikisi de bulunamazsa, =404 ile 404 hatası döndür.
    try_files $uri $uri/ =404;
}

Bu direktif, Nginx’in dosya sisteminde dosya araması yaparken esneklik sağlar ve gereksiz proxy isteklerini veya hata yanıtlarını önler.

2. error_page Direktifi ile Özel Hata Sayfaları

Kullanıcılara standart Nginx hata sayfaları yerine markanıza uygun, bilgilendirici hata sayfaları sunmak profesyonel bir yaklaşımdır. error_page direktifi ile bunu kolayca yapabilirsiniz.

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    # 404 hataları için özel bir sayfa göster
    error_page 404 /404.html;
    location = /404.html {
        internal; # Sadece Nginx içinden erişilebilir olsun
    }

    # 500, 502, 503, 504 hataları için özel bir sayfa göster
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        internal;
    }

    location / {
        try_files $uri $uri/ =404;
    }
}

internal; direktifi, bu hata sayfalarına doğrudan URL üzerinden erişimi engeller, sadece Nginx’in kendisi tarafından tetiklenebilirler.

3. Performans İçin Düzenli İfade Optimizasyonu

Düzenli ifadeler güçlüdür ancak yanlış kullanıldığında performansı etkileyebilir. Karmaşık veya verimsiz regex desenlerinden kaçınmak önemlidir. Mümkün olduğunca = veya ^~ önek eşleşmelerini tercih edin. Eğer regex kullanmanız gerekiyorsa, en basit ve en spesifik deseni kullanmaya çalışın.

  • Kötü: location ~ .*some_string.* (.* baştan sona tüm karakterleri tarar)
  • İyi: location ~ \.php$ (sadece sonu .php olanları arar)

4. Konfigürasyonları Modüler Hale Getirme (include)

Büyük ve karmaşık Nginx yapılandırmalarında, tüm direktifleri tek bir dosyada tutmak yönetimi zorlaştırabilir. include direktifi ile yapılandırmanızı mantıksal parçalara ayırabilirsiniz.

# nginx.conf veya sites-enabled/default.conf içinde
server {
    listen 80;
    server_name example.com;

    # Ortak proxy ayarlarını dahil et
    include /etc/nginx/conf.d/proxy_params.conf;

    # Statik dosyalar için location bloklarını dahil et
    include /etc/nginx/conf.d/static_assets.conf;

    location /api/ {
        proxy_pass http://backend_api;
    }

    location / {
        try_files $uri $uri/ =404;
    }
}

/etc/nginx/conf.d/proxy_params.conf içeriği:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

Bu, yapılandırmayı daha okunabilir ve yönetilebilir hale getirir, ayrıca farklı server blokları arasında ortak ayarları paylaşmayı kolaylaştırır.

5. Loglama ve Hata Ayıklama İpuçları

Yapılandırma hatalarını veya beklenmeyen davranışları teşhis etmek için Nginx’in günlükleri paha biçilmezdir.

  • access_log ve error_log: Her server veya location bloğunda özel günlük dosyaları tanımlayabilirsiniz.
    location /admin/ {
                access_log /var/log/nginx/admin_access.log;
                error_log /var/log/nginx/admin_error.log warn;
                # ...
            }
            
  • Hata Ayıklama Modu: Geliştirme ortamında, error_log seviyesini debug olarak ayarlayarak çok daha detaylı bilgi alabilirsiniz.
    error_log /var/log/nginx/error.log debug;
            

    Bu, Nginx’in bir isteği işlerken hangi location bloğunu seçtiğini, hangi dosyaları denediğini ve diğer iç süreçleri görmenizi sağlar.

  • nginx -t: Herhangi bir yapılandırma değişikliğinden sonra bu komutu çalıştırarak sözdizimi hatalarını kontrol edin.

6. if Direktifi Kullanımına Dikkat

Nginx’in if direktifi güçlüdür ancak “If is Evil” (if kötüdür) kuralı olarak bilinir. Yanlış kullanıldığında beklenmeyen davranışlara ve performans sorunlarına yol açabilir. Mümkünse if yerine try_files, rewrite veya farklı location blokları kullanmayı tercih edin. if kullanmanız gerekiyorsa, basit koşullar için ve dikkatli bir şekilde kullanın.

Bu ileri düzey ipuçları ve en iyi uygulamalar, Nginx yapılandırmalarınızı daha sağlam, daha performanslı ve daha kolay yönetilebilir hale getirmenize yardımcı olacaktır. Unutmayın, her senaryo benzersizdir ve en iyi çözümü bulmak için deneme ve yanılma yöntemini kullanmak genellikle kaçınılmazdır.

Sonuç: Nginx Location Direktifleri ile Web Sunucunuzu Ustaca Yönetin

Bu makalede, Nginx’in web sunucusu yönetimindeki en temel ve güçlü araçlarından biri olan location direktifini ayrıntılı bir şekilde inceledik. Gördüğümüz gibi, location direktifi sadece bir istek yönlendirme mekanizması olmaktan çok daha fazlasıdır; web uygulamalarınızın performansını, güvenliğini ve ölçeklenebilirliğini doğrudan etkileyen stratejik bir bileşendir.

Tam eşleşme (=) ile belirli dosyalar için yüksek öncelikli ve hızlı yanıtlar sağlarken, önek eşleşmeleri (operatörsüz veya ^~) ile dizin tabanlı içerik yönetimini kolaylaştırdık. Düzenli ifadeler (~ ve ~*) sayesinde ise dinamik ve karmaşık URL desenlerini esnek bir şekilde ele almayı öğrendik. Ayrıca, proxy_pass direktifiyle Nginx’i güçlü bir ters proxy ve API ağ geçidi olarak nasıl kullanacağımızı, uygulama sunucularını koruyarak ve yük dengeleyerek sistemlerimizi nasıl daha sağlam hale getireceğimizi keşfettik.

Öncelik sırasını anlamanın, yapılandırma çatışmalarını çözmenin ve gerçek dünya senaryolarında (statik içerik optimizasyonu, güvenlik kısıtlamaları, mobil içerik sunumu) Nginx’i nasıl uygulayacağımızı gösteren vaka analizleriyle bilgimizi pekiştirdik. Son olarak, try_files, error_page, modüler yapılandırmalar ve hata ayıklama ipuçları gibi ileri düzey tekniklerle Nginx uzmanlığımızı bir adım öteye taşıdık.

Nginx location direktiflerinde ustalaşmak, web sunucunuz üzerinde tam kontrol sahibi olmanızı ve modern web’in zorluklarına karşı dayanıklı, yüksek performanslı ve güvenli altyapılar kurmanızı sağlar. Bu bilgilerle, web projelerinizi bir sonraki seviyeye taşıyacak güce sahipsiniz.

Sıkça Sorulan Sorular (SSS)

1. root ve alias direktifleri arasındaki temel fark nedir?

Cevap: Her ikisi de dosya sistemindeki bir dizini belirtmek için kullanılır, ancak farklı şekillerde çalışırlar:

  • root: Genellikle server bloğunda veya bir location bloğunda tanımlanır. Nginx, gelen URI’yi root dizininin sonuna ekleyerek dosya yolunu oluşturur. Örneğin, root /var/www/html; ve istek /images/logo.png ise, Nginx /var/www/html/images/logo.png dosyasını arar.
  • alias: Sadece location bloklarında kullanılır ve genellikle önek eşleşmeleriyle birlikte tercih edilir. Nginx, location bloğunda eşleşen URI kısmını kaldırır ve kalan kısmı alias dizininin sonuna ekler. Örneğin, location /static/ { alias /opt/web/assets/; } ve istek /static/css/style.css ise, Nginx /opt/web/assets/css/style.css dosyasını arar. Kısacası, root tam URI’yi eklerken, alias eşleşen öneki çıkarır ve kalanını ekler.

2. location / bloğu neden önemlidir?

Cevap: location / bloğu, Nginx’teki varsayılan (catch-all) location bloğudur. Diğer tüm daha spesifik location bloklarıyla eşleşmeyen istekler bu blok tarafından işlenir. Bu nedenle, genel bir yedekleme mekanizması sağlar ve genellikle site kök dizinini belirtmek, try_files ile varsayılan dosyaları sunmak veya bir uygulama sunucusuna proxy yapmak için kullanılır. Her server bloğunda bir location / bloğunun bulunması iyi bir pratiktir.

3. Nginx’te location eşleşmesi önceliği nasıl belirlenir?

Cevap: Nginx, location bloklarını belirli bir öncelik sırasına göre değerlendirir:

  1. = (Tam eşleşme) – En yüksek öncelik, eşleşme bulunursa arama durur.
  2. ^~ (Önek eşleşmesi, düzenli ifadelerden önce) – Eşleşme bulunursa arama durur.
  3. ~ veya ~* (Düzenli ifade eşleşmesi) – Yapılandırma dosyasında tanımlandığı ilk eşleşen kullanılır.
  4. Operatörsüz önek eşleşmesi – En uzun eşleşen önek seçilir.

Bu sırayı anlamak, beklenmeyen yönlendirmeleri veya kural çatışmalarını çözmek için kritik öneme sahiptir.

4. try_files direktifi ne işe yarar ve ne zaman kullanılmalıdır?

Cevap: try_files direktifi, Nginx’in belirli bir sıraya göre dosyaları veya URI’leri denemesini sağlar. İlk bulunan geçerli dosya veya URI sunulur. Eğer hiçbiri bulunamazsa, son argüman (genellikle bir dosya veya bir HTTP durum kodu, örneğin =404) kullanılır. Tek sayfa uygulamalarında (SPA) tüm yolların index.html‘e yönlendirilmesi veya özel 404 sayfaları oluşturulması gibi senaryolarda çok kullanışlıdır. Örneğin: try_files $uri $uri/ /index.html;

5. location blokları içinde if kullanmak iyi bir pratik midir?

Cevap: Nginx’in if direktifi “If is Evil” (if kötüdür) kuralı olarak bilinir çünkü karmaşık veya yanlış kullanıldığında beklenmeyen davranışlara ve performans sorunlarına yol açabilir. Nginx’in kendi eşleşme algoritması ve diğer direktifleri (try_files, rewrite, map modülü) çoğu durumda if‘ten daha güvenli ve verimli alternatifler sunar. Mümkünse if kullanımından kaçınılmalı ve Nginx’in diğer araçları tercih edilmelidir. Ancak, basit koşullar (örneğin $invalid_referer kontrolü gibi) için dikkatli bir şekilde kullanılabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

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

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.