NGINX'te İçerik Nasıl Önbelleğe Alınır?


NGINX, içerik ve uygulama dağıtımını hızlandıran, güvenliği artıran ve ölçeklenebilirliği geliştiren, birleştirilmiş açık kaynaklı, yüksek performanslı bir web sunucusudur. Nginx'in en yaygın kullanım örneklerinden biri, bir web sitesinin performansını artırmanın en etkili yolu olan İçerik Önbelleğe Alma'dır.

Ayrıca Okuyun: Linux için En İyi 10 Açık Kaynak Önbelleğe Alma Aracı

NGINX'i, yukarı akış sunucularından gelen yanıtları önbelleğe alacak şekilde yapılandırarak yerel kaynak sunucuları hızlandırmak ve ayrıca içerik dağıtım ağları (CDN'ler) için uç sunucular oluşturmak üzere kullanabilirsiniz. NGINX, en büyük CDN'lerden bazılarına güç sağlar.

NGINX, önbellek olarak yapılandırıldığında:

  • Statik ve dinamik içeriği önbelleğe alın.
  • Mikro önbelleğe alma ile dinamik içerik performansını artırın.
  • Daha iyi performans için arka planda yeniden doğrulama yaparken eski içeriği sunar.
  • Önbellek Kontrolü başlıklarını geçersiz kılın veya ayarlayın ve daha fazlasını yapın.

Bu makalede, web sunucularınızın mümkün olduğunca verimli çalışmasını sağlamak için NGINX'i Linux'ta İçerik Önbelleğe Alma olarak nasıl yapılandıracağınızı öğreneceksiniz.

Önkoşullar:

Nginx'i yüklemek için şu kılavuzları izlemiyorsanız, Linux sunucunuzda NGINX'in yüklü olması gerekir:

  • CentOS 8'e Nginx Nasıl Kurulur
  • CentOS 7'ye Nginx Nasıl Kurulur

Nginx'te Statik İçeriği Önbelleğe Alın

Statik içerik, bir web sitesinin sayfalar arasında aynı kalan (değişmeyen) içeriğidir. Statik içeriğe örnek olarak resimler, videolar, belgeler gibi dosyalar; CSS dosyaları ve JavaScript dosyaları.

Web siteniz çok fazla statik içerik kullanıyorsa, daha hızlı erişim için tarayıcının statik içeriğin kopyalarını sakladığı istemci tarafı önbelleğe almayı etkinleştirerek performansını optimize edebilirsiniz.

Aşağıdaki örnek yapılandırma iyi bir seçimdir; www.example.com adresini web sitenizin URL'siyle değiştirin ve diğer yol adlarında uygun şekilde değişiklikler yapın.

server {
    # substitute your web server's URL for www.example.com
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        try_files $uri =404;
        include fastcgi_params;
        # substitute the socket, or address and port, of your WordPress server
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
 	}   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg
                  |jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid
                  |midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

Nginx'te Dinamik İçeriği Önbelleğe Alın

NGINX, yerel dosya sisteminde bir yerde bulunan kalıcı, disk tabanlı bir önbellek kullanır. Bu nedenle, önbelleğe alınmış içeriği depolamak için yerel disk dizini oluşturarak başlayın.
# mkdir -p /var/cache/nginx

Ardından, önbellek dizininde uygun sahipliği ayarlayın. Aşağıdaki gibi NGINX kullanıcısının (nginx) ve grubunun (nginx) sahibi olması gerekir.

chown nginx:nginx /var/cache/nginx

Şimdi aşağıdaki bölümde Nginx'te dinamik içeriğin nasıl etkinleştirileceğini görmek için daha da ilerleyin.

NGINX'te FastCGI Önbelleğini Etkinleştirme

FastCGI (veya FCGI), PHP gibi etkileşimli uygulamalar ile NGINX gibi web sunucuları arasında arayüz oluşturmak için yaygın olarak kullanılan bir protokoldür. güçlü>. CGI'nın (Ortak Ağ Geçidi Arayüzü) bir uzantısıdır.

FCGI'nın temel avantajı, birden fazla CGI isteğini tek bir işlemde yönetmesidir. Bu olmadan, web sunucusunun, bir hizmete yönelik her müşteri talebi için yeni bir süreç açması (kontrol edilmesi, bir isteği işlemesi ve kapatılması gerekir) gerekir.

PHP komut dosyalarını bir LEMP yığın dağıtımında işlemek için NGINX, FPM (FastCGI Process Manager) veya 'yi kullanır. PHP-FPM, popüler bir alternatif PHP FastCGI uygulamasıdır. PHP-FPM işlemi çalıştırıldıktan sonra NGINX, işlenmek üzere istekleri kendisine proxy olarak gönderecek şekilde yapılandırılır. Böylece NGINX, PHP-FPM arka uç uygulama sunucusundan gelen yanıtları önbelleğe alacak şekilde de yapılandırılabilir.

NGINX altında, FastCGI içerik önbelleği, üst düzey http{'de fastcgi_cache_path adlı bir yönerge kullanılarak bildirilir. bağlam, NGINX yapılandırma yapısı içinde. Ayrıca önbellekleme için bir anahtar (istek tanımlayıcı) tanımlayan fastcgi_cache_key'i de ekleyebilirsiniz.

Ayrıca, yukarı akış önbellek durumunu okumak için add_header X-Cache-Status yönergesini http{ bağlamına ekleyin; bu, hata ayıklama amacıyla kullanışlıdır.

Sitenizin sunucu bloğu yapılandırma dosyasının /etc/nginx/conf.d/testapp.conf veya /etc/nginx/sites-available/testapp.conf konumunda bulunduğunu varsayalım ( Ubuntu ve türevleri altında), düzenleme dosyasını açın ve dosyanın en üstüne aşağıdaki satırları ekleyin.

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m; inactive=60m max_size=40m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;

fastcgi_cache_path yönergesi aşağıdaki gibi parametrelerin sayısını belirtir:

  • /var/cache/nginx – önbellek için yerel disk dizininin yolu.
  • seviyeler – bir önbelleğin hiyerarşi düzeylerini tanımlar, /var/cache/nginx altında iki düzeyli bir dizin hiyerarşisi oluşturur.
  • keys_zone (name:size) – tüm etkin anahtarların ve veriler (meta) hakkındaki bilgilerin depolandığı paylaşılan bir bellek bölgesinin oluşturulmasına olanak sağlar. Anahtarları belleğe kaydetmenin, NGINX'in diskteki durumu kontrol etmeden MISS mi yoksa HIT mi olduğunu belirlemesini kolaylaştırarak kontrol sürecini hızlandırdığını unutmayın.
  • etkin değil – belirtilen süre içinde erişilmeyen önbelleğe alınmış verilerin, tazeliklerine bakılmaksızın ne kadar süre sonra önbellekten silineceğini belirtir. Örnek yapılandırmamızdaki 60m değeri, 60 saatten sonra erişilmeyen dosyaların önbellekten kaldırılacağı anlamına gelir.
  • max_size – önbelleğin maksimum boyutunu belirtir. Burada kullanabileceğiniz daha fazla parametre vardır (daha fazla bilgi için NGINX belgelerini okuyun).

fastcgi_cache_key yönergesindeki değişkenler aşağıda açıklanmıştır.

NGINX bunları bir isteğin anahtarını (tanımlayıcısını) hesaplamak için kullanır. Önemli olarak, istemciye önbelleğe alınmış bir yanıt göndermek için isteğin, önbelleğe alınmış yanıtla aynı anahtara sahip olması gerekir.

  • $scheme – istek şeması, HTTP veya HTTPS.
  • $request_method – istek yöntemi, genellikle “GET ” veya “POST ”.
  • $host – bu, öncelik sırasına göre istek satırındaki ana bilgisayar adı veya "Ana Bilgisayar" istek başlık alanındaki ana bilgisayar adı veya bir istekle eşleşen sunucu adı olabilir .
  • $request_uri – tam orijinal istek URI'si (bağımsız değişkenlerle birlikte) anlamına gelir.

Ayrıca add_header X-Cache-Status yönergesindeki $upstream_cache_status değişkeni, MISS olsun olmasın, NGINX'in yanıt verdiği her istek için hesaplanır. (yanıt önbellekte bulunamadı, uygulama sunucusundan alındı) veya HIT (önbellekten sunulan yanıt) veya desteklenen diğer değerlerden herhangi biri.

Daha sonra, PHP isteklerini PHP-FPM'ye ileten location yönergesi dahilinde, yukarıda tanımladığınız önbelleği etkinleştirmek için fastcgi_cache yönergelerini kullanır.

Ayrıca gösterildiği gibi fastcgi_cache_valid yönergesini kullanarak farklı yanıtlar için önbelleğe alma süresini ayarlayın.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

Bizim durumumuzda olduğu gibi yalnızca önbellekleme süresi belirtilirse yalnızca 200, 301 ve 302 yanıtları önbelleğe alınır. Ancak yanıtları açıkça belirtebilir veya herhangi birini (herhangi bir yanıt kodu için) kullanabilirsiniz:

fastcgi_cache CACHEZONE;
fastcgi_cache_valid 200  301 203 60m;
fastcgi_cache_valid 404 10m;
OR
fastcgi_cache CACHEZONE;
fastcgi_cache_valid  any 10m;

Nginx'te FastCGI Önbelleğe Alma Performansının İnce Ayarı

Yanıt önbelleğe alınmadan önce aynı anahtarla bir isteğin minimum kaç kez yapılması gerektiğini ayarlamak için http{ veya dizinine fastcgi_cache_min_uses yönergesini ekleyin. >sunucu{ veya konum{ bağlamı.

fastcgi_cache_min_uses  3

"If-Modified-Since " ve "If-None-Match" başlık alanlarına sahip koşullu istekleri kullanarak süresi dolmuş önbellek öğelerinin yeniden doğrulanmasını etkinleştirmek için fastcgi_cache_revalidate yönergesi, http{ veya sunucu{ veya location{ bağlamı içinde.

fastcgi_cache_revalidate on;

Ayrıca, konum yönergesindeki proxy_cache_use_stale yönergesini kullanarak NGINX'e, kaynak sunucu veya FCGI sunucusu kapalıyken önbelleğe alınmış içerik sunması talimatını da verebilirsiniz.

Bu örnek yapılandırma, NGINX'in yukarı akış sunucusundan bir hata, zaman aşımı ve belirtilen hatalardan herhangi birini alması ve önbelleğe alınan içerikte istenen dosyanın eski bir sürümüne sahip olması durumunda eski dosyayı teslim ettiği anlamına gelir.

proxy_cache_use_stale error timeout http_500;

FCGI önbelleğe alma performansına ince ayar yapmak için bir başka yararlı yönerge, proxy_cache_use_stale yönergesiyle birlikte çalışan fastcgi_cache_background_update'dir. Açık olarak ayarlandığında, istemciler süresi dolmuş veya yukarı akış sunucusundan güncellenme sürecinde olan bir dosya talep ettiğinde NGINX'e eski içerik sunması talimatını verir.

fastcgi_cache_background_update on;

fastcgi_cache_lock, önbellek performansının ince ayarı için de kullanışlıdır; çünkü birden fazla istemci, önbellekte olmayan aynı içerik için istekte bulunursa, NGINX yalnızca ilk isteği yukarı akış sunucusuna iletir; yanıt daha sonra önbellekten diğer istemci isteklerine hizmet eder.

fastcgi_cache_lock on;

NGINX yapılandırma dosyasında yukarıdaki tüm değişiklikleri yaptıktan sonra dosyayı kaydedip kapatın. Ardından, NGINX hizmetini yeniden başlatmadan önce yapılandırma yapısında herhangi bir sözdizimi hatası olup olmadığını kontrol edin.

nginx -t
systemctl restart nginx

Daha sonra, önbelleğin düzgün çalışıp çalışmadığını test edin, aşağıdaki curl komutunu kullanarak web uygulamanıza veya sitenize erişmeyi deneyin (ilk seferde bir MISS belirtilmelidir, ancak sonraki istekler bir HIT belirtmelidir) ekran görüntüsünde gösterildiği gibi).

curl -I http://testapp.linux-console.net

İşte NGINX'in eski verileri sunduğunu gösteren başka bir ekran görüntüsü.

Önbelleği Atlamaya İstisnalar Ekleme

NGINX'in istemcilere önbelleğe alınmış yanıtlar göndermemesi gereken koşulları fastcgi_cache_bypass yönergesini kullanarak ayarlamak mümkündür. NGINX'e yukarı akış sunucusundan gelen yanıtları hiçbir şekilde önbelleğe almaması talimatını vermek için fastcgi_no_cache'i kullanın.

Örneğin, POST isteklerinin ve sorgu dizesi içeren URL'lerin her zaman PHP'ye gitmesini istiyorsanız. Öncelikle koşulu aşağıdaki gibi ayarlamak için bir if ifadesi bildirin.

set $skip_cache 0; 
if ($request_method = POST) { 
	set $skip_cache 1; 
} 

Ardından fastcgi_cache_bypass ve fastcgi_no_cachePHP-FPM'ye ileten location yönergesinde yukarıdaki istisnayı etkinleştirin. > direktifler.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

Sitenizde içerik önbelleğe almayı etkinleştirmek istemeyebileceğiniz başka birçok bölüm vardır. Aşağıda, nginx.com blogunda sağlanan, bir WordPress sitesinin performansını artırmaya yönelik örnek bir NGINX yapılandırması verilmiştir.

Bunu kullanmak için, ortamınızda mevcut olanı yansıtacak değişiklikler (etki alanı, yollar, dosya adları vb.) yapın.

fastcgi_cache_path /var/run/NGINX-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m; 
fastcgi_cache_key "$scheme$request_method$host$request_uri"; 
server { 
	server_name example.com www.example.com; 
	root /var/www/example.com; 
	index index.php; 
	access_log /var/log/NGINX/example.com.access.log; 
	error_log /var/log/NGINX/example.com.error.log; 
	set $skip_cache 0; 
	# POST requests and URLs with a query string should always go to PHP 	
	if ($request_method = POST) { 
		set $skip_cache 1; 
	} 
	if ($query_string != "") {
		set $skip_cache 1; 
	} 
	# Don't cache URIs containing the following segments 
	if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php |sitemap(_index)?.xml") { 
		set $skip_cache 1; 
	} 
	# Don't use the cache for logged-in users or recent commenters 
	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass |wordpress_no_cache|wordpress_logged_in") {
		set $skip_cache 1; 
	} 
	location / { 
		try_files $uri $uri/ /index.php?$args; 
	} 
	location ~ .php$ { 
		try_files $uri /index.php; 
		include fastcgi_params; 
		fastcgi_pass unix:/var/run/php5-fpm.sock; 
		fastcgi_cache_bypass $skip_cache; 
		fastcgi_no_cache $skip_cache; 
		fastcgi_cache WORDPRESS; 
		fastcgi_cache_valid 60m; 
	} 
	location ~ /purge(/.*) {
		fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; 
	} 
	location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg |gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi |wav|bmp|rtf)$ { 
		access_log off; 
		log_not_found off; 
		expires max; 
	} 
	location = /robots.txt { 
		access_log off; 
		log_not_found off; 
	}
	location ~ /. { 
		deny all; 
		access_log off; 
		log_not_found off; 
	} 
}

NGINX'te Proxy Önbelleğini Etkinleştirme

NGINX ayrıca diğer proxy sunuculardan gelen yanıtların önbelleğe alınmasını da destekler (proxy_pass yönergesiyle tanımlanır). Bu test senaryosunda, Node.js web uygulaması için NGINX'i ters proxy olarak kullanıyoruz, dolayısıyla Node.js uygulaması için NGINX'i önbellek olarak etkinleştireceğiz. Burada kullanılan tüm konfigürasyon direktifleri bir önceki bölümdeki FastCGI direktifleriyle benzer anlamlara sahiptir, dolayısıyla bunları tekrar açıklamayacağız.

Proxy sunucudan gelen yanıtların önbelleğe alınmasını etkinleştirmek için proxy_cache_path yönergesini üst düzey http{ bağlamına ekleyin. İsteklerin nasıl önbelleğe alınacağını belirtmek için proxy_cache_key yönergesini de aşağıdaki gibi ekleyebilirsiniz.

proxy_cache_path /var/cache/nginx app1 keys_zone=PROXYCACHE:100m inactive=60m max_size=500m;
proxy_cache_key  "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_min_uses 3;

Ardından, konum yönergesindeki önbelleği etkinleştirin.

location / {
	proxy_pass http://127.0.0.1:3000;
	proxy_cache        PROXYCACHE;
	proxy_cache_valid 200 302 10m;
	proxy_cache_valid 404      1m;
}

NGINX'in önbelleğe alınmış içerik göndermediği ve yukarı akış sunucusundan hiçbir yanıtı önbelleğe almadığı koşulları tanımlamak için proxy_cache_bypass ve proxy_no_cache'i ekleyin.

 
proxy_cache_bypass  $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache        $http_pragma $http_authorization;

Proxy Önbellek Performansının İnce Ayarı

Aşağıdaki yönergeler proxy önbelleğinin performansının ince ayarını yapmak için kullanışlıdır. Ayrıca FastCGI direktifleriyle aynı anlamlara sahiptirler.

proxy_cache_min_uses 3;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500;
proxy_cache_background_update on;
proxy_cache_lock on;

Daha fazla bilgi ve önbelleğe alma yapılandırma yönergeleri için, iki ana modül olan ngx_http_fastcgi_module ve ngx_http_proxy_module'ye ilişkin belgelere bakın.

Ek Kaynaklar: NGINX İçeriğini Önbelleğe Alma ve WordPress Performansını Artırmaya Yönelik İpuçları.