進度條

Nginx / Apache 與 Phusion Passenger 還有 Ruby On Rails的關係

更新日期:

首先要先知道的是

網站的根本是別人的電腦來跟你的電腦要資料

無論你的電腦是雲端VPS還是實體電腦

 

 

電腦之間溝通的方式有很多種,例如各種的通訊協定RS232、USB、網路TCP

在TCP(Transmission Control Protocol)這個協定上再進階的規定其中之一就成了HTTP,

如果HTTP加上SSL加密就是HTTPS 。

 

 

當別人的電腦透過TCP訪問你的電腦時,使用的是IP這個概念,也就是你的地址

但是來的人不一定是HTTP的方式訪問,所以一般規定80是http,443是Https

 

 

以下用一個簡單的口語化表達方便大家理解

ip是你的地址,port號是這地址的門。

不是所有門都是開啟的 每個開啟的門都會有一個櫃檯服務

你的Rails就是那個服務,

但是預設http 80 port 和 https 443 port 並沒有跟Rails連上

你可以自己寫程式連,也可以用現成的Nginx / Apache http server(以下簡稱Apache)讓他們幫你連

因為這門沒事會有歹徒或是奧客衝進來

所以讓他們幫你服務會比較輕鬆一些

 

 

其中因爲Nginx / Apache 是通用型的Http web server,

要跟rails對應有一些麻煩,如果要跟他們(Nginx / Apache)溝通必須實作CGI (Common Gateway Interface)。

所以這裡我們利用現成的(Phusion)Passenger來做中間的橋樑。

Passenger也可以直接使用,但是目前官網上只支援Ruby On Rails / Python / NodeJS

我們開發中所下的rails server,在Rails 5是打開Puma這隻Web server程式,

他有實作CGI,並且可以讀懂Rails的產出。

因此不使用Passenger改用其他的Web server是可行的。

實作最簡單的CGI與Apache溝通可參考這篇

另外,在Ruby中,比較常見以Rack去實現CGI

 

 

補充:What is Rack
快速解答:Rack is a nice Ruby-fied replacement for CGI.
Rack是CGI的取代品,但也向下相容CGI。
(小心,這些名詞都有相對應的Ruby module,但可能與原本的意思不一樣,
程式語言開發者很容易中這樣的陷阱,Nginx與Apache本體根本不認識Rack,
(畢竟不是只支援Ruby,例如PHP / Python)
所以Ruby的Rack必須要符合CGI,而非符合Ruby 的CGI API)

 

 

Nginx / Apache 其實讀不懂你Rails在寫什麼,他只讀得懂HTML相關的檔案與CGI溝通的資訊。

所以對於靜態的檔案處理能力比較優秀。

(就算是PHP也要加上外掛模組處理才能處理)

本篇不討論其差異

可以看Digital Ocean的文章

https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations

 

 

另外一提的是,當你的Nginx / Apache 接管了port

你的Rails就變成下一層

有點像是Nginx是門口櫃檯

他如果想把任務派送給其他程式是可以的(例如第二個Rails或是你還有PHP或Python站台之類的)

以Nginx為例

Nginx -> Passenger -> Rails

但它也可以直接 Nginx -> 其他的服務

這就看你Nginx怎麼設定