Railsy: Lighttpd czy Apache 2.2.x?

Opublikowane przez 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.

Posted in  | Tagi , , , ,  | 9 comments

Comments

  1. Avatar lopex powiedział about 24 hours later:

    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:

    upstream mongrel {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
    }
    location / {
            proxy_pass  http://mongrel;
            proxy_redirect     on;
    }
  2. Avatar Jarosław Zabiełło powiedział 1 day later:

    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"
  3. Avatar lopex powiedział 3 days later:

    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

  4. Avatar Jarosław Zabiełło powiedział 3 days later:

    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

    ab -n 100000 http://localhost/ 

    i prostej strony ze zdaniem “Hello World!”, wyniki mam nastÄ™pujÄ…ce:

    Apache: 4439 req/s
    Lighttpd: 7150 req/s
    Ngix: 8700 req/s. 
  5. Avatar hosiawak powiedział 6 days later:

    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.

  6. Avatar Jarosław Zabiełło powiedział 6 days later:

    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Ä….

  7. Avatar XANi powiedział over 2 years later:

    Niestety Lightowi czasami brakuje troche na funkcjonalności ale pod wzgledem pamięciożerności bije apacha na łeb ;] No chyba że ktoś ma nadmiar RAMu ale taki nadmiar lepiej wykorzystać chociażby na memcached. btw. jak robisz testy przez ab, testuj dla różnej wartości -c (concurrency, ile żądań na raz), jak robilem testy (tyle że na statycznych plikach) to lighty wyprzedzal ngixa przy wyższych wartościach (zreszta mam ten test na stronce)

  8. Avatar Jarosław Zabiełło powiedział over 2 years later:

    A ja dla odmiany trochÄ™ ostatnio wróciÅ‚em z częściÄ… aplikacji do Apache’a. Wszystkie aplikacje w Ruby chodzÄ… mi pod Passengerem. Ostatnio PHP też (wczeÅ›niej byÅ‚ Nginx i fastcgi ale mi czasem siÄ™ coÅ› gubiÅ‚y procesy – “odpadaÅ‚y” mi od mastera i zamieniaÅ‚y siÄ™ w zombie) PamiÄ™ci trochę mam, wiÄ™c ten argument nie jest najważniejszy.

  9. Avatar XANi powiedział over 2 years later:

    Jakby nie patrzeć pod wzglÄ™dem możliwoÅ›ci konfiguracji i dokumentacji apache bije wszystkie inne serwy, tyle że pliki statyczne sÅ‚uży wolniej (bo przy trzeÅ›ci dynamiczniej praktycznie nie ma różnicy) ale jak ktoÅ› naprawdÄ™ potrzebuje to zawsze może postawić reverse proxy albo oddzielny serwer do serwowania np. grafik. U siebie mam wiÄ™kszość na apachu, tylko 2 chodzÄ… na lightym (bo chciaÅ‚em devovi dać “oddzielne Å›rodowisko” a nie chciaÅ‚o mi siÄ™ zbytnio grzebac w apachu, no i jak coż bÄ™dzie nie tak z jednym to drugi caÅ‚y czas dziaÅ‚a).

(leave url/email »)

   Pomoc jÄ™zyka formatowania Obejrzyj komentarz