Ruby on Rails server variantları

Ruby on Rails proqramı üçün bir inkişaf serverinin yaradılmasının bütün problemi məni qarışdırır. WEBrick, Mongrel, Sərnişin, Apache, Nginx və bir çox digərləri var, amma əminəm ki, onlar oynadığı müxtəlif rolları başa düşmürəm.

Mən WEBrick istifadə etməyə başladım, indi isə Mongrel'i inkişaf üçün istifadə edirəm. Bu serverlər muxtar və ya Apache qarşısında otururlar?

Sərnişin haqqında oxudum və həqiqətən nə olduğunu başa düşmürəm, sayt "Ruby web tətbiqlərini asanlaşdırır" deyir, bu Mongrel əvəz edəcəkmi? Bu, web tətbiqlərini də tətbiq edən Capistrano kimi görünür?

Hesab edirəm ki, SSL-ni sınaqdan keçirmək istəmirəm və inanıram ki, mongrel dəstəklənmir, inkişaf serverinin ən yaxşı inkişafı nədir?

Təşəkkür edirik

511
06 нояб. pinqvin noyabr ayının 06- nə təyin edilib 2010-11-06 16:37 '10 at 16:37 2010-11-06 16:37
ответ 1 cavab

"Deployment" sözü kontekstdən asılı olaraq iki mənaya malik ola bilər. Apache / Nginx rollarını digər komponentlərin rolu ilə də qarışdırırsınız.

Tarixi qeyd: Bu yazı ilk dəfə Ruby proqram server ekosistemi məhdudlaşdırıldığı zaman 6 noyabr 2010-cu ildə yazılmışdır. Mən bu məqaləni 15 mart 2013-cü il tarixində ekosistemdə ən son yeniləmələrlə yeniləmişəm.

Disclaimer . Mən proqram serverlərindən biri olan Phuse Passenger-in müəlliflərindənəm.

Apache vs nginx

Hər ikisi veb serverlərdir. Statik fayllara xidmət edə bilərlər, ancaq - sağ modullarla - məsələn, dinamik web proqramlarına da xidmət edə bilərlər. PHP-də yazılmışdır. Apache daha populyar və daha çox xüsusiyyətlərə sahibdir, Nginx daha kiçik və daha sürətli və daha az xüsusiyyətə malikdir.

Apache və Nginx, Ruby web tətbiqləri ilə qutudan çıxa bilməz. Bunu etmək üçün Apache / Nginx-ni aşağıda təsvir edilən bir neçə əlavə ilə birlikdə istifadə etməlisiniz.

Apache və Nginx də əks istiqamətdə hərəkət edə bilər, yəni gələn HTTP sorğusunu qəbul edə bilər və onu da HTTP ilə danışan bir başqa serverə yönəldə bilər. Bu server HTTP cavabla cavab verəndə, Apache / Nginx müştəri cavabını yönləndirir; Daha sonra bunun nə üçün vacib olduğunu öyrənəcəksiniz.

Mongrel və WEBrick-ə qarşı digər istehsal tətbiq serverləri

Mongrel Ruby proqram serveridir. Konkret olaraq, bu, Mongrel'in bir tətbiq olduğunu ifadə edir:

  • Ruby proqramınızı öz proses sahəsinə yükləyir.
  • Xaricdəki dünya ilə ünsiyyət qurmağa imkan verən bir TCP socket quraşdırır (məsələn, İnternet). Mongrel bu socketdə HTTP istəklərini dinləyir və tələb məlumatlarını Ruby veb-proqramına göndərir.
  • Sonra Ruby web proqramı HTTP cavabının necə göründüyünü təsvir edən bir obyekti qaytarır və Mongrel faktiki bir HTTP cavabına (faktiki baytlara) çevrilməyə və onu socket vasitəsilə geri göndərməyə diqqət göstərəcəkdir.

Lakin, Mongrel çox köhnəlmişdir, hazırda isə artıq dəstəklənmir. Yeni alternativ tətbiq serverləri:

  • Füzyon sərnişin
  • Unicorn
  • İncə
  • Puma
  • Trinidad (yalnız JRuby)
  • TorqueBox (yalnız JRuby)

Onlara sonradan xəbər verəcəyəm və bir-birindən və Mongrel'den necə fərqləndiyini söyləyəcəyəm.

WEBrick Mongrel ilə eynidır, lakin fərqlər aşağıdakılardır:

  • WEBrick əvvəllər qeyd etdiyim hər şeydən fərqli olaraq istehsal üçün uyğun deyil. WEBrick tamamilə Ruby-də yazılmışdır. Mongrel (və digər Ruby proqram serverləri) Ruby və C hissəsidir (əsasən Ruby), lakin HTTP ayrıştırıcısı performans üçün C yazılır.
  • WEBrick yavaş və daha az etibarlıdır. Bəzi bilinən yaddaş sızıntıları və bəzi bilinən HTTP ayrıştırma problemləri var.
  • WEBrick, Ruby'də default olaraq etkinleştirildiğinden, genellikle yalnız tasarım zamanında bir varsayılan server olaraq istifadə olunur. Mongrel və digər tətbiq serverləri ayrıca quraşdırılmalıdır. Hero WEBrick'i varsayılan server olaraq seçmiş olsa da, WEBrick'i istehsal ortamlarında kullanmanız tövsiyə edilmir. Onlar İncə istifadə edirdilər, buna görə də onlar WEBrick-ə keçdiklərini bilmirlər.

Application Server və Dünya

Bütün mövcud Ruby proqram serverləri HTTP danışır, ancaq başqaları olmadıqda, bəzi ərizə serverləri port 80-də İnternetə açıq ola bilər.

  • İnternette birbaşa əldə edilə biləcək ərizəçilər: Phuse Passenger, Rainbows
  • İnternetə doğrudan açıq oluna bilməyən tətbiqlər: Mongrel, Unicorn, Thin, Puma. Bu proqram serverləri Apache və Nginx kimi əks proksi server arxasında yerləşdirilməlidir.
  • Trinidad və TorqueBox haqqında kifayət qədər məlumatım yoxdur, buna görə də onları buraxdım.

Niyə tətbiq serverləri əks proksiya üçün yerləşdirilməlidir?

  • Bəzi tətbiq serverləri hər bir proses üçün bir anda yalnız bir sorğu işlədə bilər. Eyni zamanda 2 sorğu işlədirmək istəyirsinizsə, hər biri eyni Ruby tətbiqinə xidmət edən ərizə serverinin bir neçə nümunəsini çalıştırmalısınız. Bu proqram server proseslərinin setinə tətbiq serverlərinin klasteri deyilir (dolayısı ilə Mongrel Cluster, Thin Cluster və s. Adı). Sonra bu küme üçün əks proxy server Apache və ya Nginx'i konfiqurasiya etməlisiniz. Apache / Nginx, kümelerdeki durumlar arasında isteklerin paylaşılmasına dikkat edecektir ("I / O modelleri eşzamanlılık" bölümünde bu konuda daha çox).
  • Veb server proqram serverini "yavaş müştərilərdən" qoruyan istək və cavabları buffer edə bilər - məlumatları çox tez göndərməyən və qəbul etməyən HTTP müştəriləri. Ərizə serverinizin hər hansı bir şey etməsini istəmirsiniz, müvəqqəti tam istək göndərməyi və tam cavab almasını gözləyirəm, çünki bu müddət ərzində ərizə server bir şey edə bilməyəcək. Apache və Nginx eyni zamanda çox şeyləri çox yaxşı edirlər, çünki onlar çox yivli və ya maraqlıdır.
  • Proqram serverlərinin çoxu statik fayllara xidmət edə bilər, lakin bu xüsusilə yaxşı deyil. Apache və Nginx bunu daha sürətli edə bilər.
  • İnsanlar adətən statik faylları istifadə etmək üçün Apache / Nginx'i konfiqurasiya edir, lakin statik faylları tətbiq serverinə uyğun olmayan istəkləri yönəldir, bu, yaxşı bir təhlükəsizlik tətbiqidir. Apache və Nginx çox yetkindir və proqram serverini (ehtimal ki, zərərli) pozulmuş istəklərdən qoruya bilər.

Bəzi tətbiq serverləri niyə internetə birbaşa açıq ola bilər?

  • Fusion Passenger digər tətbiq serverlərindən tamamilə fərqli bir heyvandır. Unikal xüsusiyyətlərindən biri veb serverə inteqrasiya olunur.
  • Yazar Rainbows açıq şəkildə İnternetdə birbaşa yayımlamaq təhlükəsiz olduğunu bildirdi. Müəllif HTTP parserində (və s.) Heç bir zəiflik olmadığına əmin olur. Lakin, müəllif heç bir zəmanət vermir və istifadənin öz riski olduğunu söyləyir.

Ərizə serverlərinin müqayisəsi

Bu bölmədə, qeyd etdiyim tətbiqi serverlərin əksəriyyətini müqayisə edəcəyəm, ancaq Fusion Passenger deyil. Füzyon Sərnişin qalan hissədən ayrılmış bir məxluqdur, buna xüsusi bir hissə verdim. Mən Trinidad və TorqueBox da qaçırdım, çünki mən onları kifayət qədər yaxşı tanıyıram, amma JRuby istifadə edirsinizsə, yalnız əhəmiyyətlidir.

  • Mongrel olduqca çılpaq idi. Daha əvvəl də qeyd edildiyi kimi, Mongrel təmiz bir təkli yivli multiprocessdir, belə ki, yalnız bir qrupda faydalıdır. Prosesin monitorinqi yoxdur: əgər klasterdə baş verən proses (məsələn, tətbiqdə bir səhv üzündən) qəza baş verərsə, əl ilə yenidən başlamalıdır. İnsanlar Monita və Allah kimi xarici proses monitorinq vasitələrindən istifadə edirlər.
  • Unicorn bir Mongrel çəngəldir. Məhdud prosesin monitorinqini dəstəkləyir: bir proses uğursuz olarsa, master prosesi avtomatik olaraq yenidən başladır. Bütün proseslər hər bir proses üçün ayrı bir yuva yerinə bir ümumi yuva dinləməyə məcbur edə bilər. Bu, əks proxy konfiqurasiyasını asanlaşdırır. Mongrel kimi, bu təmiz bir təkli yivli multiprocessor.
  • Slim , EventMachine kitabxanasını istifadə edərək I / O modelini istifadə edir. Mongrel HTTP parserini istifadə etməklə yanaşı, Mongrel'e heç bir əsas yoxdur. Cluster rejimində monitorinq prosesi yoxdur, belə ki, uğursuzluqları yoxlamaq lazımdır. Tək bir universal yuva yoxdur, buna görə hər proses öz yuvasında dinləyir. Teorik olaraq, İnce I / O modeli yüksək bir paralellik üçün imkan verir, lakin İncə istifadə edilən ən praktik hallarda, bir incə proses yalnız bir dəfə eyni zamanda tələb edə bilər, belə ki, hələ bir qrup lazımdır. Bu möhtəşəm əmlak haqqında "Müsahibə I / O Modellər" bölməsində oxuyun.
  • Puma da Mongrel dən dallanmış, lakin Unicorn fərqli olaraq, Puma tamamilə çox yivli olmaq üçün nəzərdə tutulmuşdur. Buna görə də, hazırda quraşdırılmış küme dəstəyi yoxdur. Bir neçə nüvədən istifadə edə biləcəyinizə əmin olmaq üçün əlavə qayğı göstərməlisiniz (daha ətraflı məlumat üçün "I / O Eşzamanlama Modelleri" bölümüne baxın).
  • Rainbows müxtəlif kitabxanaları istifadə edərək bir neçə paralellik modelini dəstəkləyir.

Füzyon sərnişin

Phuse Passenger hər kəs kimi işləmir. Fusion Passenger Apache və ya Nginx-ə birbaşa inteqrasiya edir və Apache üçün mod_php ilə müqayisə edilə bilər. Mod_php, Apache'nin PHP tətbiqlərinə demək olar ki, sehrli bir şəkildə xidmət etməsinə imkan verir ki, Phuse Passenger Apache (və həmçinin Nginx!) Ruby proqramları ilə demək olar ki, sehrli şəkildə işləməyə imkan verir. Füzyon Sərnişininin məqsədi ən az problem yarada bilməkdir (Tm).

Fusion Passenger istifadə edərək, proses / kümelenmeyle statik faylları və / və ya proksi istəklərini geri vermək üçün Apache / Nginx'i tətbiqinizə və prosesinizə başlamaq üçün bir proses və ya klaster yaratmaq yerinə ehtiyacınız var:

  • Veb server konfiqurasiya faylını düzəltmək və ictimai Ruby proqram qovluğunuzun yerini təyin edirsiniz.
  • 2 addım yoxdur.

Bütün konfiqurasiya web server konfiqurasiya faylında aparılır. Füzyon Sərnişin demək olar ki, hər şeyi avtomatlaşdırır. Bir qrupu idarə etmək və prosesləri idarə etmək lazım deyil. Proseslərin başlanğıc / dayandırılması, başarısızlıqla yenidən başlanması və s. - hər şey avtomatlaşdırılmışdır. Digər proqram serverlərinə nisbətən, Fusion Passenger çox az hərəkət edən hissələrə malikdir. Bu istifadə rahatlığı insanlar Phuse Passenger istifadə əsas səbəblərindən biridir.

Bundan başqa, digər proqram serverlərindən fərqli olaraq, Phusion Passenger əsasən C ++-da yazılır və bu da çox sürətli olur.

Fusion Passenger-dən avtomatik yeniləmə, çox işləmə dəstəyi, yerləşdirmə səhv toleransı və s.

Yuxarıda göstərilən səbəblərdən ötəri, Phuse Passenger hazırda New York Times, Pixar, Airbnb və s. Kimi əsas saytlar da daxil olmaqla, 150,000-dən çox web saytı olan ən məşhur Ruby proqram serveridir.

Phuse Passenger və digər tətbiq serverləri

Fusion Passenger bir çox xüsusiyyətləri təmin edir və digər proqram serverləri kimi bir çox üstünlük təklif edir:

  • Trafikə əsaslanan proseslərin sayını dinamik şəkildə tənzimləyin. Biz qaynaqlı məhdud serverimizdə bir neçə saatlıq Rails tətbiqini işə salırıq, bu da ictimaiyyətə aid deyildir və təşkilatımızdakı insanlar gündə bir neçə dəfə istifadə etməyəcəklər. Gitlab, Redmine və s. Kimi şeylər. Fusion Passenger, istifadə edilmədikdə bu prosesləri sıxaraq, daha əhəmiyyətli tətbiqlər üçün daha çox resurs istifadə etməyə imkan verən istifadə edildikdə onları yerləşdirə bilər. Digər proqram serverləri ilə bütün proseslər hər zaman açıqdır.
  • Bəzi tətbiq serverləri müəyyən iş yükü dizaynı üçün uyğun deyil. Məsələn, Unicorn yalnız sürətli istəklər üçün nəzərdə tutulub: Unicorn veb -saytına "Bəzi hallarda pis olsun" bölməsində baxın .

Unicorn istifadə edə bilməyən iş yükləri aşağıdakılardır:

  • Axın iş yüklərinin axını (məsələn, Axınlar Rails 4 və ya Rails 4 axınları).
  • Bir tətbiqin HTTP API çağırışlarını etdiyi iş yükü.

Fusion Passenger Enterprise 4 və ya daha sonra hibrid I / O modeli bu iş yükü üçün əla seçimdir.

  • Digər proqram serverləri istifadəçiyə hər bir tətbiq üçün ən azı bir nümunə göstərməsini tələb edir. Buna fərqli olaraq, Phuse Passenger bir nüsxədə birdən çox proqramı dəstəkləyir. Bu, inzibati xərcləri böyük ölçüdə azaldır.
  • Avtomatik istifadəçi keçid, rahat təhlükəsizlik xüsusiyyətidir.
  • Fusion Passenger çox MRI Ruby, JRuby və Rubinius'u dəstəkləyir. Mongrel, Unicorn və Thin yalnız MRI dəstəkləyir. Puma da bütün 3ü dəstəkləyir.
  • Füzyon Sərnişin əslində Ruby'den daha çoxunu dəstəkləyir! Həm də Python WSGI-ni dəstəkləyir, məsələn Django və Flask proqramlarını işə sala bilər. Əslində, Phuse Passenger polyglot serverinin formalaşmasına doğru hərəkət edir. Node.js vəzifəsi siyahısında.
  • Qeyri-bant zibil toplama. Fusion Passenger, normal istek / cavab döngüsünün dışında Ruby çöp toplayıcısını çalıştırabilir, istek zamanını yüzlerce milisaniyede potensial olaraq azaltabilir. Unicorn da oxşar funksiyaya malikdir, lakin Fusion Passenger versiyası daha çevikdir, çünki 1) GC ilə məhdudlaşmır və özbaşına iş üçün istifadə edilə bilər. 2) Phuse Passenger versiyası çox yivli tətbiqlərlə yaxşı işləyir, lakin Unicorn deyil.
  • Avtomatik yenidən başladın. Unicorn-a və digər serverlərə yenidən başlanması bəzi scripting işlərini tələb edir. Füzyon Sərnişin Tərəfi bu yolu sizin üçün tamamilə avtomatlaşdırır.

Daha çox xüsusiyyət və faydalar var, ancaq siyahı həqiqətən çoxdur. Məlumat üçün Phuse Passenger kitabına (tam versiya Apache , Nginx versiyası ) və ya Phuse Passenger saytına müraciət etməlisiniz .

Eşzamanlılıq giriş / çıxış modelləri

  • Tək yivli multiprocessor. Ruby ekosistemindəki çox işıqlı dəstək çox zəif olduğundan, bu ənənəvi olaraq Ruby proqram serverləri üçün ən məşhur I / O modelidir. Hər bir proses bir anda tam olaraq 1 sorğu işlədə bilər. Veb server yükü proseslər arasındakı səviyyədir. Bu model çox etibarlıdır və proqramçı eşzamanlılıq səhvlərini tətbiq etmək şansı azdır. Bununla birlikdə, giriş / çıxış paralelliyi çox məhduddur (proseslərin sayı ilə məhdudlaşır). Bu model sürətli və qısa iş yükü üçün çox münasibdir. Məsələn, yavaş və uzunmüddətli blokaj G / Ç iş yükü üçün çox yararsızdır. HTTP API çağırışı ilə əlaqəli iş yükləri.
  • Purely multi-threaded. Hal-hazırda, Ruby ekosistemi əla çoxşəkilli dəstəyə malikdir, beləliklə, bu I / O modeli çox canlıdır. Multithreading yüksək səviyyədə I / O paralelliyi təmin edir, bu da qısa və uzun müddətli I / O iş yüklərinə uyğun gəlir. Programcı, paralellik səhvlərini təqdim etmək ehtimalı daha çoxdur, lakin xoşbəxtlikdən ən çox veb çərçivələri hələ də mümkün olmayacaq şəkildə hazırlanıb. Qeyd etmək lazımdır ki, MRI Ruby tercümanı Global Tərcüməçi Qulağının (GIL) istifadəsi səbəbindən çoxlu mövzuya baxmayaraq çoxlu prosessor nüvələrini istifadə edə bilməz. Hər bir proses CPU nüvəsini istifadə edə bilməsi üçün birdən çox işlənmiş proseslərdən istifadə edərək bu barədə məlumat əldə edə bilərsiniz. JRuby və Rubinius'un GIL yoxdur, beləliklə bir prosesdə birdən çox nüvədən tam istifadə edə bilərlər.
  • Hybrid multi-threaded multiprocessor. . İlk növbədə Phuse Passenger Enterprise 4 və daha sonrakı versiyaları həyata keçirilmişdir. Birdən çox yivli multiprocessing, tamamilə çox yivli və ya birdən çox mövzu ilə bir çox proseslər arasında asanlıqla keçə bilərsiniz. Bu model hər iki dünyanın ən yaxşısını verir.
  • Hadisə . Bu model əvvəllər göstərilən modeldən tamamilə fərqlənir. Bu, çox yüksək səviyyədə I / O bərabərliyini təmin edir və bu səbəbdən I / O iş yüklərinin uzun müddətli maneə törətməsində əla olar. Onu istifadə etmək üçün tətbiq və çərçivə üçün açıq dəstək tələb olunur. Lakin Rails və Sinatra kimi bütün əsas strukturlar hadisənin kodunu dəstəkləmirlər. Buna görə də, praktikada, incə proses bir zamanda birdən çox sorğu işləməyəcək və bu, tək-işıqlı multiprocess modeli kimi effektiv edir. Cramp kimi I / O imkanlarını istifadə edə biləcək xüsusi qurumlar var.

Son zamanlar, Fusion blogunda iş yükünüz üçün proseslərin və mövzuların optimal şəkildə tənzimlənməsi barədə bir məqalə dərc edilib. Füzyon Sərnişin Eşzamanlama variantlarını qurma baxın.

Capistrano

Capistrano tamamilə fərqli bir şeydir. Bütün əvvəlki bölmələrdə "yerləşdirmə", Ruby tətbiqini bir tətbiq serverinə buraxma hərəkətini nəzərdə tutur, belə ki, ziyarətçilərə çatdırıla bilər, lakin bu baş verməzdən əvvəl, adətən bir sıra hazırlıq işlərini görməlisiniz, məsələn:

  • Proqram kodunu və Ruby fayllarını server maşınına yükləyin.
  • Tətbiqinizdən asılı olan kitabxanalar quraşdırın.
  • Verilənlər bazasını konfiqurasiya və ya köçür.
  • Ərizənizi başlayan və dayandırdıran hər hansı bir şəxs, məsələn, Sidekiq / Resque işçiləri və ya başqa bir şeyə etibar edə bilər.
  • Ərizənizi qurarkən yerinə yetirilməli olan digər tədbirlər.

Capistrano kontekstində "yerləşdirmə" bütün bu hazırlıq işlərini yerinə yetirmək deməkdir. Capistrano bir tətbiq server deyil. Bunun əvəzinə bütün hazırlıq işlərini avtomatlaşdırmaq üçün bir vasitədir. Siz Capistrano-a serverinizin olduğu yerdən və ərizəinizin yeni versiyasını yerləşdirdikdə hər dəfə çalıştırmanız üçün lazım olan əmrləri izah edəcəyik və Capistrano, Rails tətbiqini serverə yükləməyinizə və göstərdiyiniz əmrləri işlətməyə kömək edəcəkdir.

Capistrano həmişə bir proqram server ilə birlikdə istifadə olunur. Proqram serverlərini əvəz etmir. Bunun əvəzinə tətbiq serverləri Capistrano əvəzsizdir, onlar Capistrano ilə birgə istifadə edilə bilər.

Əlbəttə ki, Capistrano istifadə etmək lazım deyil. Если вы предпочитаете загружать свое приложение Ruby с FTP и вручную запускать одинаковые действия с командами каждый раз, вы можете это сделать. Другие люди устали от этого, поэтому они автоматизируют эти шаги в Капистрано.

1171
ответ дан Hongli 06 нояб. '10 в 17:50 2010-11-06 17:50

Другие вопросы по меткам или Задайте вопрос