Nginx + Unicornで複数のRailsプロジェクトを実行する [CentOS]
Nginx/Unicornで1つのドメイン(IPアドレス)で複数のRuby on Railsのプロジェクトを実行する方法です。
やること
| http://IPアドレス/aaa/ | Ruby on Railsプロジェクト 実際のパス:/home/ユーザー名/myapp1 |
| http://IPアドレス/bbb/ | Ruby on Railsプロジェクト 実際のパス:/home/ユーザー名/myapp2 |
※サブディレクトリを切って実行させています。
実行例
http://IPアドレス/aaa/
http://IPアドレス/bbb/
既存のユニコーンのオフ (任意)
上記の関連記事を進めた方は既にunicornの自動起動の設定がされています。今回はそれをオフにしてから進みます。
CentOS7以降
// サービスの停止 sudo systemctl stop unicorn_sample_app // サービスの自動起動をオフする sudo systemctl disable unicorn_sample_app // サービスファイルを削除する sudo rm /usr/lib/systemd/system/unicorn_sample_app.service // デーモンリロード sudo systemctl daemon-reload // ココでOSを再起動します。
CentOS6以下
// サービスの停止 service unicorn stop // サービスの自動起動をオフする sudo chkconfig unicorn off // サービスファイルを削除する sudo rm /etc/init.d/unicorn // サービスを削除する sudo chkconfig --del unicorn // ココでOSを再起動します。
1. Railsプロジェクトの作成
[myapp1]
// Railsプロジェクト cd ~/ mkdir myapp1 cd myapp1 rails new . -d postgresql ※/home/ユーザー名/myapp1にプロジェクトが生成される // データベースの生成 bin/rails db:create // モデルの作成(モデル/マイグレーションファイルの生成) bin/rails g model Cat name:string description:text // マイグレーションの実行(テーブルの生成) bin/rails db:migrate // コントローラーの作成(コントローラー/ビューの生成) bin/rails g controller cats index show new edit // Gemfileファイルの編集 vi /home/ユーザー名/myapp1/Gemfile ※/home/ユーザー名/myapp1/Gemfileの末尾を次のようにする #gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] gem 'unicorn' // Gemfileファイルを元に各Gemをインストール bundle
[myapp2]
// Railsプロジェクト cd ~/ mkdir myapp2 cd myapp2 rails new . -d postgresql ※/home/ユーザー名/myapp2にプロジェクトが生成される // データベースの生成 bin/rails db:create // モデルの作成(モデル/マイグレーションファイルの生成) bin/rails g model Dog name:string description:text // マイグレーションの実行(テーブルの生成) bin/rails db:migrate // コントローラーの作成(コントローラー/ビューの生成) bin/rails g controller dogs index show new edit // Gemfileファイルの編集 vi /home/ユーザー名/myapp2/Gemfile ※/home/ユーザー名/myapp2/Gemfileの末尾を次のようにする #gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] gem 'unicorn' // Gemfileファイルを元に各Gemをインストール bundle
2. config/routes.rbの編集
// myapp1/config/routes.rb Rails.application.routes.draw do get 'cats/index' get 'cats/show' get 'cats/new' get 'cats/edit' root to: 'cats#index' end // myapp2/config/routes.rb Rails.application.routes.draw do get 'dogs/index' get 'dogs/show' get 'dogs/new' get 'dogs/edit' root to: 'dogs#index' end
3. プロジェクト名/config.ruの編集
[myapp1]
RAILS_RELATIVE_URL_ROOT='/aaa'
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
[myapp2]
RAILS_RELATIVE_URL_ROOT='/bbb'
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. config/unicorn.rbを作成する
myapp1/myapp2にそれぞれ作成します。
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 4)
timeout 15
preload_app true
listen '/home/ユーザー名/プロジェクト名/tmp/unicorn.sock'
pid '/home/ユーザー名/プロジェクト名/tmp/unicorn.pid'
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
[参考URL]
Deploying Rails Applications with Unicorn (Heroku)
Deploying Rails Applications with Unicorn (Heroku)
5. Unicornの起動/停止スクリプトを作成する
これはCentOS6以下用です。CentOS7以降はUnicornの自動起動を参照。
[myapp1]
cd /home/ユーザー名/myapp1 bin/rails g task unicorn
[myapp1/lib/tasks/unicorn.rake]
namespace :unicorn do
# Tasks
desc "Start unicorn"
task(:start) {
config = Rails.root.join('config', 'unicorn.rb')
sh "unicorn -c #{config} -E development -D"
}
desc "Stop unicorn"
task(:stop) {
unicorn_signal :QUIT
}
desc "Restart unicorn with USR2"
task(:restart) {
unicorn_signal :USR2
}
desc "Increment number of worker processes"
task(:increment) {
unicorn_signal :TTIN
}
desc "Decrement number of worker processes"
task(:decrement) {
unicorn_signal :TTOU
}
desc "Unicorn pstree (depends on pstree command)"
task(:pstree) do
sh "pstree '#{unicorn_pid}'"
end
# Helpers
def unicorn_signal signal
Process.kill signal, unicorn_pid
end
def unicorn_pid
begin
File.read("/home/ユーザー名/プロジェクト名/tmp/unicorn.pid").to_i
rescue Errno::ENOENT
raise "Unicorn does not seem to be running"
end
end
end
※myapp2も同様な操作を行います。
6. 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からコメントの緑色になっていますが、全て必要です。
Nginxのバージョンが1.12より新しい場合は「/etc/nginx/conf.d/default.conf」が存在する場合があります。その場合は正常に動作しないので「sudo rm /etc/nginx/conf.d/default.conf」でdefault.confを削除して下さい。
7. myapp.confを作成する
sudo vi /etc/nginx/conf.d/myapp.conf
upstream unicorn_myapp1 {
server unix:/home/ユーザー名/myapp1/tmp/unicorn.sock;
}
upstream unicorn_myapp2 {
server unix:/home/ユーザー名/myapp2/tmp/unicorn.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 ~ ^/aaa/assets/(.*) {
alias /home/ユーザー名/myapp1/public/assets/$1;
}
location ~ ^/bbb/assets/(.*) {
alias /home/ユーザー名/myapp2/public/assets/$1;
}
# myapp1
location /aaa/ {
alias /home/ユーザー名/myapp1/public;
try_files $uri @unicorn_myapp1;
}
location @unicorn_myapp1 {
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://unicorn_myapp1;
}
# myapp2
location /bbb/ {
alias /home/ユーザー名/myapp2/public;
try_files $uri @unicorn_myapp2;
}
location @unicorn_myapp2 {
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://unicorn_myapp2;
}
}
8. 動作確認
// CentOS7以降(ユニコーン) // myapp1, myapp2 sudo systemctl start myapp1のサービス名 sudo systemctl start myapp2のサービス名 // CentOS6以下(ユニコーン) // myapp1 cd /home/ユーザー名/myapp1 // bundle exec rake unicorn:stop ※これは停止 bundle exec rake unicorn:start // myapp2 cd /home/ユーザー名/myapp2 // bundle exec rake unicorn:stop ※これは停止 bundle exec rake unicorn:start // ユニコーンの起動確認 ps -ef | grep unicorn | grep -v grep // Nginxのリスタート sudo systemctl restart nginx
関連
Nginx + Pumaで複数のRailsプロジェクトを実行する
スポンサーリンク
関連記事
公開日:2019年09月16日 最終更新日:2019年11月30日
記事NO:02769
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









