Nginx ile Statik İçerik Cache Ayarları
Büyüyen internet ile birlikte kullanıcı kitlesi ve buna bağlı olarak sunulan içerikler artıyor. Hal böyle olunca ziyaretçilere sunulan hizmetin daha iyi olması hatta en hızlı şekilde sunulabilmesi için geliştiriciler uygulamalarına daha itina ve özen gösteriyor.
Hatrı sayılır bir trafiğe sahip hobi projem bulunmakta. Bu proje tekil kullanıcı sayısının neredeyse 10 katı çoğul ziyaret bulunmakta. Her isteğin webserver üzerinden application server'a gittiğini düşünün ve oluşabilecek cost'u hayal edin.
Bu yazıda kendi projeme uyguladığım Nginx Proxy Cache kurulumunu Wordpress örneği üzerinden dilim döndüğü kadarıyla anlatacağım. Yanlış veya eksik gördüğünüz noktaları bildirirseniz bu yazının daha faydalı olmasını sağlarsınız 🙂
Aşağıdaki örnek Debian 7, Nginx 1.10 versiyonuna aittir.
Config Düzenlemeleri
- Config dosyamızı açalım
- server bloğunun üstüne aşağıdaki tanımlamaları yapıyoruz.
fastcgi_cache_path /var/www/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri";
Yaptığımız bu tanımlamada;
- fastcgi_cache_path: Nginx Cache dosyalarının yer alacağı klasör ve bu dosyalara ait bazı parametreler belirleniyor.
- keys_zone: Cache’in ismi. Farklı sitelere ait cacheler ile karışmaması adına verilen isim.
- 100m: Cache’in geçerlilik süresi.
- inactive: Hiç kullanılmadığında geçerliliğini yitirecek olan cache’in süresi.
- fastcgi_cache_key: Gelen isteklerin oluşturacağı cache ismi. Burada değişken isimleri kullanıldığı için her istek ayrı bir cache olarak yazılacaktır.
Server bloğunun içine aşağıdaki tanımlamayı yapıyoruz. Bu tanımlama ile cache yapılmasını istemediğimiz zamanlarda değerini 1 yaparak cache girmesini engellemiş oluyoruz.
set $no_cache 0;
Cache Girmemesi Gereken Durumlar
- POST isteklerini cache’e girmesini istemiyorsak;
if ($request_method = POST) { set $no_cache 1; }
- Query String ifadelerinin olduğu sayfaların cache girmesini önlemek istiyorsak;
if ($query_string != "") { set $no_cache 1; }
- WordPress’e özel olarak, Ajax ve wp-admin alanlarının cache’e girmemesi için;
if ($request_uri ~* "/(wp-admin/|wp-login.php)") { set $no_cache 1; }
Location Düzenlemesi
Bir PHP servisi çalıştırdığınızı düşünürsek php-fpm için oluşturduğunuz location bloğu için aşağıdaki satırları eklemeniz gerekmektedir.
fastcgi_cache MYAPP; fastcgi_cache_valid 200 60m; fastcgi_cache_bypass $no_cache; fastcgi_no_cache $no_cache;
Sayfalar cache’den mi geliyor?
Bunu öğrenmek için aşağıdaki header tanımlamasını yaparak sayfanızın cache ile gelip gelmediğini görebilirsiniz.
add_header X-Cache $upstream_cache_status;
Bu ayarları yaptıktan sonra nginx reload ederek cache ile içeriklerinizi sunabilirsiniz. 🙂
Peki bu işlemleri yaptıktan sonra olası bir durumda cache silmemiz gerekti ne yapacağız?
Şu anda kullandığım yöntem tüm sitenin önbelleğini temizlemek. Bunun için yukarıda tanımladığımız cache folder’ını silmek. Ancak bu işlemi daha performanslı ve stabil bir şekilde yapmak için aşağıda bulunan nginx döküman sayfasını takip edebilirsiniz. Net bir bilgi olmamakla beraber purge yapabilmek için nginx plus sahibi olmanız gerekiyor. Fakat aşağıda normal bir nginx için yapılan ayarları görebilirsiniz.
Son olarak yazıyı hazırlarken kendi wordpress bloğuma yaptığım configleri kullanarak hazırladım. Bu nedenle eksik veya hatalı olan noktaları yazarak bilgilendirme yapmanız beni memnun edecektir.