Kombo nginx + unicorn

Co prawda nie mam railscasts Pro, ale zaciekawił mnie jeden komentarz:
http://railscasts.com/episodes/293-nginx-unicorn?view=comments

[quote]Matt Freels says
Unicorn can restart your app without any lost requests or stalls.
Passenger drops your app and its workers, and then lets the next request bring the new version up.

I would say the biggest difference is that where Passenger is opinionated and fairly all-or-nothing, Unicorn gives you more transparency and control over its configuration (while still nicely managing workers).[/quote]
Bawił się ktoś unicornem?
Czy to zwróci true? -> (unicorn > passenger)

Ja używam unicorn wszędzie, działa świetnie. Nginx + unicorn na socketach super połączenie

Hmm twitter też stoi na unicornie:
http://news.ycombinator.com/item?id=1230648

Ba, nawet prezkę na WRUGu o nim robiłem – http://wrug.eu/2010/02/03/nagrania-z-wczorajszego-spotkania/
Byliśmy zmuszeni do Unicorna dokładnie z tego powodu: aplikacja nie mogła mieć downtime’ów w związku z restartem.

Wszystko zależy od tego jakie masz potrzeby, passenger też ma swoje zalety. To co mogę powiedzieć na pewno, to fakt, że passeger lite działa kiepsko (albo coś robię źle), bo podczas deployów przy proxy w apachu serwis leży aż nie wystartuje nowa instancja.

Wymień je or didnt happen. :slight_smile:

  • nie potrzebujesz nic zewnętrznego do monitorowania
  • prostsza konfiguracja
  • możliwość wybrania trybu spawnowania nowych procesów (w unicornie to jest fork, z różnych przyczyn czasami jest potrzeba “conservative” z passengera)

jeszcze dodam, że samo trzymanie nginx + unicorn na systemach bsd daje spory boost przy dużym ruchu ze względu na wydajność unixowych socketów

Drogus: na dwoje baba wróżyła:

Trzeba przyjąć założenie: albo mamy monitoring, albo nie mamy go wcale. Rozumiem, że masz tu na myśli to, że passenger domyślnie startuje aplikacje przy pierwszy requeście. Tak jak passenger ma swojego zarządcę do workerów, dzięki czemu “apache podnosi” procesy passengera tak samo unicorn ma swój proces master, który robi forki z workerami, którymi zarządza. I jedno i drugie może się wysypać.

Swoją drogą bardziej od tego, że mi wyleci unicorn boję się, że ktoś co bardziej pomysłowy wyda update rubygems, rvm lub rails i będę mięc problemy w stylu:

;)))

Zauważ, że aby odpalić passengera (mówimy o konfiguracji jako moduł do nginx lub apache) musimy zbudować/skompilować moduł do serwera www :slight_smile:
W przypadku unicorna odpalamy tylko daemona i dodajemy konfigurację, aby proksować na socket unicorna.
No dobra, tu już się czepiam trochę :wink: … co nie zmienia faktu, że uważam, że konfiguracja jest równie prosta

Jako ważną kwestię można poruszyć bezpieczeństwo. Master proceses działa jako root, dopiero workery są robione jako setuid(), więc teoretycznie istnieje prawdopodobieństwo wyexplojtowania tego, a jak wiadomo taki apache jest tak bezpieczny jak jego moduły, z których korzysta :slight_smile:
W przypadku unicorna tego problemu nie mamy.

Podaj przykład :slight_smile:
Chociaż swoją drogą ruby i współbieżność… 3;)
Dla przykładu do teraz w 1.8.7 nie poprawili błędu z serializowaniem Marshalem w wątkach:

[code]require ‘thread’
require ‘socket’

Thread.abort_on_exception = true

threads = []
rcv,snd = IO.pipe

threads << Thread.new do
obj = (‘a’…‘z’).inject({}){|h,s|h[s.intern]=s*1024;h}
data = Marshal.dump(obj)
snd.write(data[0,data.size/2])
sleep(1)
snd.write(data[(data.size/2)…-1])
end

threads << Thread.new do
lock = Mutex.new
lock.synchronize do
Marshal.load(rcv)
end
end

threads << Thread.new do
100.times do
GC.start
end
end

threads.map{|t| t.join}[/code]
… i po odpaleniu mamy

[code][BUG] Segmentation fault
ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]

Aborted[/code]
No dobra, ale aby nie offtopować. Też uważam, że unicorn daje radę, choć w wielu przypadkach nie robi różnicy nginx + passenger, czy nginx + unicorn.

Kombo nginx + unicorn obsluguje wiele Ruby przez RVM? np 1.9.2, 1.8.7 itd

Pewnie, a czemu miałoby nie obsługiwać? nginxa przecież nic nie obchodzi gdzie proksuje ruch :wink:

Lubie zapach napalmu o poranku…

Raczej żuci wyjątkiem NoMethodError: undefined method `>’ for #Unicorn:0x0031337

Chodziło mi o to że Passenger jest ograniczony do jednej wersji Ruby.
Czy takie same ograniczenia ma Unicorn.

Anyway… good to know. :wink:

Chodziło mi o to że Passenger jest ograniczony do jednej wersji Ruby.
Czy takie same ograniczenia ma Unicorn.

Anyway… good to know. ;)[/quote]
Passenger jest pluginem do apacha, a na unicorna tylko lecą requesty poprzez proxy (z apacha lub nginxa), stąd ta różnica.

No to w takim razie jak instaluje passengera na nginx’a, to nginx jest od nowa kompilowany z passengerem?

Raczej jako osobny moduł. http://www.evanmiller.org/nginx-modules-guide.html

Krótka odpowiedź: tak.

(a Paweł jest ciapa, bo jest to nawet opisane w linku który podał, rozdział 6. :stuck_out_tongue: )

Pewnie źle zrozumiałem pytanie :wink: PEBCAK z mojej strony

Czy na developmencie unicorn też tak zamula jak passenger?
Chodzi mi o to że jeśli aplikacja przez dłuższy czas nie łapała requesta, to po prostu jest spawnowana od zera (tak jest w passengerze).
Zajmuje to dość dużo czasu(IMHO, nie chce mi się czekać 5-10s na odpowiedź aplikacji).

Pytam z ciekawości, nie mam zamiaru zaorać cały VPS żeby zyskać parę sekund. :wink:

[quote=Matthias]Czy na developmencie unicorn też tak zamula jak passenger?
Chodzi mi o to że jeśli aplikacja przez dłuższy czas nie łapała requesta, to po prostu jest spawnowana od zera (tak jest w passengerze).
Zajmuje to dość dużo czasu(IMHO, nie chce mi się czekać 5-10s na odpowiedź aplikacji).

Pytam z ciekawości, nie mam zamiaru zaorać cały VPS żeby zyskać parę sekund. ;)[/quote]
Ustaw sobie “PassengerMinInstances 1” i po kłopocie.