Nginx + Pumaで複数のRailsプロジェクトを実行する [CentOS]
Nginx/Pumaで1つのドメイン(IPアドレス)で複数のRuby on Railsのプロジェクトを実行する方法です。サービスを使用した自動起動にも対応です。
やること
http://IPアドレス/ccc/ | Ruby on Railsプロジェクト 実際のパス:/home/ユーザー名/sample1 |
http://IPアドレス/ddd/ | Ruby on Railsプロジェクト 実際のパス:/home/ユーザー名/sample2 |
※サブディレクトリを切って実行させています。
実行例
http://IPアドレス/ccc/

http://IPアドレス/ddd/

1. Railsプロジェクトの作成
[sample1]
// Railsプロジェクト cd ~/ mkdir sample1 cd sample1 rails new . -d postgresql ※/home/ユーザー名/sample1にプロジェクトが生成される // データベースの生成 bin/rails db:create // モデルの作成(モデル/マイグレーションファイルの生成) bin/rails g model Pig name:string description:text // マイグレーションの実行(テーブルの生成) bin/rails db:migrate // コントローラーの作成(コントローラー/ビューの生成) bin/rails g controller pigs index show new edit
[sample2]
// Railsプロジェクト cd ~/ mkdir sample2 cd sample2 rails new . -d postgresql ※/home/ユーザー名/sample2にプロジェクトが生成される // データベースの生成 bin/rails db:create // モデルの作成(モデル/マイグレーションファイルの生成) bin/rails g model Cow name:string description:text // マイグレーションの実行(テーブルの生成) bin/rails db:migrate // コントローラーの作成(コントローラー/ビューの生成) bin/rails g controller cows index show new edit
2. config/routes.rbの編集
// sample1/config/routes.rb Rails.application.routes.draw do get 'pigs/index' get 'pigs/show' get 'pigs/new' get 'pigs/edit' root to: 'pigs#index' end // sample2/config/routes.rb Rails.application.routes.draw do get 'cows/index' get 'cows/show' get 'cows/new' get 'cows/edit' root to: 'cows#index' end
3. プロジェクト名/config.ruの編集
[sample1]
RAILS_RELATIVE_URL_ROOT='/ccc' require_relative 'config/environment' if RAILS_RELATIVE_URL_ROOT then map RAILS_RELATIVE_URL_ROOT do run Rails.application end else run Rails.application end # 元のコード # require_relative 'config/environment' # run Rails.application
[sample2]
RAILS_RELATIVE_URL_ROOT='/ddd' require_relative 'config/environment' if RAILS_RELATIVE_URL_ROOT then map RAILS_RELATIVE_URL_ROOT do run Rails.application end else run Rails.application end # 元のコード # require_relative 'config/environment' # run Rails.application
4. プロジェクト名/my_puma.rbを作成する
[sample1]
workers Integer(ENV['WEB_CONCURRENCY'] || 2) threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5) threads threads_count, threads_count preload_app! bind "unix:///home/ユーザー名/sample1/tmp/puma.sock" rackup DefaultRackup port ENV['PORT'] || 3000 environment ENV['RACK_ENV'] || 'development' on_worker_boot do ActiveRecord::Base.establish_connection end
[sample2]
workers Integer(ENV['WEB_CONCURRENCY'] || 2) threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5) threads threads_count, threads_count preload_app! bind "unix:///home/ユーザー名/sample2/tmp/puma.sock" rackup DefaultRackup port ENV['PORT'] || 3001 environment ENV['RACK_ENV'] || 'development' on_worker_boot do ActiveRecord::Base.establish_connection end
注意事項としてsample1のPortは3000、sample2のPortは3001にして下さい。これは同じポートだと1つしか動作しないからです。
5. サービスファイルを作成する
[sample1]
sudo vi /usr/lib/systemd/system/puma_sample1_app.service
[Unit] Description=Puma HTTP Server1 After=network.target [Service] # サービスプロセスの起動完了の判定方法 Type=simple # ユーザー名 User=ユーザー名 # プロジェクトパス WorkingDirectory=/home/ユーザー名/sample1 # サービス起動(-Cは指定された設定ファイルを読み込む) ExecStart=/home/ユーザー名/.rbenv/shims/puma -C /home/ユーザー名/sample1/my_puma.rb # 落ちた場合は自動で再起動 ※systemctl stopは除く Restart=always [Install] # ターゲット WantedBy=multi-user.target
[sample2]
sudo vi /usr/lib/systemd/system/puma_sample2_app.service
[Unit] Description=Puma HTTP Server2 After=network.target [Service] # サービスプロセスの起動完了の判定方法 Type=simple # ユーザー名 User=ユーザー名 # プロジェクトパス WorkingDirectory=/home/ユーザー名/sample2 # サービス起動(-Cは指定された設定ファイルを読み込む) ExecStart=/home/ユーザー名/.rbenv/shims/puma -C /home/ユーザー名/sample2/my_puma.rb # 落ちた場合は自動で再起動 ※systemctl stopは除く Restart=always [Install] # ターゲット WantedBy=multi-user.target
ExecStartの「/home/ユーザー名/.rbenv/shims/puma」のパスは「which puma」のコマンドで表示されるパスを設定します。
※必要に応じてUnicornの自動起動のようにPIDFileを設定して下さい。
6. サービスのコマンド
次はsample1の「puma_sample1_app」のコマンド例ですが、sample2の場合は「puma_sample2_app」に置き換えてください。
// デーモンリロード sudo systemctl daemon-reload // 以下、puma_sample1_appをpumaサービスと呼ぶ // pumaサービスの起動 sudo systemctl start puma_sample1_app // pumaサービスの停止 sudo systemctl stop puma_sample1_app // pumaサービスのリスタート sudo systemctl restart puma_sample1_app // pumaサービスのステータスのチェック sudo systemctl status puma_sample1_app // pumaサービスをOS起動時に自動起動する sudo systemctl enable puma_sample1_app // 上記を無効にする sudo systemctl disable puma_sample1_app // サービスの一覧情報 sudo systemctl list-unit-files
7. Nginxの設定ファイル(nginx.conf)の編集
sudo vi /etc/nginx/nginx.conf
user ユーザー名; worker_processes auto; events { worker_connections 1024; } http { server_tokens off; include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
※/*.confからコメントの緑色になっていますが、全て必要です。
8. myapp.confを作成する
sudo vi /etc/nginx/conf.d/myapp.conf
upstream puma_sample1_app { server unix:/home/ユーザー名/sample1/tmp/puma.sock; } upstream puma_sample2_app { server unix:/home/ユーザー名/sample2/tmp/puma.sock; } server { listen 80; server_name IPアドレス; client_max_body_size 100m; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # /home/ユーザー名/プロジェクト名/publicの各ファイルにアクセス可能にする location ~ ^/ccc/assets/(.*) { alias /home/ユーザー名/sample1/public/assets/$1; } # /home/ユーザー名/プロジェクト名/publicの各ファイルにアクセス可能にする location ~ ^/ddd/assets/(.*) { alias /home/ユーザー名/sample2/public/assets/$1; } # sample1 location /ccc/ { alias /home/ユーザー名/sample1/public; try_files $uri @puma_sample1_app; } location @puma_sample1_app { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://puma_sample1_app; } # sample2 location /ddd/ { alias /home/ユーザー名/sample2/public; try_files $uri @puma_sample2_app; } location @puma_sample2_app { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://puma_sample2_app; } }
9. 動作確認
最後にNginxを再起動して動作確認をするだけです。
sudo systemctl restart nginx
参考URL
https://github.com/puma/puma/blob/master/docs/systemd.md
関連
Nginx + Unicornで複数のRailsプロジェクトを実行する