開発環境
ローカルです
macOS High Sierra
Ruby on Rails 5.1.5
nginx 1.13.9
unicorn 5.4.0
まず
- Railsの標準アプリケーションサーバーで起動できるようにする(Gemfileにunicornを入れるの忘れないように)
- homebrewでnginxをインストールしておく
unicornの設定
railsプロジェクトのconfig直下にunicorn.rbを作成する
rails_root = File.expand_path('../../', __FILE__)
worker_processes 2
working_directory rails_root
listen "#{rails_root}/tmp/sockets/unicorn.sock"
pid "#{rails_root}/tmp/pids/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 "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"
注意点
- unicorn.sockは/tmp直下に置かないこと
下記のように直下におくと他のプロセスから参照できなくなり、nginxと接続できなくなる。
listen "#{rails_root}/tmp/unicorn.sock"
エラー
connect() to unix:/Users/username/Desktop/hogehoge/tmp/unicorn.sock failed (2: No such file or directory) while connecting to upstream
unicornを起動させる
$ unicorn_rails -c config/unicorn.rb -E development -D
- 確認
$ ps -ef | grep unicorn | grep -v grep
501 93389 1 0 1:40AM 0:00.01 unicorn_rails master -c config/unicorn.rb -E development -D
501 93390 93389 0 1:40AM 0:02.36 unicorn_rails worker[0] -c config/unicorn.rb -E development -D
501 93391 93389 0 1:40AM 0:02.36 unicorn_rails worker[1] -c config/unicorn.rb -E development -D
workerを確認できたらok
2. 停止
$ kill `cat tmp/pids/unicorn.pid`
注意点
オプションはdevelopmentを指定する
ローカルで、myusqlとか使ってる人がproductionとかにするとpostgresが無いとかGemfileの'pg'がなんたら言われる
nginxの設定
1.編集ファイル作成
$ cd /usr/local/etc/nginx
$ cp nginx.conf.default nginx.conf
2.niginx.confのユーザーがnobodyでコメントアウトされているので、ユーザーネームにする
#user nobody;
user hogepiyo;
worker_processes 1;
...
...
3.servers直下に新しくconfファイルを作成する
upstream unicorn {
#railsプロジェクトのunicorn.sockを指定する
server unix:/Users/username/Desktop/hogehoge/tmp/unicorn.sock;
}
server {
# 今回はローカル環境なので、localhostを指定する
# portはご自由に
listen 8085;
server_name localhost;
# railsプロジェクトのpublicを指定
root /Users/username/Desktop/hogehoge/public;
# logは大切
access_log /usr/local/var/log/nginx/microposts_access.log;
error_log /usr/local/var/log/nginx/microposts_error.log;
client_max_body_size 100m;
error_page 500 502 503 504 /500.html;
try_files $uri/index.html $uri @unicorn;
# localhost:8085にアクセスしてunicornサーバーへ
location @unicorn {
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;
}
}
早速動かしてみる
- nginx
$ brew services start nginx
- unicorn
$ unicorn_rails -c config/unicorn.rb -E development -D
起動コマンドのユーザー合わせる
unicornをsudo(スーパーユーザー)とかで起動して、nginxをhogepioyoが起動させるとこんな感じで Permission deniedされる。(逆も然り)(sudoコマンドで生成されたファイル(error.logとか)を全部消してから再度起動コマンドを)
connect() to unix:/Users/username/Desktop/hogehoge/tmp/socket/unicorn.sock failed (13: Permission denied) while connecting to upstream,
なので、両方のプロセスのユーザーが一致していることを確認
$ ps aux | grep unicorn
hogepioyo 92509 0.0 0.0 4267768 1020 s005 S+ 1:08AM 0:00.00 grep unicorn
hogepioyo 92458 0.0 0.3 4396392 46544 ?? S 1:02AM 0:02.38 unicorn_rails worker[1] -c config/unicorn.rb -E development -D
hogepioyo 92457 0.0 0.3 4389224 46072 ?? S 1:02AM 0:02.38 unicorn_rails worker[0] -c config/unicorn.rb -E development -D
hogepioyo 92456 0.0 0.0 4323240 2080 ?? S 1:02AM 0:00.01 unicorn_rails master -c config/unicorn.rb -E development -D
$ ps aux | grep nginx
hogepioyo 92503 0.0 0.0 4267768 1020 s005 S+ 1:07AM 0:00.00 grep nginx
hogepioyo 92421 0.0 0.0 4336720 1112 ?? S 12:59AM 0:00.01 nginx: worker process
hogepioyo 90475 0.0 0.0 4320100 1188 ?? Ss 11:05PM 0:00.03 nginx: master process nginx
最後にnginxで指定したhttp://localhost:8085/にアクセスしてアプリケーションが開いていたら成功。