Nginxでサブディレクトリごとに複数のRailsアプリを動かす

Nginxでサブディレクトリごとに複数のRailsアプリを動かす

例えばAPIと管理画面でリポジトリを分けた場合に、ステージング環境で複数サーバを用意するほどでもないので1台のサーバで複数アプリを動かしたい時のメモ。
Nginx + Unicorn でrailsを動かす想定です。

# /etc/nginx/conf.d/my-app.conf

# api server
upstream unicorn_api_server {
  server unix:/tmp/unicorn.api.sock
  fail_timeout=0;
}

# admin server
upstream unicorn_admin_server {
  server unix:/tmp/unicorn.admin.sock
  fail_timeout=0;
}


server {
  listen 80;
  client_max_body_size 4G;
  server_name stg.sample.com;

  keepalive_timeout 5;

  location /api/ {
    root /var/www/my-api-app/current/public;
    access_log /var/log/nginx/api_access.log;
    error_log /var/log/nginx/api_error.log;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn_api_server;
  }

  location /admin/ {
    root /var/www/my-admin-app/current/public;
    access_log /var/log/nginx/admin_access.log;
    error_log /var/log/nginx/admin_error.log;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn_admin_server;
  }

  location ~ ^/admin/assets/ {
    root /var/www/my-admin-app/current/public;
  }

  error_page 500 502 503 504 /500.html;
  location = /admin/500.html {
    root /var/www/my-admin-app/current/public;
  }
}

このままだとsprocketsでprecompileしたassetsが行方不明になるのでconfig.assets.prefixを指定。

# config/enviroments/staging.rb
Rails.application.configure do
  ...
  config.assets.prefix = '/admin/assets'
  ...
end

TAG

  • このエントリーをはてなブックマークに追加
kurashita
エンジニア kurashita kurashita

基本的にRuby on Railsで開発してます。最近はvue.jsも。好きな塔は円城です。