[Ruby on Rails] Rails Puma + Nginx 的組合

Veck
3 min readAug 7, 2018

首先要認識一下兩者分別是什麼東西:

* Puma 是一個專為 Rails 設計的高併發 web server
* Nginx 是一個廣泛使用的 reverse proxy
這個時候可以去查一下什麼事 reverse proxy,就可以發現一張圖說明了兩者之間的關係

所謂的反向代理,是在 server-side 根據 client-side 的 request,向後端的 web server 取得資源,然後再將這些資源 response 給 client-side

另外所謂的前向代理,通常是在 client-side 的軟體,例如瀏覽器會代替 client web page (program)去向CDN請求資源

使用後端代理伺服器的好處是,假設你有很多個 web server,都統一要由單一入口給 client-side 存取,則可以把存取的工作交給 reverse proxy,例如:

Web Server:

* Home Page Web Server
* Forum Web Server
* Wiki Web Server

然後你的客戶會連線到 www.my.domain.com,此時應該存取 Home Page Web Server,但當他連線到 www.my.domain.com/forum 時,應該要存取 Forum Web Server,可是如果把你的網域綁定到 Home Page Web Server,就無法另外連線到不同伺服器了,因此可以改用反向代理伺服器,把網域綁定到這台機器上,當反向代理判斷是要存取 Home Page,就會由他向那台伺服器請求資源,而要存取 Forum 時,就另外再向論壇的伺服器請求資源

另外,反向代理伺服器還有一些對於網站應用程式來說有很大幫助的功能,例如 load balancing、auto-scaling、failover 等

load balancing 會在流量大增的時候進行分流的動作,例如你有多台 forum web server,平時每天流量上萬,為了確保伺服器能夠穩定運作,不會因為短時間的存取量太大導致伺服器處理不及而癱瘓,就可以設定將一部分的存取流量導向 standby 的那台伺服器

auto-scaling 則是可以為你正在服務的伺服器自動依據目前的流量或運算量,最大化可以分配的資源,簡單來說,你有一台伺服器的記憶體有 32GB,分配給網頁伺服器的使用量只有 2GB,如果你的網頁服務需要大量運算(例如線上資料處理或機器學習),很有可能短時間內就把 2GB用完了,因此你可以設定當監測到記憶體快要用罄,系統會自動配置更多的記憶體來應付突發的運算量

failover 則是為了免除網站服務最擔心的事 — 中斷服務(downtime),你的伺服器很有可能被 DDoS 攻擊,或是程式有 bug,使用者不小心觸發導致伺服器掛了,這個時候假如你有一台 standby 的伺服器,有設定好 failover 功能,則會在監控到主要伺服器中斷服務的時候,立刻將存取要求導向那台 standby 的伺服器,縮短 downtime 的時間

說到 DDoS 攻擊,load balancing 或其他相關功能也可以在監控到瞬間變大的流量時,自動將(不正常)流量導向其他地方,就有專門的業者,是提供流量接收的服務,讓一些容易被 DDoS 攻擊的網站服務公司將流量導像他們的伺服器,這個功能的設定也可以在反向代理完成

--

--