- Konu sahibi
- #1
İlk olarak hangi içeriği önbelleğe alacağınızı belirleyin: Nginx’in arkasında PHP-FPM varsa
Nginx’in önbelleğe alması iki yaygın biçimde yapılandırılır:
Aşağıdaki örnek PHP-FPM içindir. Uygulamanız
Önce Nginx’in yazabileceği bir dizin oluşturun. Örnekte dizin
Nginx yapılandırmasındaki ana
PHP isteklerini işleyen mevcut
Buradaki PHP-FPM soket yolu sisteminizde farklı olabilir. Mevcut çalışan yapılandırmanızda
Önbellek ayarının güvenli olması için giriş yapmış kullanıcıların ve değişken içerik üreten isteklerin önbellekten okunmasını ve önbelleğe yazılmasını engelleyin.
Bu örnek
Bir uygulama yanıtında
Değişiklikleri kaydettikten sonra çalışan Nginx’e doğrudan yeniden başlatma uygulamak yerine önce söz dizimini test edin:
İçerik güncellendiğinde eski kayıt, belirlediğiniz
fastcgi_cache, başka bir HTTP uygulama sunucusu varsa proxy_cache kullanılır. Önbellek alanını http bloğunda tanımlayıp ilgili server veya location bloğunda etkinleştirin; ardından yapılandırmayı nginx -t ile doğrulayarak yeniden yükleyin. Başarılı bir testte ilk istek genellikle MISS, sonraki aynı istek ise HIT durumunu göstermelidir. Oturum açmış kullanıcı, sepet, ödeme ve kişiye özel yanıtlar önbelleğe alınmamalıdır.Önbellek türünü seçin
Nginx’in önbelleğe alması iki yaygın biçimde yapılandırılır:
| Uygulama yapısı | Kullanılacak yapı | Tipik kullanım |
|---|---|---|
| Nginx → PHP-FPM | fastcgi_cache | WordPress ve diğer PHP uygulamalarının anonim sayfaları |
| Nginx → HTTP upstream | proxy_cache | Node.js, Python, Java veya başka bir HTTP sunucusunun yanıtları |
proxy_pass ile başka bir HTTP sunucusuna bağlanıyorsa aynı mantığı proxy_cache_path, proxy_cache ve ilgili proxy_no_cache yönergeleriyle uygulamanız gerekir.PHP-FPM için FastCGI önbelleğini tanımlayın
Önce Nginx’in yazabileceği bir dizin oluşturun. Örnekte dizin
/var/cache/nginx/fastcgi olarak kabul edilmiştir. Dağıtımınızda Nginx çalışan kullanıcının bu dizine yazma izni olmalıdır; kullanıcı adı sisteme göre www-data, nginx veya başka bir değer olabilir.Nginx yapılandırmasındaki ana
http bloğuna, server bloklarının dışına şu tanımı ekleyin:
NGINX:
fastcgi_cache_path /var/cache/nginx/fastcgi
levels=1:2
keys_zone=PHP_CACHE:100m
inactive=60m
max_size=1g
use_temp_path=off;
keys_zone önbellek anahtarlarının bellekte tutulduğu alanı, inactive uzun süre erişilmeyen kayıtların silinme süresini, max_size ise disk kullanım sınırını belirler. Bu değerler örnektir; max_size değerini önbellek için ayırabileceğiniz disk alanına göre belirleyin. Dizin yoksa oluşturun ve Nginx işçisinin yazma iznini verin.PHP location bloğunu düzenleyin
PHP isteklerini işleyen mevcut
location ~ \\.php$ bloğunuzda, zaten bulunan fastcgi_pass ve fastcgi_param yönergelerini koruyarak önbellek ayarlarını ekleyin. Örnek:
NGINX:
location ~ \\.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_cache PHP_CACHE;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-FastCGI-Cache $upstream_cache_status always;
}
Buradaki PHP-FPM soket yolu sisteminizde farklı olabilir. Mevcut çalışan yapılandırmanızda
fastcgi_pass satırı varsa onu örnekteki değerle değiştirmeyin. fastcgi_cache_key aynı URL’nin hangi önbellek kaydına karşılık geldiğini belirler; $host ve $request_uri kullanılması farklı alan adlarının veya sorgu dizelerinin yanlışlıkla aynı içerik olarak değerlendirilmesini önlemeye yardımcı olur.Oturum ve kişisel içerikleri dışarıda bırakın
Önbellek ayarının güvenli olması için giriş yapmış kullanıcıların ve değişken içerik üreten isteklerin önbellekten okunmasını ve önbelleğe yazılmasını engelleyin.
server veya http bloğunda şu eşlemeyi tanımlayın:
NGINX:
map $request_method $skip_cache_method {
default 0;
POST 1;
}
map $http_cookie $skip_cache_cookie {
default 0;
~*"(PHPSESSID|wordpress_logged_in_|comment_author_)" 1;
}
map "$skip_cache_method$skip_cache_cookie" $skip_cache {
default 0;
~1 1;
}
Bu örnek
POST isteklerini ve belirtilen oturum çerezlerini dışarıda bırakır. Eşlemenin mevcut map tanımlarıyla çakışmadığından emin olun. Uygulamanız farklı çerez adları kullanıyorsa onları ayrıca ekleyin. Yönetim paneli, sepet, ödeme ve kullanıcı hesabı yollarını da ayrıca hariç tutmak gerekir; yalnız çerez kontrolü bütün uygulamalarda yeterli olmayabilir.Bir uygulama yanıtında
Set-Cookie gönderiyor veya Cache-Control: private/no-store belirtiyorsa bunu zorla önbelleğe almak yerine önce uygulamanın neden kişisel yanıt ürettiğini çözün. Nginx yönergeleriyle bu başlıkları yok saymak, yanlış kullanılırsa bir kullanıcının verisini başka bir kullanıcıya gösterebilir.Yapılandırmayı kaydedip sonucu kontrol edin
Değişiklikleri kaydettikten sonra çalışan Nginx’e doğrudan yeniden başlatma uygulamak yerine önce söz dizimini test edin:
- Sunucuda
nginx -tkomutunu çalıştırın.syntax is okvetest is successfulbenzeri başarılı bir çıktı görmeden yeniden yükleme yapmayın. - Test başarılıysa
systemctl reload nginxkomutuyla yapılandırmayı yeniden yükleyin. Hata alırsanız önce hata mesajındaki dosya ve satır numarasını kontrol edin; özelliklefastcgi_cache_pathsatırınınhttpbloğunda,fastcgi_cachesatırının ise uygunlocationiçinde olduğunu doğrulayın. - Aynı herkese açık URL’yi iki kez isteyin:
curl -I https://alanadiniz.example/ornek-sayfa/. İlk yanıttaX-FastCGI-Cache: MISS, sonraki istekteX-FastCGI-Cache: HITgörmeyi beklersiniz.
MISS, yanıtın henüz önbellekte bulunmadığını veya bu istek için önbellek kaydı oluşturulmadığını gösterir; tek başına yapılandırmanın bozuk olduğunu kanıtlamaz. İkinci istekte de MISS görüyorsanız URL değişiyor olabilir, yanıt önbelleğe alınmıyor olabilir, Set-Cookie veya Cache-Control başlıkları devreye giriyor olabilir ya da $skip_cache değeri 1 oluyordur. Bu durumda yanıt başlıklarını curl -I ile, Nginx hata günlüğünü ve uygulamanın gönderdiği önbellek başlıklarını birlikte inceleyin.İçerik güncellendiğinde eski kayıt, belirlediğiniz
fastcgi_cache_valid süresi dolana kadar sunulabilir. Acil bir güncellemede ilgili önbellek dizinini temizleyip Nginx’i yeniden yüklemek yerine, önce bakım anında ve aktif istekler yokken temizleme planı uygulayın; tüm önbellek dizinini silmek geçici olarak disk ve PHP-FPM yükünü artırabilir. Daha kontrollü temizleme gerekiyorsa Nginx Open Source’ta yerleşik, genel amaçlı bir PURGE yönergesi bulunmadığını ve kullanılan üçüncü taraf çözümlerin ayrıca incelenmesi gerektiğini dikkate alın.