Rails、Nginx、Passenger、bundle,這幾者是怎麼協作的?

想問一直這幾者是怎麼樣的一種方式來工作的,他們又各自負責什麼部分呢?


Bundle是Gem包的依賴管理工具,RubyGem本身有依賴管理為何還要Bundle呢?有時候兩個gem雖然都依賴於同一個gem,但是卻是依賴不同的版本,這時候bundle就能幫助進行依賴計算。並且在部署的時候,能將不同app所需的一系列gem打包起來分開管理,就不至於污染整個系統的gems源。開發人員在Gemfile中指定所需的gem和版本等信息,然後bundle會計算出所有依賴的gem,並安裝

Rails的接受請求的模型是一個進程處理一個請求。單個進程效率比較低,所以為了處理比較高的並發,會開啟多個進程

nginx是一個高性能的web伺服器,本身和ruby沒有關係,由於nginx處理鏈接和靜態文件的性能非常好,所以一般在Rails之前放上nginx接受客戶端請求,並分發給後端的Rails進程。

Passenger是一個Rails應用服務的管理工具,可以統一管理Rails進程的數量、生命周期、請求隊列等等。

nginx啟動的時候會啟動Passenger,passenger根據配置引導rails應用,rails啟動的時候會調用bundle載入rails應用所需的gems


引用於略曉網 張志回答: http://luexiao.com/questions/3313676083083470

看了一下在這個問題在知乎的回答和之前xxd的回答,很詳盡,我再補充一下吧

Bundler主要是用來處理rails application的以來關係,同時使得每一個rails applicaton之間的環境相互獨立,

Bundler的出現之前,大多使用gemset來管理gem包,Bundler出現之後,由於其易用,方便,為很多rails開發者使用,現在比較常用的方法是用Bundler來管理Gem包,用rvm來管理ruby版本.

Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 伺服器,其處理靜態鏈接性能優越,補充一下grid-fs模塊,其對Mongodb提供了良好的支持,而且容易配置:

location /gridfs/ { gridfs my_app field=filename type=string; mongo 127.0.0.1:27017; }

passenger主要用來管理Rails進程,不過對於passenger接觸的不是很多,平時用的都是Unicorn。

關於處理流程和協作:

引用自Github

nginx sends requests directly to the Unicorn worker pool over a Unix Domain Socket (or TCP, if you prefer). The Unicorn master manages the workers while the OS handles balancing, which we』ll talk about in a second. The master itself never sees any requests.

對於兩者的性能分析請參見Mongrel vs. Passenger vs. Unicorn


rails - Web應用框架

nginx - 反向代理

passenger - rails http 服務

bundle - gem包管理程序


推薦閱讀:

nginx 基本入門
Nginx結合Tomat8負載均衡,利用Redis實現Tomcat8的session共享
歪果仁吐槽國內開源,勢態將逆轉還是惡化?
淺談前端線上部署與運維
Nginx 多進程模型是如何實現高並發的?

TAG:RubyonRails | Nginx | PhusionPassenger |