{"id":1607,"date":"2025-11-09T23:56:26","date_gmt":"2025-11-09T20:56:26","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/nginx-mikro-onbellekleme-ile-php-uygulamalarini-ucurmak-1-5-sn-cache-bypass-ve-purge-ne-zaman-nasil\/"},"modified":"2025-11-09T23:56:26","modified_gmt":"2025-11-09T20:56:26","slug":"nginx-mikro-onbellekleme-ile-php-uygulamalarini-ucurmak-1-5-sn-cache-bypass-ve-purge-ne-zaman-nasil","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/nginx-mikro-onbellekleme-ile-php-uygulamalarini-ucurmak-1-5-sn-cache-bypass-ve-purge-ne-zaman-nasil\/","title":{"rendered":"Nginx Mikro \u00d6nbellekleme ile PHP Uygulamalar\u0131n\u0131 U\u00e7urmak: 1\u20135 sn Cache, Bypass ve Purge Ne Zaman, Nas\u0131l?"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Ofiste_Bir_Kampanya_Sabahi_ve_Mikro_Onbellegin_Fisildadigi_Cozum\"><span class=\"toc_number toc_depth_1\">1<\/span> Ofiste Bir Kampanya Sabah\u0131 ve Mikro \u00d6nbelle\u011fin F\u0131s\u0131ldad\u0131\u011f\u0131 \u00c7\u00f6z\u00fcm<\/a><\/li><li><a href=\"#Mikro_Onbellekleme_Nedir_Neden_15_Saniye\"><span class=\"toc_number toc_depth_1\">2<\/span> Mikro \u00d6nbellekleme Nedir, Neden 1\u20135 Saniye?<\/a><\/li><li><a href=\"#PHP_ile_Nginxte_Mikro_Onbellek_FastCGI_mi_Proxy_mi\"><span class=\"toc_number toc_depth_1\">3<\/span> PHP ile Nginx\u2019te Mikro \u00d6nbellek: FastCGI mi, Proxy mi?<\/a><\/li><li><a href=\"#Cache_Key_Varyasyonlar_ve_Minicik_Ama_Etkili_Bir_TTL\"><span class=\"toc_number toc_depth_1\">4<\/span> Cache Key, Varyasyonlar ve Minicik Ama Etkili Bir TTL<\/a><\/li><li><a href=\"#Bypass_Stratejileri_Kimin_Yolunu_Acacagiz\"><span class=\"toc_number toc_depth_1\">5<\/span> Bypass Stratejileri: Kimin Yolunu A\u00e7aca\u011f\u0131z?<\/a><\/li><li><a href=\"#Purge_Stratejileri_Ne_Zaman_Temizlik_Gerekir\"><span class=\"toc_number toc_depth_1\">6<\/span> Purge Stratejileri: Ne Zaman Temizlik Gerekir?<\/a><\/li><li><a href=\"#WordPress_Laravel_ve_Ozel_PHP_Uygulamalarinda_Puf_Noktalari\"><span class=\"toc_number toc_depth_1\">7<\/span> WordPress, Laravel ve \u00d6zel PHP Uygulamalar\u0131nda P\u00fcf Noktalar\u0131<\/a><\/li><li><a href=\"#Gozlemlemek_Olcmek_Sakin_Kalmak\"><span class=\"toc_number toc_depth_1\">8<\/span> G\u00f6zlemlemek, \u00d6l\u00e7mek, Sakin Kalmak<\/a><\/li><li><a href=\"#Kenarlarda_Kalanlar_Nonce_CSRF_ETag_ve_Set-Cookie\"><span class=\"toc_number toc_depth_1\">9<\/span> Kenarlarda Kalanlar: Nonce, CSRF, ETag ve Set-Cookie<\/a><\/li><li><a href=\"#Adim_Adim_Bir_Kurgu_Mikro_Onbellekli_WordPress\"><span class=\"toc_number toc_depth_1\">10<\/span> Ad\u0131m Ad\u0131m Bir Kurgu: Mikro \u00d6nbellekli WordPress<\/a><\/li><li><a href=\"#Cache_Purge_Icin_Pratik_Yaklasimlar\"><span class=\"toc_number toc_depth_1\">11<\/span> Cache Purge \u0130\u00e7in Pratik Yakla\u015f\u0131mlar<\/a><\/li><li><a href=\"#Gercek_Zamanli_Trafik_Dalgalari_ve_Sakin_Bir_Nginx\"><span class=\"toc_number toc_depth_1\">12<\/span> Ger\u00e7ek Zamanl\u0131 Trafik Dalgalar\u0131 ve Sakin Bir Nginx<\/a><\/li><li><a href=\"#CDN_ile_El_Sikismak_Kim_Neyi_Ne_Kadar_Zaman_Tutar\"><span class=\"toc_number toc_depth_1\">13<\/span> CDN ile El S\u0131k\u0131\u015fmak: Kim Neyi, Ne Kadar Zaman Tutar?<\/a><\/li><li><a href=\"#Sorun_Giderme_Neyi_Gorunce_Nereden_Baslamali\"><span class=\"toc_number toc_depth_1\">14<\/span> Sorun Giderme: Neyi G\u00f6r\u00fcnce Nereden Ba\u015flamal\u0131?<\/a><\/li><li><a href=\"#Ek_Notlar_ve_Guzel_Kucuk_Dokunuslar\"><span class=\"toc_number toc_depth_1\">15<\/span> Ek Notlar ve G\u00fczel K\u00fc\u00e7\u00fck Dokunu\u015flar<\/a><\/li><li><a href=\"#Kapanis_Kucuk_Bir_Tornavida_Buyuk_Bir_Ferahlik\"><span class=\"toc_number toc_depth_1\">16<\/span> Kapan\u0131\u015f: K\u00fc\u00e7\u00fck Bir Tornavida, B\u00fcy\u00fck Bir Ferahl\u0131k<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"Ofiste_Bir_Kampanya_Sabahi_ve_Mikro_Onbellegin_Fisildadigi_Cozum\">Ofiste Bir Kampanya Sabah\u0131 ve Mikro \u00d6nbelle\u011fin F\u0131s\u0131ldad\u0131\u011f\u0131 \u00c7\u00f6z\u00fcm<\/span><\/h2>\n<p>Hi\u00e7 \u015f\u00f6yle oldu mu? Bir kampanya maili gider, sosyal medya bir anda ate\u015f al\u0131r ve sitenin ana sayfas\u0131 \u00e7\u0131\u011f gibi trafik alt\u0131nda ezilir. O sabah, kahvemi yar\u0131m b\u0131rak\u0131p monit\u00f6re yap\u0131\u015ft\u0131\u011f\u0131m\u0131 hat\u0131rl\u0131yorum. CPU tavan, PHP-FPM kuyrukta inliyor, TTFB k\u0131p\u0131rdam\u0131yor. Derken mikro bir dokunu\u015f geldi akl\u0131ma: <strong>Nginx mikro \u00f6nbellekleme<\/strong>. Asl\u0131nda y\u0131llard\u0131r bildi\u011fimiz bir e\u015fya gibi; \u00e7ekmece kenar\u0131nda bekleyen k\u00fc\u00e7\u00fck bir tornavida. Bir \u00e7evirdim, her \u015fey yerine oturdu.<\/p>\n<p>Bu yaz\u0131da tam da o k\u00fc\u00e7\u00fck tornaviday\u0131 konu\u015faca\u011f\u0131z. 1\u20135 saniyelik cache s\u00fcresiyle dinamik PHP sayfalar\u0131n\u0131 nas\u0131l yumu\u015fac\u0131k h\u0131zland\u0131rabilece\u011fimizi, hangi durumlarda bypass edece\u011fimizi ve gerekti\u011finde nas\u0131l temiz bir purge yapaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m anlataca\u011f\u0131m. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: Her istek taze pi\u015fsin demiyoruz, sadece ayn\u0131 anda gelen onlarca iste\u011fi <em>birka\u00e7 saniyelik<\/em> bir ara bellekte tutarak f\u0131r\u0131n\u0131n kap\u0131s\u0131n\u0131 gereksiz yere a\u00e7m\u0131yoruz. Aradaki fark, ger\u00e7ek d\u00fcnyada g\u00f6zle g\u00f6r\u00fcl\u00fcr oluyor.<\/p>\n<p>\u0130\u015fin g\u00fczel taraf\u0131, bunu ister WordPress, ister Laravel, ister \u00f6zel geli\u015ftirilmi\u015f bir PHP uygulamas\u0131 olsun, birka\u00e7 ak\u0131ll\u0131 kural ve ufak dokunu\u015fla yay\u0131na alabiliyoruz. Ben kendi ya\u015fad\u0131klar\u0131mla harmanlay\u0131p, anla\u015f\u0131l\u0131r ve s\u0131cak bir ak\u0131\u015fla payla\u015faca\u011f\u0131m. Haz\u0131rsan\u0131z ba\u015flayal\u0131m.<\/p>\n<h2 id=\"section-2\"><span id=\"Mikro_Onbellekleme_Nedir_Neden_15_Saniye\">Mikro \u00d6nbellekleme Nedir, Neden 1\u20135 Saniye?<\/span><\/h2>\n<p>\u00d6nbellek deyince \u00e7o\u011fumuzun akl\u0131na dakikalar, saatler gelir. Mikro \u00f6nbellekleme ise tam tersine, <strong>1\u20135 saniye<\/strong> gibi minicik bir zaman diliminde \u00e7al\u0131\u015f\u0131r. Peki bu kadar k\u0131sa s\u00fcre ne i\u015fimize yarar? Trafi\u011fin dalgaland\u0131\u011f\u0131 anlarda, ilk iste\u011fi uygulamaya g\u00f6nderir, yan\u0131t\u0131 birka\u00e7 saniyeli\u011fine Nginx\u2019te saklar\u0131z. Ayn\u0131 i\u00e7erik i\u00e7in pe\u015f pe\u015fe gelen istekler o k\u0131sa s\u00fcre i\u00e7inde do\u011frudan Nginx\u2019ten \u00e7\u0131kar. Uygulama katman\u0131 derin bir nefes al\u0131r.<\/p>\n<p>Bu yakla\u015f\u0131m, ki\u015fiselle\u015ftirme i\u00e7ermeyen ya da hafif ki\u015fiselle\u015ftirilmi\u015f sayfalarda <em>anl\u0131k ta\u015fmalar\u0131<\/em> yumu\u015fat\u0131r. Ana sayfa, kategori listeleri, pop\u00fcler i\u00e7erik sayfalar\u0131 ya da yo\u011fun yorum alan blog yaz\u0131lar\u0131 gibi kalabal\u0131k noktalar i\u00e7in birebir. S\u00fcre k\u0131sa oldu\u011fu i\u00e7in mutlak tutarl\u0131l\u0131k talebi olan sayfalarda bile risk minimal kal\u0131r. Yanl\u0131\u015f bir i\u00e7erik g\u00f6rme ihtimali, insan\u0131n g\u00f6z k\u0131rpmas\u0131 kadar bir zamana s\u0131\u011far, \u00e7o\u011fu kullan\u0131c\u0131 fark bile etmez.<\/p>\n<p>Dezavantaj\u0131 yok mu? Var elbette. Baz\u0131 sayfalar anl\u0131k ki\u015fiselle\u015ftirme ta\u015f\u0131r; \u00f6rne\u011fin kullan\u0131c\u0131ya \u00f6zel selamlama, sepet \u00f6zeti, CSRF token gibi \u00f6\u011feler. Bu alanlarda mikro \u00f6nbellek ya devre d\u0131\u015f\u0131 b\u0131rak\u0131lmal\u0131 ya da bu ki\u015fisel par\u00e7alar ayr\u0131 d\u00fc\u015f\u00fcn\u00fclmeli. Ama pani\u011fe gerek yok, bypass dedi\u011fimiz \u015fey tam da bunun i\u00e7in var.<\/p>\n<h2 id=\"section-3\"><span id=\"PHP_ile_Nginxte_Mikro_Onbellek_FastCGI_mi_Proxy_mi\">PHP ile Nginx\u2019te Mikro \u00d6nbellek: FastCGI mi, Proxy mi?<\/span><\/h2>\n<p>PHP-FPM kullan\u0131yorsan\u0131z yolumuz \u00e7o\u011funlukla <strong>fastcgi_cache<\/strong> \u00fczerinden ge\u00e7er. Mikro \u00f6nbellekleme burada ger\u00e7ek anlamda parl\u0131yor. \u00c7al\u0131\u015fma prensibi basit: Nginx, upstream olarak PHP-FPM\u2019ye gider, d\u00f6nen yan\u0131t\u0131 dosya tabanl\u0131 bir cache\u2019te tutar ve k\u0131sa bir s\u00fcreli\u011fine tekrar eden isteklere ayn\u0131 yan\u0131t\u0131 sunar.<\/p>\n<p>\u0130lk kurulumda genelde yapt\u0131klar\u0131m \u00e7ok benzer olur. Bir cache alan\u0131 tan\u0131mlar\u0131m, anahtar se\u00e7imimi netle\u015ftiririm, sonra bypass kurallar\u0131yla i\u00e7imi rahatlat\u0131r\u0131m. Kod gibi g\u00f6r\u00fcnse de, asl\u0131nda bu, mutfaktaki \u00f6l\u00e7\u00fcl\u00fc tarifin ayn\u0131s\u0131d\u0131r.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># nginx.conf ya da http blo\u011fu\nfastcgi_cache_path \/var\/cache\/nginx\/micro levels=1:2 keys_zone=microcache:50m inactive=10s use_temp_path=off;\n\nmap $http_cookie $skip_cache {\n    default 0;\n    ~*(wordpress_logged_in|comment_author|laravel_session) 1; # giri\u015fli\/kisisel oturumlar\n}\n\nmap $request_method $skip_cache_method {\n    default 0;\n    ~*(POST|PUT|PATCH|DELETE) 1; # yazan istekler cache'lenmez\n}\n\nmap $arg_nocache $skip_cache_arg {\n    default 0;\n    1 1; # ?nocache=1 gelirse bypass\n}\n\nmap $http_cache_control $skip_cache_cc {\n    default 0;\n    ~*no-cache 1;\n}\n<\/code><\/pre>\n<p>Sunucu blo\u011funda ise tipik bir PHP konfig\u00fcrasyonu \u015f\u00f6yle \u015fekillenir. Burada s\u00fcreleri \u00f6zellikle k\u0131sac\u0131k tutuyorum.<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n    listen 80;\n    server_name example.com;\n\n    root \/var\/www\/html;\n\n    location ~ .php$ {\n        include fastcgi_params;\n        fastcgi_pass unix:\/run\/php\/php8.2-fpm.sock;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n\n        set $skip $skip_cache;\n        if ($skip_cache_method) { set $skip 1; }\n        if ($skip_cache_arg)    { set $skip 1; }\n        if ($skip_cache_cc)     { set $skip 1; }\n\n        fastcgi_cache microcache;\n        fastcgi_cache_key $scheme$request_method$host$request_uri;\n        fastcgi_cache_valid 200 302 1s;\n        fastcgi_cache_valid 404 1s;\n        fastcgi_cache_bypass $skip;\n        fastcgi_no_cache    $skip;\n\n        fastcgi_cache_lock on;\n        fastcgi_cache_lock_timeout 5s;\n        fastcgi_cache_use_stale updating error timeout http_500 http_503;\n\n        add_header X-Cache $upstream_cache_status always;\n    }\n}\n<\/code><\/pre>\n<p>Burada <strong>fastcgi_cache_lock<\/strong> k\u00fc\u00e7\u00fck ama kritik bir detay. Ayn\u0131 anda gelen onlarca istek birbirini ezmesin diye, ilk iste\u011fin upstream\u2019den yan\u0131t\u0131n\u0131 beklerken di\u011ferleri kilitte oyalan\u0131r ve o yan\u0131t\u0131 payla\u015f\u0131r. Cache stampede dedi\u011fimiz dalga b\u00f6ylece s\u00f6n\u00fcmlenir. Ayr\u0131ca stale kullan\u0131m\u0131n\u0131 a\u00e7\u0131nca, upstream anl\u0131k hata verdi\u011finde bile yak\u0131n zamanda al\u0131nan yan\u0131t\u0131 ge\u00e7ici olarak sunma \u015fans\u0131 do\u011far. Bu, kampanya sabahlar\u0131n\u0131n dayana\u011f\u0131d\u0131r.<\/p>\n<p>Detaylar\u0131na merakl\u0131 olanlar i\u00e7in belgenin kendisi bir hazine: <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_fastcgi_module.html#fastcgi_cache\" target=\"_blank\" rel=\"noopener nofollow\">nginx fastcgi_cache y\u00f6nergeleri<\/a> ve <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_fastcgi_module.html#fastcgi_cache_path\" target=\"_blank\" rel=\"noopener nofollow\">fastcgi_cache_path yap\u0131land\u0131rmas\u0131<\/a> k\u0131lavuz gibi yan\u0131n\u0131zda dursun.<\/p>\n<h2 id=\"section-4\"><span id=\"Cache_Key_Varyasyonlar_ve_Minicik_Ama_Etkili_Bir_TTL\">Cache Key, Varyasyonlar ve Minicik Ama Etkili Bir TTL<\/span><\/h2>\n<p>Cache anahtar\u0131, mikro \u00f6nbelle\u011fin kalp at\u0131\u015f\u0131. Anahtar\u0131 ne kadar do\u011fru kurarsan\u0131z, o kadar az s\u00fcrpriz ya\u015fars\u0131n\u0131z. Ben genellikle <strong>$scheme$request_method$host$request_uri<\/strong> ile ba\u015flar\u0131m. E\u011fer sitenizde dil parametresi, cihaz t\u00fcr\u00fc ya da farkl\u0131 i\u00e7erik t\u00fcrlerini etkileyen query parametreleri varsa, anahtara bunlar\u0131 da katmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Mesela mobil ve masa\u00fcst\u00fc i\u00e7in ayn\u0131 HTML \u00e7\u0131km\u0131yorsa, cihaz ay\u0131r\u0131c\u0131 bir sinyal kullanmak iyi gelir.<\/p>\n<p>Akla \u015fu soru gelir: 1\u20135 saniye aras\u0131 hangisini se\u00e7meli? Ben bunun cevab\u0131n\u0131 sayfa tipine b\u0131rak\u0131yorum. Tra\ufb01\u011fin dalgaland\u0131\u011f\u0131 ana sayfada 2\u20133 saniye tatl\u0131 bir yer. Haber gibi anl\u0131k g\u00fcncellenen ak\u0131\u015flarda 1 saniye daha g\u00fcvenli hissettirir. Kategori ya da liste sayfalar\u0131nda 5 saniye bile gayet nazik davran\u0131r. \u00d6nemli olan, bu s\u00fcrelerin g\u00f6z a\u00e7\u0131p kapay\u0131ncaya kadar ge\u00e7ti\u011fini ve kullan\u0131c\u0131n\u0131n \u00e7o\u011fu zaman fark etmeyece\u011fini unutmamak.<\/p>\n<p>Bir di\u011fer incelik, yan\u0131t\u0131n varyasyonunu belirleyen ba\u015fl\u0131klard\u0131r. <strong>Accept-Encoding<\/strong> ve benzeri ba\u015fl\u0131klar genelde Nginx taraf\u0131ndan otomatik y\u00f6netilir. Ancak dil varyasyonu ta\u015f\u0131yorsan\u0131z <strong>Accept-Language<\/strong> ya da URL tabanl\u0131 dil se\u00e7icileri net olmal\u0131. Cache key\u2019in karars\u0131z kalmas\u0131, mikro \u00f6nbelle\u011fin g\u00fcc\u00fcn\u00fc k\u0131rar.<\/p>\n<h2 id=\"section-5\"><span id=\"Bypass_Stratejileri_Kimin_Yolunu_Acacagiz\">Bypass Stratejileri: Kimin Yolunu A\u00e7aca\u011f\u0131z?<\/span><\/h2>\n<p>Mikro \u00f6nbellekte as\u0131l ustal\u0131k, <strong>bypass karar\u0131nda<\/strong> gizlidir. Herkesi ayn\u0131 mikserde \u00e7evirmiyoruz. Giri\u015f yapm\u0131\u015f kullan\u0131c\u0131, sepetinde \u00fcr\u00fcn ta\u015f\u0131yan ziyaret\u00e7i, form g\u00f6nderen konuk\u2026 Bunlar\u0131n yan\u0131t\u0131 taze gelmeli. Bunun i\u00e7in ben \u00fc\u00e7 kap\u0131 kural\u0131n\u0131 severim: cookie\u2019ler, istek t\u00fcr\u00fc ve a\u00e7\u0131k komut.<\/p>\n<p>Cookie taraf\u0131nda WordPress i\u00e7in <em>wordpress_logged_in<\/em>, yorum b\u0131rakanlar i\u00e7in <em>comment_author<\/em>, Laravel i\u00e7in <em>laravel_session<\/em> cankurtaran gibidir. Bu i\u015faretleri g\u00f6r\u00fcnce cache\u2019i nazik\u00e7e pas ge\u00e7eriz. Yazma yapan istekleri (POST, PUT, DELETE) zaten hi\u00e7 \u00f6nbelle\u011fe almay\u0131z. Son olarak, baz\u0131 durumlarda <strong>?nocache=1<\/strong> gibi bir parametre ile geli\u015ftirici veya operasyon taraf\u0131na elle bypass imkan\u0131 vermek \u00e7ok rahatlat\u0131c\u0131 olur.<\/p>\n<p>WordPress d\u00fcnyas\u0131nda giri\u015f sayfalar\u0131 ba\u015fl\u0131 ba\u015f\u0131na bir alem. Buralar\u0131 ayr\u0131 korumak ak\u0131ll\u0131ca. Ben \u00e7o\u011fu projede <a href=\"https:\/\/www.dchost.com\/blog\/nginx-rate-limiting-ve-fail2ban-ile-wp%E2%80%91login-php-ve-xml%E2%80%91rpc-brute%E2%80%91force-saldirilarini-nasil-saksiya-alirsin\/\" target=\"_blank\" rel=\"noopener\">wp-login ve XML-RPC i\u00e7in h\u0131z s\u0131n\u0131rlama ve g\u00fcvenlik<\/a> \u00f6nlemlerini mikro \u00f6nbellekle beraber d\u00fc\u015f\u00fcn\u00fcr\u00fcm. \u00d6nbelle\u011fe girmeyecekleri kesin, ama bakt\u0131\u011f\u0131n\u0131zda performans hikayesini tek ba\u015f\u0131na bu alanlar bozmas\u0131n.<\/p>\n<p>Kimi uygulamalarda yan\u0131tlar masum g\u00f6r\u00fcn\u00fcr ama <strong>Set-Cookie<\/strong> ba\u015fl\u0131klar\u0131 sessizce \u00e7al\u0131\u015f\u0131r. Bu t\u00fcr yan\u0131tlar\u0131 cache\u2019lemek \u00e7o\u011fu kez tats\u0131z s\u00fcrprizler do\u011furur. Ben genelde bu t\u00fcr ba\u015fl\u0131klar geldi\u011finde <em>no cache<\/em> demeyi ye\u011fliyorum. Yani temel prensip \u015fu: ki\u015fiye \u00f6zg\u00fc bir \u015fey g\u00f6r\u00fcrsen, bypass et; herkese ayn\u0131 g\u00f6sterilecek bir \u015feyse, mikro bir s\u00fcreli\u011fine sakla.<\/p>\n<h2 id=\"section-6\"><span id=\"Purge_Stratejileri_Ne_Zaman_Temizlik_Gerekir\">Purge Stratejileri: Ne Zaman Temizlik Gerekir?<\/span><\/h2>\n<p>Mikro \u00f6nbellekte TTL o kadar k\u0131sa ki, \u00e7o\u011fu zaman ayr\u0131ca purge etmeye gerek kalmaz. Bir-iki saniye sonra zaten tazelenecek bir yan\u0131t\u0131 silmek, \u00e7o\u011fu senaryoda enerjinizi bo\u015fa harcar. Yine de, baz\u0131 ak\u0131\u015flar var ki, o saniyeyi bile beklemek istemezsiniz. \u00d6rne\u011fin man\u015fete giren bir haber, landing sayfas\u0131nda son dakika bir de\u011fi\u015fiklik, ya da stok durumu\u2026 \u0130\u015fte buralarda iki yol var.<\/p>\n<p>\u0130lki, konfig\u00fcrasyona k\u00fc\u00e7\u00fck bir purger eklemektir. A\u00e7\u0131k kaynak Nginx\u2019te yerle\u015fik bir purge endpoint\u2019i yok; bu y\u00fczden \u00fc\u00e7\u00fcnc\u00fc parti <a href=\"https:\/\/github.com\/FRiCKLE\/ngx_cache_purge\" target=\"_blank\" rel=\"noopener nofollow\">ngx_cache_purge mod\u00fcl\u00fc<\/a> y\u0131llard\u0131r bir omuz verir. Yetkili IP\u2019lere a\u00e7\u0131k bir \u201c\/purge\u201d konumu tan\u0131mlay\u0131p, belli bir URL\u2019ye ait cache\u2019i do\u011frudan temizleyebilirsiniz. En kritik not: Bu kap\u0131y\u0131 sadece g\u00fcvendi\u011finiz kaynaklara a\u00e7\u0131n ve kay\u0131tlar\u0131 tutun.<\/p>\n<p>\u0130kinci yol ise basit ve etkili bir hile: <strong>cache key versiyonlamak<\/strong>. Uygulama bir i\u00e7erik g\u00fcncellendi\u011finde, key\u2019e g\u00f6r\u00fcnmez bir i\u015faret ekleyebilirsiniz. Mesela <em>?v=timestamp<\/em> gibi ufak bir de\u011fi\u015fken, mikro \u00f6nbelle\u011fin ayn\u0131 anda yeni versiyonu \u00fcretmesini sa\u011flar. Eski versiyon birka\u00e7 saniye i\u00e7inde zaten d\u00fc\u015fer. Kod taraf\u0131nda pratik ve riskten uzak bir yakla\u015f\u0131m.<\/p>\n<p>Dosya sistemi \u00fczerinden do\u011frudan cache silmek de m\u00fcmk\u00fcn ama ben genelde buna temkinli yakla\u015f\u0131r\u0131m. Hash\u2019lenmi\u015f dizin yap\u0131s\u0131nda yanl\u0131\u015f bir dosyay\u0131 silmek kolayd\u0131r ve cache y\u00f6neticisi bir s\u00fcre ek i\u015f y\u00fck\u00fc alt\u0131nda kalabilir. Sistem karma\u015f\u0131kla\u015ft\u0131k\u00e7a, purge konusunu operasyon arac\u0131 haline getirmek ve otomatikle\u015ftirmek daha sa\u011fl\u0131kl\u0131 olur.<\/p>\n<h2 id=\"section-7\"><span id=\"WordPress_Laravel_ve_Ozel_PHP_Uygulamalarinda_Puf_Noktalari\">WordPress, Laravel ve \u00d6zel PHP Uygulamalar\u0131nda P\u00fcf Noktalar\u0131<\/span><\/h2>\n<p>WordPress\u2019te mikro \u00f6nbellek, \u00f6zellikle ana sayfa, kategori ar\u015fivleri, yazar sayfalar\u0131 ve yaz\u0131 sayfalar\u0131nda harika \u00e7al\u0131\u015f\u0131r. Giri\u015fli kullan\u0131c\u0131, y\u00f6netim paneli, yorum g\u00f6nderimi ve \u00f6nizleme gibi alanlar do\u011fal bypass\u2019t\u0131r. \u0130yi kurulmu\u015f bir katman, <a href=\"https:\/\/www.dchost.com\/blog\/wordpress-nesne-onbelleginde-redisi-ayaga-kaldirmanin-sirri-sentinel-aof-rdb-ve-failover-ne-zaman-devreye-girer\/\" target=\"_blank\" rel=\"noopener\">Redis gibi bir nesne \u00f6nbelle\u011fi<\/a> ile birle\u015fince, veritaban\u0131 y\u00fck\u00fcn\u00fc de nezaketle hafifletir. Ben ikisini karde\u015f gibi g\u00f6r\u00fcr\u00fcm: biri sayfay\u0131 h\u0131zl\u0131 \u00e7\u0131kar\u0131r, di\u011feri veriyi yak\u0131ndan getirir.<\/p>\n<p>Laravel taraf\u0131nda rota bazl\u0131 d\u00fc\u015f\u00fcnmek \u00e7ok i\u015f g\u00f6r\u00fcr. \u00d6zellikle API ve HTML da\u011f\u0131tan endpoint\u2019lerde, <em>read heavy<\/em> olanlar mikro \u00f6nbelle\u011fin tatl\u0131 m\u00fc\u015fterisidir. <strong>laravel_session<\/strong> cookie\u2019sini g\u00f6rd\u00fc\u011f\u00fcn\u00fcz yerlerde bypass, kullan\u0131c\u0131ya \u00f6zel alanlarda bypass, statik HTML gibi davranan rotalarda mikro TTL\u2026 Hepsi bir anlam zinciri kurar. CSRF token ta\u015f\u0131yan formlar i\u00e7in yan\u0131t\u0131 cache\u2019lememek \u00e7o\u011fu zaman en g\u00fcvenlisidir.<\/p>\n<p>\u00d6zel yaz\u0131l\u0131mlarda i\u015f daha keyifli. Kendi i\u015faretlerinizi koyar, \u201c\u015fu yan\u0131t\u0131 herkese ayn\u0131 veriyorum\u201d dedi\u011finiz alanlar\u0131 1\u20133 saniye saklar, hassas alanlar\u0131 ak\u0131ll\u0131ca pas ge\u00e7ersiniz. Kulland\u0131\u011f\u0131n\u0131z mimari Docker ise, <a href=\"https:\/\/www.dchost.com\/blog\/docker-ile-wordpressi-vpste-nasil-yasatiriz-nginx-mariadb-redis-ve-lets-encrypt-ile-kalici-depolama-macerasi\/\" target=\"_blank\" rel=\"noopener\">uygulama ve Nginx\u2019in birlikte ya\u015fad\u0131\u011f\u0131 d\u00fczen<\/a> izleme ve bak\u0131mda b\u00fcy\u00fck kolayl\u0131k sa\u011flar. De\u011fi\u015fiklikleri s\u00fcr\u00fcmlendirir, sundu\u011funuz her servis i\u00e7in do\u011fru log\u2019lar\u0131 bir araya toplars\u0131n\u0131z.<\/p>\n<h2 id=\"section-8\"><span id=\"Gozlemlemek_Olcmek_Sakin_Kalmak\">G\u00f6zlemlemek, \u00d6l\u00e7mek, Sakin Kalmak<\/span><\/h2>\n<p>\u00d6nbellek \u00e7al\u0131\u015f\u0131yor mu, nerede \u00e7ak\u0131l\u0131yor, ka\u00e7\u0131rd\u0131\u011f\u0131m\u0131z k\u00f6\u015fe var m\u0131? Bu sorular\u0131n cevab\u0131n\u0131 <strong>log ve ba\u015fl\u0131klar<\/strong> veriyor. Ben genellikle Nginx\u2019te X-Cache ba\u015fl\u0131\u011f\u0131yla <em>MISS, HIT, BYPASS<\/em> g\u00f6rmek isterim. Ancak bunu illa kullan\u0131c\u0131ya g\u00f6stermeye de gerek yok; log\u2019lara yazmak yeterli. \u00d6zellikle yo\u011fun anda ka\u00e7 MISS geldi\u011fini g\u00f6rmek, TTL ayar\u0131n\u0131n do\u011fru olup olmad\u0131\u011f\u0131n\u0131 f\u0131s\u0131ldar.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">log_format micro '$remote_addr - $request [$time_local] '\n                  '&quot;$request&quot; $status $body_bytes_sent '\n                  '&quot;$http_referer&quot; &quot;$http_user_agent&quot; '\n                  'cache:$upstream_cache_status';\n\naccess_log \/var\/log\/nginx\/access.log micro;\n<\/code><\/pre>\n<p>Bu log format\u0131yla HIT ve MISS da\u011f\u0131l\u0131m\u0131n\u0131 g\u00fczelce izleyebilir, gerekirse TTL\u2019i bir t\u0131k art\u0131r\u0131p azaltabilirsiniz. Ayr\u0131ca, upstream taraf\u0131nda PHP-FPM kuyru\u011funu ve i\u015flemci kullan\u0131m\u0131n\u0131 takip etmek k\u0131ymetli. Mikro \u00f6nbellek do\u011fru yerde \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, bu grafiklerde huzurlu bir d\u00fczle\u015fme g\u00f6r\u00fcrs\u00fcn\u00fcz. Bazen huzur, grafikteki o d\u00fcz \u00e7izgidir.<\/p>\n<p>CDN kullan\u0131yorsan\u0131z, u\u00e7 katmandaki cache ile origin\u2019deki mikro \u00f6nbelle\u011fi bar\u0131\u015ft\u0131rmak gerekir. Ben buna \u201ckatmanlar aras\u0131 nezaket\u201d diyorum. CDN kendi TTL\u2019iyle \u00e7al\u0131\u015f\u0131r, origin\u2019de mikro TTL ayr\u0131. \u0130kisi birden oldu\u011funda, kampanya anlar\u0131nda daha da g\u00fc\u00e7l\u00fc bir kalkan\u0131n\u0131z olur. \u0130lgili bir konuda, <a href=\"https:\/\/www.dchost.com\/blog\/goruntu-optimizasyonu-boru-hatti-nasil-kurulur-avif-webp-origin-shield-ve-akilli-cache-key-ile-cdn-faturaniza-nefes-aldirin\/\" target=\"_blank\" rel=\"noopener\">CDN ve ak\u0131ll\u0131 cache-key ile i\u00e7erik da\u011f\u0131t\u0131m\u0131n\u0131<\/a> uzun uzun konu\u015fmu\u015ftuk; ayn\u0131 mant\u0131k burada da i\u015f g\u00f6r\u00fcyor.<\/p>\n<h2 id=\"section-9\"><span id=\"Kenarlarda_Kalanlar_Nonce_CSRF_ETag_ve_Set-Cookie\">Kenarlarda Kalanlar: Nonce, CSRF, ETag ve Set-Cookie<\/span><\/h2>\n<p>Ger\u00e7ek hayat, belki de en \u00e7ok kenar durumlar\u0131nda kar\u015f\u0131m\u0131za \u00e7\u0131kar. WordPress nonce de\u011ferleri, Laravel\u2019in CSRF token\u2019lar\u0131, sepet \u00f6zetleri\u2026 Bu t\u00fcr \u00f6\u011feler sayfaya g\u00f6m\u00fcl\u00fcyse, mikro \u00f6nbellek k\u0131sa da olsa tats\u0131z bir s\u00fcrpriz olabilir. En g\u00fcvenli yakla\u015f\u0131m, bu alanlar\u0131 bypass etmektir. Kimi zaman bu \u00f6\u011feleri <em>AJAX ile sonradan \u00e7ekmek<\/em> ve sayfay\u0131 genel olarak cache\u2019lemek harika bir denge kurar.<\/p>\n<p><strong>Set-Cookie<\/strong> ba\u015fl\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcnce refleks olarak cache\u2019i kapatmak \u00e7o\u011fu projede hayat kurtar\u0131r. ETag ve Last-Modified gibi ba\u015fl\u0131klar ise daha \u00e7ok taray\u0131c\u0131 taraf\u0131nda i\u015fe yarar; burada as\u0131l i\u015f Nginx\u2019in dosya tabanl\u0131 mikro \u00f6nbelle\u011finde d\u00f6ner. Yine de ko\u015fullu istek mant\u0131\u011f\u0131n\u0131 bozmayacak \u015fekilde ba\u015fl\u0131klar\u0131n\u0131z\u0131n temiz oldu\u011fundan emin olmak g\u00fczel bir al\u0131\u015fkanl\u0131kt\u0131r.<\/p>\n<p>Ben ayr\u0131ca \u015funa bakar\u0131m: Sayfada ki\u015fisel bir \u00f6\u011fe varsa ama sayfan\u0131n %95\u2019i herkese ayn\u0131ysa, o %95\u2019i mikro \u00f6nbelle\u011fe al\u0131p kalan\u0131n\u0131 sonradan doldurmak, TTFB\u2019yi ciddi bi\u00e7imde yumu\u015fat\u0131r. Bu, \u00f6zellikle yo\u011fun haber ak\u0131\u015f\u0131 olan sitelerde tatl\u0131 bir re\u00e7etedir.<\/p>\n<h2 id=\"section-10\"><span id=\"Adim_Adim_Bir_Kurgu_Mikro_Onbellekli_WordPress\">Ad\u0131m Ad\u0131m Bir Kurgu: Mikro \u00d6nbellekli WordPress<\/span><\/h2>\n<p>Birlikte k\u00fc\u00e7\u00fck bir kurgu yapal\u0131m. WordPress site, Nginx ve PHP-FPM ile \u00e7al\u0131\u015f\u0131yor. Ana sayfa ve yaz\u0131 sayfalar\u0131 trafik yiyor. Hedefimiz TTFB\u2019yi sakinle\u015ftirmek, PHP\u2019ye nefes ald\u0131rmak. \u0130lk i\u015f, microcache zone\u2019u a\u00e7\u0131yoruz. Sonra bypass\u2019\u0131 netle\u015ftiriyoruz: giri\u015fli kullan\u0131c\u0131, yorum yazar\u0131, admin ve POST istekleri asla cache\u2019e girmeyecek.<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">fastcgi_cache_path \/var\/cache\/nginx\/micro levels=1:2 keys_zone=microcache:100m inactive=10s;\n\nmap $http_cookie $skip_cache {\n    default 0;\n    ~*(wordpress_logged_in|comment_author|wp-postpass) 1;\n}\n\nserver {\n    listen 80;\n    server_name example.com;\n\n    location \/wp-admin\/ { set $skip 1; try_files $uri $uri\/ \/index.php?$args; }\n    location ~* \/wp-login.php { set $skip 1; try_files $uri =404; }\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$args;\n    }\n\n    location ~ .php$ {\n        include fastcgi_params;\n        fastcgi_pass unix:\/run\/php\/php8.2-fpm.sock;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n\n        set $skip $skip_cache;\n        if ($request_method != GET) { set $skip 1; }\n\n        fastcgi_cache microcache;\n        fastcgi_cache_key $scheme$request_method$host$request_uri;\n        fastcgi_cache_valid 200 302 2s;\n        fastcgi_cache_valid 404 1s;\n        fastcgi_cache_bypass $skip;\n        fastcgi_no_cache    $skip;\n\n        fastcgi_cache_lock on;\n        fastcgi_cache_lock_timeout 5s;\n        fastcgi_cache_use_stale updating error timeout;\n\n        add_header X-Cache $upstream_cache_status always;\n    }\n}\n<\/code><\/pre>\n<p>Burada ana sayfa ve yaz\u0131 sayfalar\u0131 tipik olarak 2 saniye cache\u2019e girer. Yorum g\u00f6nderilince, zaten POST oldu\u011fu i\u00e7in bypass olur. Giri\u015f yapan kullan\u0131c\u0131y\u0131 cookie \u00fczerinden atlat\u0131r\u0131z. Y\u00f6netim paneli zaten farkl\u0131 bir d\u00fcnya, oraya hi\u00e7 yakla\u015fmay\u0131z. Bu yap\u0131y\u0131, Redis nesne \u00f6nbelle\u011fiyle desteklemek isterseniz, yukar\u0131da payla\u015ft\u0131\u011f\u0131m <a href=\"https:\/\/www.dchost.com\/blog\/wordpress-nesne-onbelleginde-redisi-ayaga-kaldirmanin-sirri-sentinel-aof-rdb-ve-failover-ne-zaman-devreye-girer\/\" target=\"_blank\" rel=\"noopener\">WordPress + Redis notlar\u0131<\/a> performans katmanlar\u0131n\u0131 tamamlar.<\/p>\n<p>Bir not daha: E\u011fer medyay\u0131 ve g\u00f6rselleri CDN\u2019e itiyor, format d\u00f6n\u00fc\u015f\u00fcmleri yap\u0131yorsan\u0131z, <a href=\"https:\/\/www.dchost.com\/blog\/webp-avifi-kirmadan-sunmak-nginx-apache-ve-cdn-ile-icerik-pazarligi-rewrite-kurallari-ve-seo-uyumlu-donusum\/\" target=\"_blank\" rel=\"noopener\">WebP\/AVIF sunum stratejileri<\/a> ile cache anahtar\u0131n\u0131, kullan\u0131c\u0131ya sunulan i\u00e7eri\u011fe uygun \u015fekilde ak\u0131lland\u0131r\u0131n. B\u00f6ylece Nginx\u2019teki mikro cache ile CDN cache\u2019i birbiriyle \u00e7eli\u015fmez, aksine omuz omuza y\u00fcr\u00fcr.<\/p>\n<h2 id=\"section-11\"><span id=\"Cache_Purge_Icin_Pratik_Yaklasimlar\">Cache Purge \u0130\u00e7in Pratik Yakla\u015f\u0131mlar<\/span><\/h2>\n<p>\u201cPeki ya man\u015feti \u015fimdi g\u00fcncelledik, o iki saniyeyi bile beklemek istemiyorsak?\u201d \u0130\u015fte burada iki yakla\u015f\u0131m tekrar sahneye \u00e7\u0131kar. Birincisi, e\u011fer ekip ve altyap\u0131 olgun ise purge endpoint\u2019ini k\u0131s\u0131tl\u0131 IP\u2019lere a\u00e7\u0131p, i\u00e7erik g\u00fcncellenince ilgili URL\u2019yi vurarak temizlik yapmak. Bu y\u00f6ntemi orkestrasyon ara\u00e7lar\u0131na ba\u011flay\u0131p otomatikle\u015ftirmek g\u00fczel olur.<\/p>\n<p>\u0130kincisi, uygulama taraf\u0131nda k\u00fc\u00e7\u00fck bir <em>cache-buster<\/em> eklemek. \u00d6rne\u011fin tema taraf\u0131nda ana men\u00fc veya man\u015fet alan\u0131 g\u00fcncellendi\u011finde, ana sayfa linklerine <em>?v=son_degisiklik_zamani<\/em> benzeri bir de\u011fi\u015fken eklersiniz. B\u00f6ylece yeni i\u00e7erik, eski cache ile yar\u0131\u015fmadan hemen sunulur. Eski cache birka\u00e7 saniyede kendili\u011finden d\u00fc\u015fer. Bu strateji, tek bir sat\u0131r bile Nginx konfig\u00fcrasyonu de\u011fi\u015ftirmeden, h\u0131zl\u0131ca devreye al\u0131n\u0131r.<\/p>\n<h2 id=\"section-12\"><span id=\"Gercek_Zamanli_Trafik_Dalgalari_ve_Sakin_Bir_Nginx\">Ger\u00e7ek Zamanl\u0131 Trafik Dalgalar\u0131 ve Sakin Bir Nginx<\/span><\/h2>\n<p>Kampanya sabah\u0131na d\u00f6nelim. Mikro \u00f6nbellek \u00e7al\u0131\u015f\u0131rken g\u00f6r\u00fcnen manzara \u015funa benziyor: \u0130lk dalgada bir MISS, hemen arkas\u0131ndan HIT\u2019ler ya\u011fmaya ba\u015fl\u0131yor. PHP-FPM kuyruklar\u0131 k\u0131sal\u0131yor, CPU nefes al\u0131yor. TTFB 700 ms\u2019den 120\u2013150 ms band\u0131na iniyor ve orada tatl\u0131 tatl\u0131 sal\u0131n\u0131yor. Sitenin genel hissiyat\u0131 \u201ch\u0131zl\u0131\u201d oluyor, \u00e7\u00fcnk\u00fc ilk boyama ve etkile\u015fim i\u00e7in bekleme s\u00fcresi d\u00fc\u015f\u00fcyor.<\/p>\n<p>Y\u00fck testlerinde de benzer bir dinginlik g\u00f6r\u00fcrs\u00fcn\u00fcz. Bu dinginlik, 1\u20135 saniye gibi minicik bir aral\u0131\u011f\u0131n arma\u011fan\u0131. Asl\u0131nda hi\u00e7bir \u015feyi k\u00f6kten de\u011fi\u015ftirmiyorsunuz, sadece ayn\u0131 saniyede gelen onlarca iste\u011fin hepsini uygulaman\u0131n s\u0131rt\u0131na y\u0131km\u0131yorsunuz. Mikro \u00f6nbellek, tam da bu y\u00fczden seviliyor.<\/p>\n<h2 id=\"section-13\"><span id=\"CDN_ile_El_Sikismak_Kim_Neyi_Ne_Kadar_Zaman_Tutar\">CDN ile El S\u0131k\u0131\u015fmak: Kim Neyi, Ne Kadar Zaman Tutar?<\/span><\/h2>\n<p>CDN\u2019i origin \u00f6n\u00fcne koydu\u011funuzda iki katmanl\u0131 bir hikaye ba\u015flar. CDN, kenar noktalar\u0131nda i\u00e7erikleri tutar ve kullan\u0131c\u0131ya yak\u0131n sunar. Origin\u2019deki Nginx ise kendi mikro \u00f6nbelle\u011fiyle anl\u0131k dalgalar\u0131 yumu\u015fat\u0131r. Bu ikili, do\u011fru ayarland\u0131\u011f\u0131nda b\u00fcy\u00fcleyici bir uyum yakalar. CDN\u2019de daha uzun TTL\u2019ler, origin\u2019de 1\u20135 saniyelik mikro TTL\u2026 Birlikte kusursuz bir ak\u0131\u015f kurarlar.<\/p>\n<p>Buradaki kilit, cache-key uyumudur. Kullan\u0131c\u0131ya g\u00f6nderdi\u011finiz varyasyonlar (g\u00f6rsel format\u0131, s\u0131k\u0131\u015ft\u0131rma seviyesi, dil veya tema modu) CDN ve origin aras\u0131nda \u00e7eli\u015fmemeli. Daha derin bir i\u00e7erik da\u011f\u0131t\u0131m senaryosu kurgulamak isterseniz, <a href=\"https:\/\/www.dchost.com\/blog\/goruntu-optimizasyonu-boru-hatti-nasil-kurulur-avif-webp-origin-shield-ve-akilli-cache-key-ile-cdn-faturaniza-nefes-aldirin\/\" target=\"_blank\" rel=\"noopener\">origin shield ve ak\u0131ll\u0131 cache-key tasar\u0131m\u0131<\/a> \u00fczerine notlar karar vermeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2 id=\"section-14\"><span id=\"Sorun_Giderme_Neyi_Gorunce_Nereden_Baslamali\">Sorun Giderme: Neyi G\u00f6r\u00fcnce Nereden Ba\u015flamal\u0131?<\/span><\/h2>\n<p>En yayg\u0131n sorun \u015fu olur: \u201cCache\u2019e girmiyor.\u201d Yan\u0131t ba\u015fl\u0131klar\u0131n\u0131 ve cookie\u2019leri kontrol edin. Set-Cookie g\u00f6r\u00fcyorsan\u0131z, Nginx muhtemelen hakl\u0131 olarak cache\u2019i pas ge\u00e7iyordur. \u0130stek t\u00fcr\u00fc GET de\u011filse zaten bypass\u2019t\u0131r. Bir de <strong>X-Cache<\/strong> ba\u015fl\u0131\u011f\u0131n\u0131 a\u00e7t\u0131ysan\u0131z, MISS ve BYPASS ayr\u0131m\u0131n\u0131 net g\u00f6r\u00fcrs\u00fcn\u00fcz. Buradan ipucunu yakalamak \u00e7ok kolay.<\/p>\n<p>\u201cCache yanl\u0131\u015f i\u00e7erik veriyor\u201d hissi uyand\u0131\u011f\u0131nda ise ilk bakaca\u011f\u0131n\u0131z yer cache key. URL, dil, cihaz ya da \u00f6nemli bir query parametresi eksik kalm\u0131\u015f olabilir. Bir s\u00fcreli\u011fine X-Cache ile beraber, sayfan\u0131n hangi varyasyona ait oldu\u011funu belirten k\u00fc\u00e7\u00fck bir debug ba\u015fl\u0131\u011f\u0131 eklemek, sorun \u00e7\u00f6zmeyi h\u0131zland\u0131r\u0131r.<\/p>\n<p>\u201cY\u00fck an\u0131nda upstream eziliyor\u201d anlar\u0131nda ise <strong>fastcgi_cache_lock<\/strong> ve <strong>use_stale<\/strong> kombinasyonunu tekrar g\u00f6zden ge\u00e7irin. Lock s\u00fcresi k\u0131sa kalm\u0131\u015f olabilir ya da TTL \u00e7ok k\u00fc\u00e7\u00fck kalm\u0131\u015ft\u0131r. Bir saniyeden iki saniyeye \u00e7\u0131kmak bile d\u00fcnyalar\u0131 de\u011fi\u015ftirebilir.<\/p>\n<h2 id=\"section-15\"><span id=\"Ek_Notlar_ve_Guzel_Kucuk_Dokunuslar\">Ek Notlar ve G\u00fczel K\u00fc\u00e7\u00fck Dokunu\u015flar<\/span><\/h2>\n<p>Uygulaman\u0131n ba\u015fl\u0131klar\u0131yla Nginx\u2019in konu\u015fmas\u0131n\u0131 seviyorum. Baz\u0131 projelerde, yan\u0131t\u0131 a\u00e7\u0131k\u00e7a \u201cbunu cache\u2019leme\u201d diye i\u015faretlemek i\u00e7in uygulama taraf\u0131nda k\u00fc\u00e7\u00fck bir header yazd\u0131r\u0131yoruz. Nginx\u2019te <em>map $http_cache_control $skip_cache_cc<\/em> gibi kurallarla bunu yakal\u0131yoruz. Yani uygulaman\u0131n sesi varsa, Nginx dinliyor. Bu da ekipler aras\u0131 uyumu b\u00fcy\u00fct\u00fcyor.<\/p>\n<p>Log\u2019lar\u0131 merkezi bir yerde toplamak, alarmlar\u0131 basit kurallarla ayarlamak ve anomalileri h\u0131zl\u0131 g\u00f6rmek ayr\u0131 bir huzur. \u0130sterseniz <a href=\"https:\/\/www.dchost.com\/blog\/vps-log-yonetimi-nasil-rayina-oturur-grafana-loki-promtail-ile-merkezi-loglama-tutma-sureleri-ve-alarm-kurallari\/\" target=\"_blank\" rel=\"noopener\">Loki + Promtail ile merkezi loglama<\/a> notlar\u0131na g\u00f6z at\u0131n; mikro \u00f6nbelle\u011fin ger\u00e7ek faydas\u0131n\u0131 grafiklerle izlemek \u00e7ok motive edici oluyor.<\/p>\n<p>Ve tabii, b\u00fcy\u00fck versiyon y\u00fckseltmelerinde mikro \u00f6nbelle\u011fi yeniden g\u00f6zden ge\u00e7irmek g\u00fczel bir al\u0131\u015fkanl\u0131k. PHP taraf\u0131nda ufak bir ayar de\u011fi\u015fikli\u011fi, Nginx\u2019te k\u00fc\u00e7\u00fck bir versiyon fark\u0131, b\u00fct\u00fcn ak\u0131\u015f\u0131 etkileyebilir. Benim i\u00e7in, <a href=\"https:\/\/www.dchost.com\/blog\/ofiste-bir-sabah-php-yukseltmesi-ter-damlalari-ve-kucuk-bir-aydinlanma\/\" target=\"_blank\" rel=\"noopener\">PHP y\u00fckseltmesi s\u0131ras\u0131nda ya\u015fad\u0131\u011f\u0131m k\u00fc\u00e7\u00fck ayd\u0131nlanmalar<\/a> hep bu t\u00fcr detaylarda sakl\u0131yd\u0131.<\/p>\n<h2 id=\"section-16\"><span id=\"Kapanis_Kucuk_Bir_Tornavida_Buyuk_Bir_Ferahlik\">Kapan\u0131\u015f: K\u00fc\u00e7\u00fck Bir Tornavida, B\u00fcy\u00fck Bir Ferahl\u0131k<\/span><\/h2>\n<p>Ba\u015fta anlatt\u0131\u011f\u0131m kampanya sabah\u0131, mikro \u00f6nbellek bir anda ofisin kahraman\u0131 olmu\u015ftu. O g\u00fcn bir \u015feyi net anlad\u0131m: Her zaman b\u00fcy\u00fck eksen kaymalar\u0131na gerek yok. Bazen 1\u20135 saniye gibi k\u00fc\u00e7\u00fcc\u00fck bir s\u00fcre, koskoca bir \u00e7at\u0131y\u0131 ayakta tutmaya yetiyor. Nginx mikro \u00f6nbellekleme bu y\u00fczden sevilesi. Basit, \u00f6ng\u00f6r\u00fclebilir, yumu\u015fak.<\/p>\n<p>\u00d6zetle, herkese ayn\u0131 sunulan sayfalar\u0131 k\u0131sac\u0131k bir s\u00fcre saklay\u0131n, ki\u015fisel alanlar\u0131 bypass edin, gerekti\u011finde nazik\u00e7e purge edin. X-Cache\u2019le, log\u2019la, k\u00fc\u00e7\u00fck alarmlarla ak\u0131\u015f\u0131 izleyin. CDN varsa el s\u0131k\u0131\u015ft\u0131r\u0131n. Vakit bulduk\u00e7a konfig\u00fcrasyonu sadele\u015ftirin; sade kalan ayarlar hata yapmaz. Umar\u0131m bu yaz\u0131, akl\u0131n\u0131zdaki ta\u015flar\u0131 yerine oturtur ve ilk denemenizde y\u00fcz\u00fcn\u00fcz\u00fc g\u00fcld\u00fcr\u00fcr. Tak\u0131ld\u0131\u011f\u0131n\u0131z bir yerde \u201c\u015eu sayfay\u0131 bypass m\u0131 etsek, 1 yerine 3 saniye mi versek?\u201d diye d\u00fc\u015f\u00fcn\u00fcyorsan\u0131z, do\u011fru yoldas\u0131n\u0131z. Bir dahaki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere, h\u0131z sizinle olsun.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Ofiste Bir Kampanya Sabah\u0131 ve Mikro \u00d6nbelle\u011fin F\u0131s\u0131ldad\u0131\u011f\u0131 \u00c7\u00f6z\u00fcm2 Mikro \u00d6nbellekleme Nedir, Neden 1\u20135 Saniye?3 PHP ile Nginx\u2019te Mikro \u00d6nbellek: FastCGI mi, Proxy mi?4 Cache Key, Varyasyonlar ve Minicik Ama Etkili Bir TTL5 Bypass Stratejileri: Kimin Yolunu A\u00e7aca\u011f\u0131z?6 Purge Stratejileri: Ne Zaman Temizlik Gerekir?7 WordPress, Laravel ve \u00d6zel PHP Uygulamalar\u0131nda P\u00fcf Noktalar\u01318 G\u00f6zlemlemek, \u00d6l\u00e7mek, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1608,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1607","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1607"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1607\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1608"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}