佈署 Rails App 的一些想法

基礎的架構想法是這樣的:

SSL 憑證掛在處理流量的 Nginx 上順便讓他做基本的 LoadBalancer。後面就是N個 Rails App 的 VM 來處理LB後的流量。Rails 的 Application 還是用習慣的 unicorn 來執行成 unix socket 讓同台機器上的自己的 Nginx 來把非 static 的 Request 導向 Rails App。

rails-topology.png

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 不要打開,不然會發生無限導向的狀況