Reszty ustawień narazie nie zmieniałem. Dodałem w kontrolerze dla strony głównej caches_page :index, plik index.html ładnie się wygenerował i z tego co widzę jest generowany od nowa za każdym razem gdy wchodze na daną stronę, więc coś nie tak.
Po czym mozna poznać że plik jest pobierany z cache a nie generowany z erb ? W logu nie widze zadnej informacji o tym.
Czy powinienem coś ustawić w konfigu serwera aplikacji zeby wiedział skąd ma brać cachowane pliki ?
Aha, używam Capistrano, jedno pytanie apropo tego, katalog aplikacji powinien wskazywac na www/moja-aplikacja/current ?
Podejrzewam że nie ma sensu dodawać linku symbolicznego dla katalogu z cache, bo i tak po zmianach w kodzie i nowym deploy, lepiej żeby strony wygenrowały się od nowa.
Po tym, że żądanie nie trafia do railsów (zatem nie widać jej w logach railsowych, ale za to serwera www tak). Zawsze możesz dodać sobie jakiś znacznik w wygenerowanej stronie (np. timestamp w komentarzu) po którym będziesz wiedzieć, że strona jest “stara”.
Jeśli zmieniasz domyślny katalog z keszem - tak. Wynika to wprost z tego jak działa cały mechanizm keszowania do statycznych plików (prosta ale sprytna sztuczka). Kiedy masz żądanie dla adresu /foo/bar.html to (zakładając poprawnie skonfigurowany serwer www) najpierw jest sprawdzane istnienie pliku na dysku (w katalogu głównym aplikacji). Jeśli jest to taki plik jest serwowany, w przeciwnym przypadku żądanie trafia do railsów. Z kolei kiedy railsy zkeszują takie żądanie to tworzony jest plik o dokładnie takiej samej ścieżce i następne żądanie podpada pod pierwszy przypadek, co pozwala na zaserwowanie pliku bez udziału railsów.
To zależy. Jeśli Twoja aplikacja jest bardzo popularna to takie nagłe wyczyszczenie całego keszu mogłoby być zabójcze dla serwera. Jeśli tak nie jest to jak najbardziej możesz sobie pozwolić na to.
Dzięki za tutoriale. Używam VPSa na megiteam, czy powinienem gdzieś wstawić swój nginx.conf czy wyedytować aktualny? Nie mogę go znaleźć lub nie mam do niego dostępu.
Z capistrano chciałem sie upewnic, czy jesli w panelu administracyjnym ustawiam katalog z plikami dla aplikacji, to czy powinien on wskazywac na link current.
[quote=Artur79]Dzięki za tutoriale. Używam VPSa na megiteam, czy powinienem gdzieś wstawić swój nginx.conf czy wyedytować aktualny? Nie mogę go znaleźć lub nie mam do niego dostępu.
Z capistrano chciałem sie upewnic, czy jesli w panelu administracyjnym ustawiam katalog z plikami dla aplikacji, to czy powinien on wskazywac na link current.[/quote]
Jeśli to jest faktycznie VPS z pełnym dostępem do roota to konfig powinien być w /etc/nginx.conf. Co do 2 kwestii to za bardzo nie wiem co w tym panelu administracyjnym się ustawia, ale będzie to najprawdopodobniej jedno z dwóch: /sciezka/do/current lub /sciezka/do/current/public.
Dokładnie, ale odpisali mi na mail że mogą ustawić w konfigu sami. Narazie zostawiłem w public i page cache działa ok.
Ścieżke mam konkretnie ustawioną na /sciezka/do/aplikacji/current, ponieważ używam Capistrano, tak jest ok ?
Kolejne pytanie co do cache, w dokumentacji piszą że domyślnie dla cache używany jest file_store. pliki zapisywane są w katalogu /tmp/cache o ile taki istnieje, jeśli nie istnieje to używany jest memory_store. Czy chodzi o tmp w katalogu aplikacji czy systemowy tmp ? Pytam bo w żadnym z nich nie mogę znaleźć tych plików. Jesli natomiast ustawię ścieżkę w konfigu to pliki ładnie się zapisują.
Jakies pluginy wspomagające cachowanie ? http://snippets.aktagon.com/snippets/302 robi robote ?
“Rails provides different stores for the cached data created by action and fragment caches. Page caches are always stored on disk.”
Katalog tmp/cache odnosi się do katalogu w aplikacji. Jeśli nie używasz action lub fragment cachingu to ten katalog będzie pusty.
Musisz wiedzieć, że rodzajów keszowania jest wiele (różne warstwy). Rack-cache akurat tyczy się keszowania http i to trochę inne para kaloszy. Czy jest/może być przydatny? Oczywiście, że tak, ale zależy od potrzeb.
[quote=radarek]“Rails provides different stores for the cached data created by action and fragment caches. Page caches are always stored on disk.”
Katalog tmp/cache odnosi się do katalogu w aplikacji. Jeśli nie używasz action lub fragment cachingu to ten katalog będzie pusty.[/quote]
Rozumiem, ustawiłem:
Inna sprawa, próbowałem dla cachowanego fragmentu ustawić jak w tutorialu action suffix:
<% cache(:action => 'recent', :action_suffix => 'all_prods') do %>
tworzy mi wtedy katalog views/localhost:3000/ , co może być źle ustawione ?
Czy dla cachowanych fragmentów musze tworzyć sweeper czy powinno wystarczyć ustawienie :expires_in w szablonie ?
Żeby uniknąć pobierania danych które były potrzebne dla cachowanego fragmentu mam coś takiego, tak jest ok?
[quote=Artur79]<% cache(:action => 'recent', :action_suffix => 'all_prods') do %>
tworzy mi wtedy katalog views/localhost:3000/ , co może być źle ustawione ?[/quote]
Nie mam pojęcia.
Opcja expires_in działa tylko z memcached. Nie ma jednoznacznej odpowiedzi co jest lepsze. Opcji tej używa się raczej w sytuacjach kiedy możemy sobie pozwolić na wyświetlanie tego samego contentu (nawet jak coś się zmieni) przez pewien odcinek czasu. Zatem nie jest to zbyt dobra opcja do wyświetlania np. komentarzy, ale do boxu pt. “Top 10 wpisów” jak najbardziej.
[quote=Artur79]Żeby uniknąć pobierania danych które były potrzebne dla cachowanego fragmentu mam coś takiego, tak jest ok?
unless fragment_exist? 'newest_costam'
@newest_costam = Cos.costam.all(:include => :user, :limit => 10, :order => "publish_at DESC")
end
[/quote]
Chyba lepiej przekazać te same parametry które przekazujesz do metody cache w widoku. To czy zapytanie się wykonuje najlepiej sprawdzić w logach servera podczas developmentu.
Btw, polecam nie przesadzać z keszowaniem. To jest bardzo trudny temat i łatwo jest doprowadzić do bardzo skomplikowanej logiki keszowania i inwalidacji. Dopóki Twoja aplikacja działa dobrze bez keszowania to lepiej tego nie robić.
Sweepery albo cron joby do periodycznego czyszczenia kesza. Ten pierwszy wtedy gdy musisz wyczyścić kesz przy jakimś konkretnym zdarzeniu (ktoś dodać komentarz to czyścisz kesz dla fragmentu z komentarzami pod postem), ten drugi gdy masz powiedzmy te wspomniane “top 10 posts” i nie jest problemem żeby czyścić kesz np co godzinę, dwie albo raz o północy. Albo użyj memcache i wtedy możesz ustawić kiedy wygasa kesz :).
Benchmarkowałem page cache za pomocą linuxowego ab i bez cache było kilkanaście requestów na sekunde, z cache dochodziło do 800 dla tej samej strony. Chyba że czymś innym benchmarkować ?
[quote=Artur79]Inna sprawa, próbowałem dla cachowanego fragmentu ustawić jak w tutorialu action suffix:
<% cache(:action => 'recent', :action_suffix => 'all_prods') do %>
tworzy mi wtedy katalog views/localhost:3000/ , co może być źle ustawione ?[/quote]
Ten katalog jest domyślnie tworzony jako “views/nazwa_hosta” więc w trybie developerskim masz “localhost:3000” a na produkcji będzie “views/www.domena.com” etc. To normalne.
Możesz też po prostu nazwać dany fragment (przydaje się do keszowania fragmentów strony wyświetlanych w wielu miejscach w serwisie, fragmentów niezależnych od akcji/kontrolerów które je wołają, np. left_nav, menu …)
<% cache('left_nav') do -%>
<%= display_left_nav -%>
<% end -%>
Czyli w Twoim przypadku :action => ‘recent’, :action_suffix => ‘all_prods’ możesz najprawdopodobniej zamienić na cache(‘all_prods’) (tylko jeśli masz jeden fragment ‘all_prods’ i nie zależy on od akcji która go woła)
cachuje sobie jako fragment strony statycznej w mojej aplikacji. Nie mogę zcachowac całego widoku layoutu ponieważ w nagłówku sa inne elementy gdy użytkownik jest zalogowany. Kontroler wyglada tak:
end
end[/code]
Nie wiem dlatego ale w memcached klucz wyglada tak controller/static/regulamin, skad bierze się ta czesc ‘controller’ i jak to wywalic ? Chyba ze to normalne dla funkcji cache kontrolera ?