Railsy: Lighttpd czy Apache 2.2.x?
Posted by Jarosław Zabiełło Sun, 29 Oct 2006 14:53:00 GMT
OdnoÅ›nie użycia Railsów w celu produkcyjnym, dużo siÄ™ zmieniÅ‚o od czasu pojawienia siÄ™ Mongrela – maÅ‚ego, ale dosyć szybkiego serwera napisanego w Ruby i C. NastÄ™puje generalne odejÅ›cie od podpinania kilku procesów FastCGI do Rubiego z różnych powodów. W drugim wydaniu Agile Web Development in Rails autorzy przyznali, że próbowali różnych opcji użycia moduÅ‚u FastCGI. Zawsze ostatecznie byÅ‚y jakieÅ› problemy.
Aktualnie zalecanym podejściem jest użycie szybkiego serwera HTTP (Lighttpd, Apache lub LiteSpeed) na froncie do obsługi statycznych plików (głównie obrazki, style kaskadowe i pliki Javascript). Aplikację RoR należy uruchomić za pomocą kilku procesów Mongrela (nie jak wcześniej: kilka procesów FastCGI). A tym, co zepnie je z serwerem HTTP jest moduł rozkładający ruch (load balancing).
Niestety, okazało się że w wypadku Lighttpd ten moduł zawiera błędy. Z kolei nowy Apache 2.2 posiada dobrze działający moduł load balancingu. Spowodowało to zrezygnowanie przez wielu z Lighttpd na rzecz nowego Apache 2.2.x.
Z racji tego, że mam trochÄ™ swobody w doborze technologii w pracy, postawiÅ‚em serwer na nowym Apache’u. Aplikacje Railsów podpinamy za pomocÄ… mongrela i wbudowanego w Apache moduÅ‚u load_balancer. DziaÅ‚a faktycznie sprawnie.
Czy to znaczy, że Lighttpd nie ma sensu używać? SkÄ…d! W wersji 1.5 majÄ… już mieć naprawiony moduÅ‚ load balancingu. Ale nawet i bez tego, istnieje bardzo dobry, maÅ‚y i szybki load balancer – Pound. Skuszony jednak potrzebÄ… eksperymentowania oraz nabytym niedawno serwerem dedykowanym (w miejsce wczeÅ›niejszego VPS’a) postanowiÅ‚em przenieść wszystkie swoje prywatne serwisy (a jest tego sporo) z Lighttpd do Apache 2.2.3. MusiaÅ‚em przenieść dwie aplikacje Rails, dwie aplikacje Django, dwie aplikacje PHP 5.1 oraz jednÄ… duża aplikacjÄ™ Zope/Plone. I jak wrażenia?
Otóż, po 2 tygodniach używania, stwierdziłem, że to nie ma sensu. Apache pożera za dużo pamięci. Dzieje się dokładnie tak, jak pisałem wcześniej. Nie mogłem użyć trybu wielowątkowego, nie tyle ze względu na PHP ale ze względy na Django! Napisali bowiem, że nie należy tego trybu używać w wypadku ich frameworka. Django nie jest wielowątkowy. Musiałem więc przełączyć Apache z trybu worker na prefork. Zgodnie z obawami, każdy fork musiał marnować pamięć na moduł mod_php i mod_python nawet jak to nie ma sensu (np. podczas obsługi obrazków). Na dodatek nie mogłem coś uruchomić jednej aplikacji Django. Kompletnie nie wiem dlaczego. Druga była prawie identycznie skonfigurowana i działała.
Wróciłem zatem z powrotem do Lighttpd , Pounda i Mongrela (dla RoR) i FastCGI (dla Django i PHP). Efekty były bardzo widoczne: zwolniło mi się ponad 200 MB pamięci. Może to nie ma znaczenia w pracy, gdzie mamy 2GB ale ja mam tylko 1GB i muszę jeszcze uruchomić zasobożerny Plone.
DokÅ‚adniej wszystkie sprawdzone i dziaÅ‚ajÄ…ce konfiguracje opiszÄ™ w powstajÄ…cej książce o Railach. Moja ostateczna konlkluzja jest taka: jeÅ›li zależy ci na oszczÄ™dzeniu pamiÄ™ci – wybieraj Lighttpd. JeÅ›li nie jest to kluczowa sprawa, a potrzebujesz jakieÅ› specjalne, dodatkowe moduÅ‚y (których Apache ma peÅ‚no) nowy Apache 2.2 speÅ‚ni twe oczekiwania.


Kanały IRC![[Dilber w Onecie]](/images/larry.png)


jeśli chodzi o wydajność i pamięć to nic nie może konkurować z http://nginx.net/
ma pełno wbudowanych modułów, rewelacyjną konfigurację, jest bardzo stabilny i się bardzo szybko rozwija
konfiguracja dla mongrela wyglÄ…da tak:
Być może to i dobry projekt. Lecz ja bym się trochę obawiał użycia takiego mało popularnego (i tym samym słabo wytestowanego produkcyjnie) rozwiązania. Jak byś w tym serwerze zrobił proxy tego typu?
RewriteRule "^/(.*)$" "http://host:9876/VirtualHostBase/http/host:80/plone/VirtualHostRoot/$1"pop prostu: rewrite ^/(.*)$ http://host:9876/VirtualHostBase/http/host:80/plone/VirtualHostRoot/$1
dokumentacja jest pod: http://wiki.codemongers.com/NginxHttpRewriteModule
Serwer ten jest raczej dobrze wytestowany i zachowuje się lepiej niż apache, zwłaszcza przy bardzo dużym ruchu. Dużym atutem apacha są oczywiście moduły ale dla nginx też ich nie brakuje: http://wiki.codemongers.com/Nginx
Jak znajdę czas, przyjrzę mu się dokładnie. Przed chwila na swoim dedyku (Athlon64 3000+ i Ubuntu x64) odpaliłem porównania. Użyłem skompilowanych ze źródeł Apache 2.2.3, Lighttpd 1.4 i Nginx 0.4.12.
Dla
i prostej strony ze zdaniem “Hello World!”, wyniki mam nastÄ™pujÄ…ce:
Nginx staje siÄ™ ostatnio bardzo popularny na zachodzie, głównie za sprawÄ… bardzo maÅ‚ej zasobożernoÅ›ci i dużej liczby dostÄ™pnych modułów. Ponoć jest już w użyciu dosyć dÅ‚ugi czas w Rosji skÄ…d pochodzi na jakimÅ› bardzo ruchliwym serwerze – uważany jest za bardzo stabilny. Statystyki mówiÄ…, że obsÅ‚uguje już ponad 90,000 domen – wystarczajÄ…co dużo, żeby uznać go za stabilny. Poza tym ostatnio ulubiony serwer Ezry ;)
Co do tej małej zasobożerności to prawda. Zrobiłem prosty test na statycznej stronie, 100,000 requestów i load nawet nie osiągnął 100% tylko oscylował na poziomie 70-80%. Wygląda bardzo zachęcająco, świetnie nadaje się jako load balancer dla clustera mongrelów i do serwowania statycznych plików.
WÅ‚aÅ›nie próbujÄ™ zmienić Lighty na Nginx’a. Problem w tym, że mam nie tylko RoR ale także PHP, Django i Zope i to wszystko musi dobrze dziaÅ‚ać. Nie tylko dlatego, że Nginx jest szybszy. CoÅ› mi ostatnio Lighty dziwnie siÄ™ zachowuje. MuszÄ™ go restartować, bo po jakimÅ› czasie ma problemy z odpowiedziÄ….