internet pencereler Android
Genişletmek

Debian'da Nginx kullanarak statik önbellekleme kurma. NGINX sunucusundaki Nginx ve Apache önbelleğe alma ile ilgili sıkıştırma ve önbellekleme konfigüratörü

HTTP başlığı, önbellek kontrolü, önbelleği yönetmenizi sağlar, böylece istenen içeriğin ne kadar süre alakalı olacağını bildirir. "Ömür boyu" süresi dolduktan sonra, önbellek alakalı olmaktan vazgeçer ve orijinal kaynağın içeriğe değişiklik olup olmadığını öğrenmek için talep etme ihtiyacı vardır. Son kullanma tarihi başlık, HTTP protokolünde düzenlenen standart bir başlıktır ve hemen hemen her önbellek tarafından desteklenir. Önbellek kontrol başlığına gelince, HTTP / 1.1'de tanıtıldı, böylece web yöneticilerinin içeriğe göre daha fazla kontrolü gerçekleştirmelerinin yanı sıra, süresi dolantı ile ilgili sınırlamaları çözmelerine izin veriyor. Önbellek kontrolünü etkili bir şekilde kullanmak için, önbelleğin alakalı olması durumunda zamanın belirtilmesi önerilir.

Bu yazıda, NGIDX'deki son kullanma tarihi parametresini ayarlama örneklerini düşünüyoruz. Öncelikle, ayarlardaki maksimum önbellek depolama süresini ayarlamaya çalışalım.
Maksimum süre boyunca önbellek koymak

Sunucu (... Konum ~ * ^. + \\. (JPG | GIF | png) $ (Max;) ...)

Sık sık önbellekleme zaman değeri günlerde belirtilebilir, 7 gün ayarlamamız gereken ayarlarda, bu gibi görünecektir.
Bir hafta boyunca önbellek koymak

Sunucu (... konum ~ * ^. + \\. (JPG | GIF | PNG) $ (7D süresi doldu;) ...)

Böylece, dosyaların ilk isteğinden sonraki tarayıcı, yalnızca 7 gün sonra tekrar talep eder. Bunca zaman, kullanıcı tarayıcı önbelleğinde olacaklar. Ayrıca, son dosya değişikliği anından önbelleğin yaşam süresini sayma fırsatı da var.
Son dosya değişikliği andan itibaren önbellek koymak

Sunucu (... Konum ~ * ^. + \\. (JPG | GIF | PNG) $ (Modifiye 3D süresi doluyor;) ...)

Bu yöntemi kullanarak, sonuç olarak, dosyanın son modifikasyonunun zamanına bağlı olacak önbellek zamanını alırız. Son değişiklikten bu yana, tarayıcı 3 gün sonra bir dosya isteyecektir. Bazı görevler için, böyle bir önbellekleme yöntemi daha uygun olabilir.
Ayrıca, tarayıcı dosyalarının önbelleğini devre dışı bırakabilirsiniz, bu parametrenin değerini KAPALI olarak ayarlayın.
Tarayıcıda önbelleğe alma dosyasını devre dışı bırak

Sunucu (... konum ~ * ^. + \\. (JPG | GIF | PNG) $ (Kapalı sona eriyor;) ...)

Bu şekilde belirtilen değer, önbellek kontrol işlemini tamamen devre dışı bırakır. Önbellekleme kullanarak, müşteri parçası, içeriğin tamamını indirme ihtiyacını önler, çünkü Zaten yerel dosyaların kopyaları var. Önbellekleme süresini ayarlamak için, çok fazla fanatizm olmadan, çok uzun bir önbellek olmadan çok uzun bir önbellek her zaman rasyonel olmayabilir, eğer veriler oldukça dinamik olarak değişmeyebilir.

Önbellekleme (önbellekleme), hızlı kaydedilmiş bilgi taşıyıcıları (önbellek, nakit) hakkındaki verilerin bir kopyasını oluşturma işlemidir. Site binalarının gerçeklerin gerçeklerini basitçe koymak ve uygulamak, php scriptleri (veya diğer diğer, bir tür perl, ASP.NET) kullanılarak oluşturulan sayfanın veya bir kısmının statik bir HTML kopyasının oluşturulması olabilir. Hangi dilde CMS sitesi tarafından yazılır) ve diskte, RAM'de veya hatta tarayıcıda kaydedilir (aşağıda daha ayrıntılı olarak düşünün). Sayfa müşteriden (tarayıcıdan) talep edildiğinde, komut dosyalarıyla toplamak yerine, tarayıcı, yeni bir kopyasını, barındırma kaynaklarının maliyetleri konusunda çok daha ekonomiktir ve bitmiş sayfayı geçerken daha hızlı Daha az zaman alır (bazen önemli ölçüde daha az), tekrar nasıl oluşturulur.

Neden sitede önbellekleme kullanıyorsunuz?

  • Hosting üzerindeki yükü azaltmak için
  • Tarayıcı sitesinin içeriğini hızlıca kurtarmak için

Her iki argüman da, düşünüyorum, yorumlarda ihtiyacım yok.

Sitenin önbelleğe alma dezavantajları ve olumsuz etkisi

Garip bir şekilde, sitenin önbelleğe alınması kendi eksidir. Her şeyden önce, siteleriyle etkileşime girerken dinamik olarak değişen sitelerle ilgilidir. Genellikle, bunlar içeriği veya bir kısmını AJAX kullanarak veren sitelerdir. Genel olarak, önbellekleme Ajax da mümkündür ve hatta ihtiyaç duyulmaktadır, ancak bu ayrı bir sohbet için bir konudur ve daha fazla tartışılacak geleneksel olarak kullanılan teknolojileri ilgilendirmez.
Ayrıca, Sitenin elemanları ile etkileşime girerken, kalıcı önbelleğin bir sorun haline gelebileceği kayıtlı kullanıcılardan sorunlar ortaya çıkabilir. Burada, bir kural olarak, önbellek kapatılır veya sitenin bireysel elemanlarının önbelleğe alınması kullanılır: widget'lar, menüler ve benzerleri.

Sitenizde önbellekleme nasıl kurulur

Başlamak için, hangi teknolojilerin geleneksel olarak sitelerin içeriğini önbelleğe almak için kullanıldığını anlamak gerekir.
Tüm olası yollar 3 gruba ayrılabilir.

Sunucu önbellekleme

Nginx ile önbellekleme

Htaatch önbellekleme (Apache)

Sadece K.HTAccess'e erişiminiz varsa ve çalışma sunucusu yalnızca Apache, o zaman bu tür uygulamaları GZIP sıkıştırma olarak kullanabilirsiniz ve bir tarayıcı önbelleğini kullanmak için başlıkları sona erdirebilirsiniz.

İlgili MIME dosya türleri için GZIP sıkıştırmasını açın

EkranPutfilterbyType Metin / Düz Metin / HTML EklentisiFilterbyType Metin / CSS EklentisiPutfilTybyType Metin / JavaScript Uygulamasını / Javascript Uygulaması / X-JavaScript EklentisiPutFilterbyType Metin / XML Uygulaması / XML Uygulaması / XHTML + XML Uygulaması / RSS + XML EklentisiPutfilterbyType Deflate Uygulama / JSON AddoutPutFilterbyType Uygulamayı / vnd.ms-Fontokject Uygulamasını / X-Font-TTF Yazı Tipi / OpenType Resmi / SVG + XML Görüntü / X-icon

1 yıllık bir süre boyunca statik dosyalar için üst üste dönün (365 gün)

ExpirseDefault "Access Plus 365 Günü"

Memcached önbellekleme

PHP hızlandırıcısını kullanarak önbellekleme

Motorun motoru PHP'ye yazılırsa, daha sonra sitenin herhangi bir sayfasının her bir indirmesiyle, PHP komut dosyaları yürütülürse: Kod yorumlayıcı, programcı tarafından yazılan komut dosyalarını okur, bir ByTecode üretir, açık bir makine, sonucu verir. PHP Hızlandırıcı, BaitCode'un kalıcı neslini hariç tutmanıza, derlenmiş kodu bellekte veya diskte önbelleğe alır, böylece verimliliği artırarak ve PHP tarafından harcanan zamanı azaltmanıza olanak sağlar. Bugün için desteklenen hızlandırıcılardan:

  • PHP için Windows önbellek uzantısı
  • Xcache
  • Zend Opcache.

PHP sürüm 5.5 ve üstünde hızlandırıcı zaten içine yerleştirilmiş Zend Opcache.Bu nedenle, hızlandırıcıyı açmak için, sadece PHP sürümünü güncelleyin

Site önbellekleme

Kural olarak, CMS sitesinin, sayfaların statik HTML kopyalarını oluşturma olasılığı anlamına gelir. Popüler motorların ve çerçevelerin çoğunluğu böyle bir fırsata sahiptir. Şahsen, Smarty, WordPress ile çalıştım, bu yüzden işleriyle mükemmel bir şekilde başa çıkmalarını garanti edebilirim. Kutudan çıkan orijinal Wordpress'de, çok az yüklü bir projeye ihtiyacınız olan önbellekleme yetenekleri yoktur, ancak önbelleğe alma için birçok popüler eklenti var:

  1. bu sadece sitenin statik sayfalarının oluşumunda yer alıyor;
  2. Özü, özünde önceki eklenti ile aynı şekilde çalışır;
  3. Db önbellek. İşin özü, veritabanına sorguları önbelleğe almaktır. Ayrıca çok faydalı bir özellik. İki önceki eklentili bir pakette kullanılabilir;
  4. W3 toplam önbellek. Tatlı için bıraktı, bu WordPress'deki en sevdiğim eklenti. Site onunla dönüştürülür, sert bir otobüsden yarış arabasına dönüşür. Büyük avantajı, çeşitli önbellekleme seçenekleri (statik, hızlandırıcılar, memcached, veritabanı istekleri, nesne ve sayfa önbellekleme), birleştirme ve kod mitifiyatı gibi büyük bir özellik, (CSS dosyalarını birleştirerek ve sıkıştırarak, JavaScript, Sıkıştırma HTML, kaldırılması nedeniyle) boşluklar), CDN ve çok daha fazlasını kullanarak.

Ne diyebilirim - doğru CMS'yi kullanın ve neredeyse kutuya yüksek kaliteli önbellekleme mevcut olacaktır.

Tarayıcının yan tarafında (müşteri), önbellekleme başlıkları

Tarayıcıda KECHING mümkündür, çünkü kendiliğinden saygılı bir tarayıcı izin verir ve teşvik eder. Belki de, sunucunun müşteriye verdiği HTTP başlıklarıdır, yani:

  • Süresi doldu;
  • Önbellek Kontrolü: Max-Yaş;
  • Son düzenleme;
  • Etag.

Onlar sayesinde, siteye defalarca giren kullanıcılar, sayfaları indirmek için son derece az zaman harcıyor. Önbellekleme başlıkları önbelleğe alınmış statik kaynaklara uygulanmalıdır: Herhangi biri, PDF, Ses ve Video, vb. Şablon dosyaları, resimler, javascript ve CSS dosyaları.
Başlıklar ayarlamanız önerilir, böylece aşamalar en az bir hafta saklanır ve bir yıldan fazla, en iyi yıldır.

Süresi doldu.

Son kullanma tarihi başlık, önbelleğin ne kadar süreyle ilgili olduğundan sorumludur ve tarayıcı, yeni sürümlerini sunucudan talep etmeden önbelleğe alınmış kaynakları kullanabilir. Mutlaka davrandığı için kullanımı güçlü ve son derece arzu edilir. Başlığın haftadan bir yıla kadar belirtilmesi önerilir. Bir yıldan fazla, bunun RFC kurallarının ihlali olduğunu göstermemek daha iyidir.

Örneğin, Yıllık (365 gün) tüm statik dosyalar için NGINX'te sona erecekleri yapılandırmak için, NGINX yapılandırma dosyasındaki kod mevcut olmalıdır.

Yer ~ * ^. + \\. (JPG | JPEG | GIF | PNG | SVG | JS | CSS | MP3 | OGG | MPE? G | AVI | ZIP | GZ | BZ2? | RAR | SWF) $ (365D süresi doluyor;)

Önbellek Kontrolü: Max-Yaş;

Önbellek kontrolü: Maksimum yaş aynıdır.
Daha tercihen, daha fazla prevalans nedeniyle önbellek kontrolünden daha uzun süre kullanılması. Bununla birlikte, eğer süresi ve önbellek kontrolü başlıklarda aynı anda bulunursa, öncelik önbellek kontrolüne verilecektir.

Nginx'te Önbellek kontrolü aynı şekilde açılır Süresi doldu., Direktif süresi doluyor: 365D;

Son değiştirilmiş ve etag

Bu başlıklar dijital baskılar ilkesi üzerinde çalışır. Bu, Keshe'deki her URL adresi için kendi benzersiz kimliğini yüklediği anlamına gelir. Son düzenleme. Son değişimin tarihine dayanarak yaratır. Başlık Etag. Herhangi bir benzersiz kaynak tanımlayıcısını kullanır (çoğu zaman bu, dosyanın veya karma içeriğinin bir sürümüdür). Son değiştirilmiş bir "zayıf" bir başlıktır, çünkü tarayıcı önbellekten bir öğenin isteyip istemediğini belirlemek için sezgisel algoritmalar kullanır.

Statik dosyalar için Nginx'te Etag. ve Son düzenleme. Varsayılan olarak dahil. Dinamik sayfalar için, ya göstermemeleri daha iyidir veya bunu bir sayfa oluşturan bir komut dosyası yapmalı veya uygun şekilde yapılandırılmış bir önbellek kullanmak için en iyi olanı, ardından Nginx başlıklara bakacaktır. Örneğin, WordPress için, yararlanabilirsiniz.

Bu başlıklar, tarayıcının önbelleğe alınmış kaynakları etkin bir şekilde güncellemesini sağlar, kullanıcının her zaman sayfayı açıkça yeniden başlattığında istekleri gönderir. Koşullu sorguları alın, kaynak sunucuda değiştirilmediyse ve böylece tam isteklerden daha küçük bir gecikme sağlarsa, tam isteklerden daha küçük bir gecikme sağlayın, böylece yanıt süresini barındıran ve azaltan yükü azaltır.

Artık kullanım ve önbellek kontrolünün eşzamanlı kullanımı: Max-Yaş, en son değiştirilmiş ve ETAG'nin eşzamanlı kullanımı olarak yedektir. Expirings + ETAG veya Expirations + Son modağını birlikte kullanın.

Statik dosyalar için GZIP sıkıştırmasını etkinleştirin

Tabii ki, Gzip sıkıştırma, doğrudan önbelleğe alma için geçerli değildir, ancak trafik çok kaydedilir ve sayfaların indirme hızını arttırır.

Sunucuda statik için GZIP nasıl etkinleştirilir (.... Gzip Açık; Gzip_DiSable "MSIE6"; GZIP_TYPES Metin / Düz Metin / CSS Uygulaması / JSON Uygulaması / XML Uygulaması / XML + RSS Metin / JavaScript Uygulaması / JavaScript;) Nasıl Etkinleştirilir Gzip V.HTAccess Sıkıştırma'yı etkinleştirmek için Statics için Gzip, aşağıdaki kodu dosyanın başlangıcına eklemeniz gerekir: AddOutputFilterByType DEFLATE metin / düz AddOutputFilterByType DEFLATE.Ayrıca text / html AddOutputFilterByType DEFLATE.Ayrıca text / xml AddOutputFilterByType DEFLATE text / css AddOutputFilterByType DEFLATE application / xml AddOutputFilterByType DEFLATE application / xhtml + xml AddOutputFilterByType DEFLATE uygulama / rss + xml AddOutputFilterByType DEFLATE uygulama / javascript AddOutputFilterByType DEFLATE.Ayrıca uygulama / x- javascript.

Çok yüklü sitelerde, tarayıcı önbelleğe alma ve ön sıkıştırma sayesinde, önbellekleme eklentileri olmadan yapmak mümkündür. Bununla birlikte, bu yazıda, yalnızca Apache HTTP sunucusunun çalıştığı barındırmak için ilgili direktifler vardır. Sunucu kaynaklarını kaydetmek için bazı hosters devre dışı bırakılmıştır Apache veya hiç kurmayın, yalnızca daha az voracious bir Web sunucusu Nginx'i yapılandırmayı tercih eder. Sadece NGINX barındırmanızda çalışırsa, ilerleme sıkıştırma ve tarayıcıyı nasıl yapılandırabileceğinizi görelim.

1. Ön sıkıştırma
Sayfaların içeriğini ziyaretçi tarayıcısına vermeden önce, sıkıştırabilirsiniz. Sıkıştırma, iletilen dosyaların boyutunu (bazen birkaç kez) azaltır, bu da sayfa yükleme hızında bir artışa yol açar ve giden trafiği azaltır. Yalnızca metin parçası - metin, HTML, PHP, JS, XML ve diğer benzerlerini içeren dosyaları sıkıştırmanız gerekir. Metin, düşük bir sıkıştırma seviyesi ile bile iyi sıkıştırılmıştır, iletilen Falamların hacmi% 50-80 oranında azalır. Tabii ki, dosyalar küçük, sadece onlarca Kilobyte, ancak binlerce falas olduğunu düşünüyorsanız ve her gün binlerce ziyaretçi ile yüklenir, sonra söylerken, bir iş parçacığı üzerinde dünyayla - bir yaka , Tasarruf önemli olduğu ortaya çıktı.

1-1. Sıkıştırma Öncesi / Apache
Apache sahibi olanlar için, ana bilgisayardan öğrenmeniz gerekir, ne uygulayan özel modüller kurulur - Mod_pagesPeed veya Mod_Deflate? Genellikle Apache 2x yükleyin mod_deflate. Hala mod_gzip var, ancak önceki sürümlere kuruldu, bu yüzden onunla tanışması muhtemel değil.

Mod_pagesPeed modülü takılıysa, sitenizin kökünde olan dosyada.htaccess dosyasında, eklemeniz gerekir:


ModpagesPeed Açık.
# Komutları kullanarak, filtreler vb.

Mod_deflate modülü takılıysa, sitenizin kökünüzünde olan dosyada.htaccess dosyasında, eklemeniz gerekir:


AddoutPutFilterbyType Metin / HTML Metin / Düz Metin / XML Uygulaması / XML Uygulaması / XHTML + XML Metin / CSS Metin / JavaScript Uygulaması / JavaScript Uygulaması / X-JavaScript


Bu durumda, tüm metin dosyaları sıkıştırma - TXT, HTML, XML, XHTML, CSS, JS'ye maruz kalır.

Ya da httpd.conf. / usr / local / ETS / Apache22 /:


AddoutPutFilterbyType Uygulamasını / Javascript'i Deflate
EkranPutFilterbyType Application / X-JavaScript'i Deflate
AddoutPutFilterbyType Metin / Javascript'i Deflate
AddoutPutFilterbyType Metin / CSS'yi Deflat

BrownerMratch ^ Mozilla / 4 GZIP-SADECE-Metin / HTML
Broşürler ^ mozilla / 4 \\ .0 no-gzip
BARTERMATCH \\ BMSIE! NO-GZIP! GZIP-SADECE-Metin / HTML


Apache'yi yeniden başlatmanız gerekir.

/usr/local/etc/rc.d/apache22 yeniden başlatın.

1-2. Sıkıştırma Öncesi / Nginx
Hosting Nginx altında çalışıyorsa, direktifler farklı görünecektir. Sitenizin kökünde olan dosyala.htaccess için eklenmeniz gerekir:

sunucu (
Gzip açık;
GZIP_TYPES Metin / HTML Metin / CSS Uygulaması / X-JavaScript Metin / Düz Metin / XML Görüntü / X-icon;
}

1-3. Sıkıştırma Öncesi / Komut Dosyası
Blogunuzun çalışmasını sağlayan sunucunun mod_deflate veya mod_gzip'i desteklememesidir. Bu durumda, Apache'de ve Nginx'te çalışan evrensel bir komut dosyasına başvurabilirsiniz.

Motor tarafından kullandığınız ana dosyada, en başında, eklemeniz gereken ilk satır:

fonksiyonu iSclientsupportgzip () () () ()
if (headers_sent () || connection_aborted ()) false döndürün;
if ("http_acept_encoding"), "gzip") \u003d\u003d\u003d false) FALL döndürün;
Eğer (Getenv ("http_user_agent"), "konqueror")! \u003d\u003d false) false döndürün;
Doğru dönüş;
}

İf (isctientsupportgzip ()) () () (
Ob_start ("ob_gzhandler");
}
BAŞKA (
Ob_start ();
}


Tüm bu direktiflerin sonucu, ziyaretçi tarayıcısının sıkıştırılmış bir sayfa sürümünü alması gerçeği olacaktır - indirir, onu zaman dosyalarında açar ve normal formda görüntüler ve doğrudan siteden resim ekler. Tüm modern bruzler sıkıştırılmış dosya seçeneklerini kullanabilir ve bunlar hala sıkıştırılmamış dosyaların nasıl elde edileceğini bilmeyenler.

2. Tarayıcı Önbellekleme
Sıkıştırma ile birlikte, tarayıcıyı önbelleğe alınmış kopyayı kullanmak için verebilirsiniz. Son ziyaretten bu yana değişmediyse, neden dosyaları her zaman sitedeki dosyaları indirirsiniz? Dosya değişikliklerini izlemek ve yalnızca onlara maruz kalanları indirmek daha iyidir ve son yaklaşımdan siteye kalanlar, önbelleklerini almak için değişmedi. Bu yöntem, ziyaretçinin tarayıcısı ile site barındırma arasındaki trafiği önemli ölçüde azaltmaya izin verir, bu da sayfa yükleme süresindeki bir azalmaya yol açar. Resimlerdeki sayfalardaki hızda özellikle gözle görülür bir artış. Nitekim, resimler sitede çok nadiren değişir ve neden onları her zaman pompalayın, tarayıcı önbelleğinde mi?

2-1. Tarayıcı Önbellekleme / Kurulum Başlıkları / Apache
Apache, Mod_Expires ve Mod_Headers modüllerini kullanarak tarayıcı önbelleğe alma sağlar: Mod_Expires, önbelleğe alınmış verilerin alaka düzeyini belirler ve Mod_headers kamu erişilebilirliğidir. İşbirliği indirmeden önce esnek bir veri doğrulamasına yol açar: Tarayıcı özel başlıklar alır, önbellekte olan verilerin, sayfanın son ziyaretinden bu yana modası geçmiş olup olmadığını ve eğer modası geçmişse, onları günceller, yeni sürümlerini indirir. Dosyalar ve eski değilse, sunucudan indirmeden önbelleğinizden dosyaları görüntüler.

Apache'iniz varsa, Dosyasına ekle.htaccess expiring başlıklarını yüklemek için:


Harcanan açık.
ExpirseDefault "Access Plus 5 Saniye"
ExpirseByType image / x-icon "Access Plus 2592000 saniye"
ExpirseByType Image / JPEG "Access Plus 2592000 Saniye"
ExpirseByType Image / PNG "Access Plus 2592000 Saniye"
ExpirseByType Resmi / GIF "Access Plus 2592000 Saniye"
ExpirseByType Application / X-Shockwave-Flash "Access Plus 2592000 Saniye"
ExpirSbyType Metin / CSS "Erişim Artı 604800 Saniye"
ExpirSbyType Metin / JavaScript "Access Plus 216000 Saniye"
ExpirseByType Uygulaması / JavaScript "Access Plus 216000 Saniye"
ExpirseByType Application / X-JavaScript "Access Plus 216000 Saniye"
ExpirSbyType Metin / HTML "Access Plus 600 Saniye"
ExpirSbyType Uygulaması / XHTML + XML "ARACTION PLUS 600 saniye"


Bu durumda, farklı falamlar için önbelleğin alaka düzeyi saniyeler içinde gösterilir.

Apache, önbellek kontrol başlığını ayarlamak için kurulum için, File.Htaccess'e ekleyin:






Başlık, önbellek kontrolünü "halka açık" olarak ayarla


Başlık Ayarlandı Önbellek Kontrolü "Özel"


Başlık CACHE-CONTROL "ÖZEL, YERLEŞTİRME"


Bu durumda, alaka düzeyi ICO, JPG, JPEG, PNG, GIF, SWF, CSS, JS, HTML, XHTML, PHP'de kontrol edilir.

2-2. Tarayıcı önbellekleme / nginx
Apache'meniz yoksa, ancak NGINX var, tarayıcıyı sugain verilerini almak için belirtmek için, aşağıdaki satırları NGINX yapılandırmasında eklemeniz gerekir:

konum ~ * \\. (JPG | PNG | GIF | JPEG | CSS | JS) $ (
24 saat sona eriyor;
}


Bu durumda, önbelleğin uygunluğu 24 saattir ve doğrulanmış dosyaların türleri listelenmiştir - JPG, PNG, GIF, JPEG, CSS, JS.

İşte gerçek ve tüm vakıflar, başarılı sitelerinizi hızlandırın! ;)

Web sunucusu ve ters proxy Nginx, HTTP yanıtlarını önbelleğe almak için çok güçlü olanaklar olarak yerleşiktir. Bununla birlikte, bazı durumlarda, belgeler ve örnekler yeterli değildir, sonuç olarak, her şey bu kadar kolay ve istediğim kadar basit değil. Örneğin, yapılandırmalarım Nginx'dir - ve yerler kanla yazılır. Bu makale durumu biraz iyileştirmeye çalışacağım.

Bu makalede: a) tam şeritli önbelleklemede sualtı taşları; b) rotasyon ile önbellekleme; c) Zashed sayfasında dinamik bir "pencere" oluşturma.

Bir sürü Nginx + Fastcgi_php kullandığınızı varsayacağım. Nginx + Apache + Mod_php uyguluyorsanız, Fastcgi_Cache * ile ilgili direktiflerin adlarını, proxy_cache * ile değiştirin *

Sayfanın PHP tarafında veya Nginx tarafında yazılı olup olmadığını seçerseniz, Nginx'i seçerim. İlk olarak, herhangi bir zorluk olmadan ve "yüksek yük" hakkında akıllıca konuşmalar olmadan saniyede 5-10 bin istek vermenizi sağlar. İkincisi, Nginx bağımsız olarak önbellek boyutunu izler ve hem eskimiş sırasında hem de veriler yerinden edildiğinde fırçaladı.

Tüm sayfanın önbelleğe alınması tamamen

Sitenizde ana sayfa ise, dinamik olarak oluşturulmasına rağmen, ancak nadiren değişir, ancak nadiren değişir, sunucunun üzerindeki yükü güçlü bir şekilde azaltabilirsiniz, Nginx'te gösterilir. Yüksek katılım ile, kısa bir süre için bile önbellekleme (5 dakika ve daha az) zaten performansta çok büyük bir artış veriyor, çünkü önbellek çok hızlı çalışıyor. Sayfa bile sadece 30 saniye boyunca, veri güncellemesinin dinamiğini kaydederken hala önemli bir sunucu boşaltma yapacaksınız (birçok durumda her 30 saniyede bir kez güncellenir).

Örneğin, ana sayfayı şöyle sash olabilirsiniz:

Fastcgi_cache_path / var / önbellek / nginx seviyeleri \u003d keys_zone \u003d wholepage: 50m; ... Sunucu (... Konum / (... Fastcgi_pass 127.0.0.0.1:9000; | $ http_if_none_match | $ Host | $ http_if_none_match | $ Host | $ quite_uri "; # farklı kullanıcıların aynı oturum çerezini alamayacağını garanti ediyoruz. Fastcgi_hide_header" set- Çerez "; # # # PHP'de sergilenen # önbellek başlıklarından bağımsız olarak nginx önbellek sayfasını zorla. Fastcgi_ignore_headers" önbellek kontrolü "" süresi doluyor "))))))

Bu yapılandırmada her satırın kanla yazıldığını söylersem büyük ölçüde abartılamayacağım. Burada birçok tuzak var, hepsini görelim.

fastcgi_cache_path: Kolay hata ayıklama da önemlidir

fastcgi_cache_path / var / önbellek / nginx seviyeleri \u003d keys_zone \u003d wholepage: 50m;

FastCgi_Cache_Path yönergesinde, seviyeler için bir "boş" bir değer sergiliyorum. Bu, performansı hafifçe azaltsa da (dosyalar, dizinleri bölmeden / var / önbellek / nginx olarak oluşturulur), ancak önbelleğe göre sorunları hata ayıklamak ve teşhis etmek için büyüklük sırası yapar. İnan bana, ellerinizle / var / önbellek / nginx'e tırmanmaya ve orada ne depolandığını göreceksiniz.

fASTCGI_CACHE_VALID: Yanıt Kodunu 3 304 Tatlandıran

fastcgi_cache_valid 200 301 302 304 5m;

FASTCGI_CACHE_VALID Direktifinde, sadece standart kodlar 200 OK, 301 kalıcı olarak ve 302'yi buldu, ancak 304 de değiştirilemedik. Neden? 304'in ne anlama geldiğini hatırlayalım. İki durumda boş bir yanıt gövdesi ile verilir:

  • Tarayıcı "IF-MODIFIDIFIED-ONS: TARİH" başlığını gönderdiyse, hangi tarihte "Son Değiştirilen: Tarih" cevabına eşittir? Şunlar. Müşteri sorar: "Tarihten beri yeni bir sürüm var mı? Değilse, bana 304 vereceğim ve trafiği kurtaracağım. Varsa, bana sayfanın gövdesini verin. "
  • Tarayıcı, "ETAG: HASH" yanıt başlığı ile barıngan olduğu "if - hiçbiri maç: Hash" başlığını gönderirse. Şunlar. Müşteri sorar: "Sayfanın mevcut sürümü, en son istediğimden farklı mı? Değilse, bana 304 vereceğim ve trafiği kurtaracağım. Eğer evet ise, sayfanın gövdesini verin. "

Her iki durumda da, son modifiye edilmiş veya ETAG, nginx önbelleğinden büyük olasılıkla olacak ve çek çok hızlı tutulacak. PHP'yi sadece "çekmeye" gerek yoktur, böylece komut dosyası bu başlıkları, özellikle de Cevap 200'ü terk edecek müşterilerin önbellekten verileceği gerçeğinin ışığında vermesi gerekmez.

fastcgi_cache_key: Bağımlılıklarla dikkatlice çalışın

fastcgi_cache_key "$ Request_Method | $ http_if_modifiye_since | $ http_if_none_match | $ ev sahibi | $ Request_uri";

Özel dikkat, FastCgi_Cache_Key Direktifindeki değeri hak ediyor. Bu Direktifin asgari çalışma değerini getirdim. Sağa, sola adım atın ve bazı durumlarda önbellekten "yanlış" verileri almak için başlayacaksınız. Yani:

  • DEĞERLENDİRME TAVURUMUZ_METHOD İhtiyacımız var, çünkü İnternetteki kafa istekleri oldukça sık görülür. Kafa quansitesinin cevabı asla vücudu içermez. $ Request_Method'daki bağımlılığı kaldırırsanız, o zaman birinin kafa sayfasından kafa yöntemiyle sormanızı istediği tesadüf olabilir ve ardından boş içeriğe verileceksiniz.
  • $ Http_if_modifiye_since bağımlılığı gereklidir, böylece değiştirilmemiş cevabı olan önbellek yanlışlıkla, her zamanki gibi talebi yapan müşteriye yanlışlıkla verilir. Aksi takdirde, müşteri önbellekten gelen boş bir cevap alabilir.
  • $ Http_if_none_match ile aynı. Müşterilere boş sayfalar vermekten sigortalanmalıyız!
  • Son olarak, $ ev sahipliğine bağımlılık ve $ Request_uri yorum gerektirmez.
fastcgi_hide_header: Güvenlik sorunlarını çözüyoruz

fastcgi_hide_header "Set-Cookie";

Fastcgi_hide_header Direktifi çok önemlidir. Onsuz, güvenliği ciddiye alıyorsunuz: Kullanıcılar, diğer insanların oturumlarını önbellekte bir oturum çereziyle alabilirler. (Nginx'in en son sürümlerinde, bu faktörün otomatik olarak hesaplanması yönünde bir şey yapıldı.) Nasıl olduğunu anlıyor musun? Vasya Pupkin siteye geldi, oturum ve oturum kurabiyesi oldu. O zaman önbelleğin boş olduğu ortaya çıktı ve Vasin Cookie ona yazıldı. Sonra başka bir kullanıcı geldi, önbellek ve içinde bir cevap aldı - ve çerez VASI. Yani ve onun oturumu da.

Elbette, söyleyebilirsin: Ana sayfada Session_Start ()'yı arayalım, o zaman çerezlerde sorun olmayacak. Teoride, bu öyle, ancak pratikte bu yöntem çok dengesizdir. Oturumlar genellikle "ertelendi" ve "rastgele" kodunun herhangi bir kısmını, oturuma erişim gerektiren bir fonksiyona neden olmak için, güvenlikte bir delik açtıkça. Ve güvenlik, eğer belirli bir metodolojide ihmal ile delikler olabileceği bir şey, daha sonra bu tekniğin tanımı gereği "delik" olarak kabul edilir. Ek olarak, oturum dışında başka çerezler vardır; Ayrıca önbellekte kayıt yaptırmaları gerekmez.

fastCgi_Ignore_Headers: Yazarken yükten "yalan" sitesini vermeyiz.

fastcgi_ignore_headers "önbellek kontrolü" "süresi doluyor";

NGINX sunucusu, PHP veren önbellek kontrolüne, sona ermesiyle ve pragma başlıklarına dikkat çekiyor. Sayfanın önbelleğe alınması gerekmediğini söylerlerse (veya zaten modası geçmiş), ardından nginx bunu önbellek dosyasına yazmaz. Bu davranış, mantıklı görünmesine rağmen, pratikte çok fazla zorluk kazandırır. Bu nedenle, onu engelliyoruz: Fastcgi_ignore_headers sayesinde, herhangi bir sayfanın içeriği başlıklarından bağımsız olarak önbellek dosyalarına girecektir.

Bu karmaşıklık nedir? PHP'de varsayılan olarak "önbellek kontrolü: önbellek" ve "Pragma: Önbelleği" başlıklarını belirleyen Oturum ve Session_Start () işlevi ile ilişkilidirler. Sorun için üç çözüm var:

  • Önbelleğe alındığı bir sayfada Session_Start () kullanmayın. Bu yöntemin eksilerinden biri, daha önce daha yüksek sayılırdı: sadece bir dikkatsiz hareket yeterlidir ve sitenizin, lehimlenmiş bir ana sayfa için saniye başına binlerce istek kabul eden, anında "yatan", anında "yatan". İkinci eksi - önbellekleme mantığını iki yerde yönetmek zorunda kalacağız: NGINX yapılandırmasında ve PHP kodunda. Şunlar. Bu mantık, sistemin tamamen farklı bölümlerinde "bulaşmış" olacaktır.
  • INI_SET ("Session.Cache_Limiter", "") ayarlayın. Bu, PHP'yi oturumlarla çalışırken önbelleğe almayı sınırlayan herhangi bir başlığın geri çekilmesini devre dışı bırakacaktır. Buradaki sorun aynı: "bulaşan" önbellekleme mantığı, çünkü ideal olarak, tüm önbelleklemeyi tek bir yerden istiyoruz.
  • Fastcgi_ignore_headers kullanarak dosyaları önbellek yazarken önbellek yasağı başlıklarını görmezden gelin. Görünüşe göre bu bir kazan-kazan çözümüdür, bu yüzden ona tavsiyede bulunuyorum.

Rotasyon ile önbellekleme

Statik ana sayfa çok ilginç değil. Sitede birçok malzeme varsa ne yapmalı ve ana kişi onlar için bir tür "vitrin" olarak görev yapar? Böyle bir "vitrin" de, "rastgele" malzemeleri görüntülemek için uygundur; böylece farklı kullanıcılar farklı görmüşlerdir (ve hatta bir kullanıcı yeni bir içerik almış, tarayıcıdaki sayfayı yeniden başlatır).

Görev Çözme - Rotasyon Önbelleğe Alma:

  1. Komut dosyasını, veritabanına gerekli istekleri yerine getirerek, ana sayfanın eşyalarını rastgele sırayla üretmeye zorluyoruz (izin verin ve yavaşça).
  2. Sonra önbelleğe yalnız değil, ancak 10 sayfa seçeneğini söylüyoruz.
  3. Kullanıcı siteye girdiğinde, bu seçeneklerden birini gösteririz. Aynı zamanda, önbellek boşsa, komut dosyası başlatılır ve değilse, sonuç önbellekten iade edilir.
  4. Bir önbellek artıkları zaman (örneğin, 1 dakika), böylece farklı kullanıcıların sitenin tüm materyallerini "izledi.

Sonuç olarak, jeneratör komut dosyasının ilk 10 isteği "dürüstçe" ve "yük" olarak gerçekleştirilir. Ama sonra önbellekte "düşecek" ve bir dakika içinde hızlı bir şekilde verilecek. Performans arttıkça, sitede daha fazla ziyaretçi ne kadar yüksek olur.

İşte rotasyonla önbelleğe alarak uygulanan bir konfigürasyon parçası:

Fastcgi_cache_path / var / önbellek / nginx seviyeleri \u003d keys_zone \u003d wholepage: 50m; Perl_set $ rand "SUB (İND RAND 10)"; ... Sunucu (... Konum / ... fastcgi_pass 127.0.0.1:9000; ... # önbellekleme açın ve dikkatlice bir önbellek anahtarı seçin. Fastcgi_cache_valid 200 301 302 304 1m; fastcgi_cache_key "$ Rand | $ Request_Method | $ http_if_modifiye_since | $ HTTP_IF_NONE_MATCH | $ HOST HOST | $ Request_uri "; # Farklı kullanıcıların aynı oturum çerezini almayacağını garanti ediyoruz. Fastcgi_hide_header" Set-Cookie "; # PHP'de gösterilen # önbellek başlıklarından bağımsız olarak Nginx önbellek sayfasını zorla. Fastcgi_ignore_headers "Önbellek kontrolü" "süresi doldu"; # Tarayıcıyı her seferinde (rotasyon için) yeniden başlatmaya zorluyor. Fastcgi_hide_header "önbellek kontrolü"; add_header önbellek kontrolü "Mağaza yok, önbellek yok, revalitate, posta Check \u003d 0, Check \u003d 0 "; fastcgi_hide_header" Pragma "; Add_header Pragma" Önbellek "; # Erken Taze Son Modifiye. Süresi -1; # Dikkat !!! Bu satırın süresi doldu! Add_header son değiştirildi! $ Sent_http_expires;)))

Önceki örneğe göre, konumda 6 yönerge eklemek zorunda kaldığını fark edebilirsiniz. Hepsi çok önemli! Ama biz devam etmeyeceğiz, her şeyi sırayla düşün.

perl_Set: Randomizer Bağımlılığı

perl_set $ rand "SUB (İND RAND 10)";

Direktif perl_set ile her şey basittir. NGINX kullanırken bir değişken oluştururuz, içine gömülü Perl tercümanının işlevini çağırır. Yazar Nginx'e göre, bu oldukça hızlı bir operasyondur, bu yüzden "maçlarda tasarruf" yapmayacağız. Değişken, HTTP isteklerinin her birinde 0 ila 9 arasında rasgele bir değer alır.

fastcgi_cache_key: Randomizer'a Bağımlılık

fastcgi_cache_key "$ rand | $ Request_Method | ...";

Şimdi Randomizer değişkenini önbellek tuşuna karıştırıyoruz. Sonuç olarak, ihtiyacımız olan URL'de 10 farklı önbellek alınır. Önbellek kaymasının neden olduğu komut dosyasının ana sayfanın elemanlarını rastgele sırayla verir, her biri "yaşayan" 1 dakikalık (bkz. Fastcgi_Cache_Valid) 10 çeşittir.

add_header: Zorla tarayıcı önbelleğini kapatın
Fastcgi_hide_header "önbellek kontrolü"; ADD_HEADER CACHE-CONTROL "MAĞAZA YOK, YOK-Önbellek, DEĞERLENDİRME, KONUŞMASI, KONTROL ÖNLEME \u003d 0, PRE-CHECK \u003d 0"; Fastcgi_hide_header "pragma"; Add_header Pragma "Önbellek";

Yukarıda, Nginx'in PHP komut dosyası tarafından verilen önbellek başlıklarına duyarlı olduğunu söyledik. PHP komut dosyası "Pragma: Önbelleği" veya "Önbellek Kontrolü" veya "Mağaza Noktası" başlıklarını döndürürse (örneğin, "önbellek kontrolü:" önbellek kontrolü: beni olmayan, burada , kimin şapkasını söylemedim "), sonra nginx sonucu önbellek dosyalarına kaydetmeyecek. Özellikle böyle davranışı bastırmak için fastcgi_ignore_headers kullanıyoruz (yukarıya bakınız).

"Pragma: önbellek yok" arasındaki fark nedir, "önbellek kontrolü: önbellek yok"? Sadece Pragma - HTTP / 1.0 mirası ve şimdi eski tarayıcılarla uyumluluk için desteklenir. HTTP / 1.1 önbellek kontrolünü kullanır.

Ancak, tarayıcıda hala bir önbellek var. Ve bazı durumlarda, tarayıcı sayfayı görüntülemek için sunucuya bir istek yapmayı bile denemeyebilir; Bunun yerine, kendi önbelleğinden çıkaracak. Çünkü Bir rotasyonumuz var, bizim için sakıncız var: Sonuçta, her seferinde sayfaya girerken, kullanıcı yeni veri görmelidir. (Aslında, hala herhangi bir seçeneği buharlaştırmak istiyorsanız, önbellek kontrol başlığını deneyebilirsiniz.)

Add_header Direktifi, tarayıcıya bir önbellekleme yasağı başlığına transfer eder. Peki, bu başlık yanlışlıkla yükselmemesi durumunda, önce PHP komut dosyasını kaydettiğim HTTP yanıtından (ve Nginx önbelleğinde kaydedildi): DirectCi_hide_header Direktifi. Ne de olsa, bir Nginx Config yazdığınızda, PHP çıkışa karar verdiğini bilmeyin (ve Session_Start () kullanıldıysa, doğru bir şekilde tanımlar). Birdenbire kendi önbellek kontrol başlığını mı koyacak? Sonra iki tanesi olacak: PHP-Sleeve ve Add_header üzerinden ekleniyor.

sona Erdi ve Son Değiştirildi: Sayfanın yeniden başlatılmasını garanti ediyoruz
süresi doldu -1; # Dikkat !!! Bu dize süresi doluyor! Add_header Son değiştirilmiş $ Sent_http_expires;

Başka bir hile: Son değişiklik yaptığımız süreye kadar değiştirilmeliyiz. Ne yazık ki, Nginx'te değişken yoktur, ancak Son kullanma tarihi -1 Direktifi belirtirseniz, sihirli görünüyor.

Şimdi (Ekim 2009) olmasına rağmen, belgelenmemişse, NGINX, müşteriye verilen her XXX yanıt başlığı için $ SENT_HTTP_XXX tipi değişkenleri oluşturur. Onlardan birini kullanıyoruz.

Bu başlığı şu anki zaman koymak neden bu kadar önemli? Her şey oldukça basit.

  1. PHP'nin "son modifiye edilmiş: some_dat" unvanı verdiğini hayal edelim.
  2. Bu başlık NGINX önbelleğine kaydedilecektir (kontrol edebilirsiniz: Örneğimize göre, dosyalar / var / cache / nginx'te depolanır) ve ardından tarayıcıya istemciye gönderilir.
  3. Tarayıcı, sayfayı ve değiştirilmesinin tarihini hatırlayacaktır ...
  4. ... Bu nedenle, kullanıcıya HTTP isteğinde siteye girdiğinizde, "if-modifiye-sinc: some_data" başlık sorusu olacaktır.
  5. Nginx ne yapacak? Onun önbelleğinden bir sayfa alacak, başlıklarını sökecek ve en son değiştirildiğini onaylayacak. Değerler çakışırsa (veya ilk ikincinden daha az olacaktır), daha sonra Nginx, "304 Değiştirilmemiş" cevabını boş bir gövdeyle döndürür. Ve kullanıcı herhangi bir rotasyon görmeyecek: daha önce daha önce görülenleri alacak.

Aslında, büyük bir soru, tarayıcı da aynı anda son değiştirilmiş ve önbellek kontrolü olmayan bir önbellek varsa davranır. Bir if-modifiyeden beri sorgu yapacak mı? Farklı tarayıcılar burada farklı şekillerde davranıyor gibi görünüyor. Deney.

Son değişiklik yapmanın el ile ayarlanması için bir neden daha var. Gerçek şu ki, PHP işlevi session_start () son değiştirilmiş başlığı zorla görüntüler, ancak ilk önce kontrol edilen PHP dosyasının değişim süresini gösterir. Sonuç olarak, eğer sitede bulunursanız, tüm talepler aynı komut dosyasına (ön kontrol cihazı) gidin, ardından son modifikasyonunuz, kesinlikle doğru olmayan bu tek komut dosyasının değişikliğinin zamanına eşit olacaktır.

Zamanlanmış sayfada dinamik "pencere"

Sonunda, önbellek ışığında yararlı olabilecek bir teknikten bahsediyoruz. Ancak, sitenin ana (veya diğer) sayfasını paylaşmak istiyorsanız, ancak dinamik olması gereken bir küçük bloğa müdahale eder, modülü SGK ile çalışmak için kullanın.

Sayfanın o kısmında dinamik olması gereken, bu "HTML yorumu" ekleyin:

Nginx önbelleğinin bakış açısından bu yorum her zamanki metindir. Önbellek dosyasına bir yorum formunda kaydedilecektir. Bununla birlikte, daha sonra, önbelleği okurken, Dinamik URL'ye dönecek olan SGK NGINX modülü çalışacaktır. Tabii ki, adres / get_user_info adresinde / bu bloğun içeriğini alan bir PHP işleyicisi olmalıdır.

Ve doğal olarak, bu sayfa için SGK'yı veya hatta tüm sunucu için etkinleştirmeyi unutmayın:

SGK, yönergenin diğerine, son derece önemli bir mülke sahiptir. Sayfada bu tür birkaç yönerge olduğunda, hepsi paralel modda aynı anda işlenmeye başlar. Bu nedenle, her biri 200ms ile yüklenen 4 blok sayfanız varsa, sayfa miktarında, kullanıcı tarafından 200ms'den sonra alınacak ve 800'den sonra olmaz.