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
快速解答: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怎麼設定