基礎的架構想法是這樣的:
SSL 憑證掛在處理流量的 Nginx 上順便讓他做基本的 LoadBalancer。後面就是N個 Rails App 的 VM 來處理LB後的流量。Rails 的 Application 還是用習慣的 unicorn 來執行成 unix socket 讓同台機器上的自己的 Nginx 來把非 static 的 Request 導向 Rails App。
Nginx 上的設定
upstream store { server 10.x.x.1; server 10.x.x.2; } server { listen 80 default_server; listen [::]:80 default_server; listen 443 ssl default_server; ..... location / { proxy_pass http://store_milife; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
想得到要小心的是
- 如果要用 SSL 架站的話,Nginx 上要把 HTTP 的 Request 轉向 HTTPS 再導到 內網的 Rails App,類似這樣的方式:
server { ... if ($scheme = http) { return 301 https://$server_name$request_uri; } }
- Rails erb 裡的 link_to 會因為在內網只用 http 架站 enforce_ssl 沒有打開,所以會導向 http://。如果 Web Server 有處理掉這段的話就可以不用在 Rails 裡面處理
- enforce_ssl 不要打開,不然會發生無限導向的狀況