Rails on Nginx + unicorn on MacOSX

Railsって便利ですね。

$ rails server

これだけで、サーバーが立ち上がって動作確認できちゃいますもんね。

ただ、この場合はrackサーバーとしてpumaが立ち上がるようです。(WEBサーバーはApache?)

とりあえず公開するサーバーはNginx + unicornにしたので、Macの開発環境も合わせてみます。

Nginx+UnicornでRailsを動かすon Mac」を参考に。ハマリポイントがあったのでそれも含めて下記にまとめときます。

nginxとunicornをインストール

$ brew install nginx
$ gem install unicorn

railsプロジェクトを作る(例としてここではHelloRails)

$ rails new HelloRails

configディレクトリにunicorn.rbを作る

$ cd HelloRails
$ vi config/unicorn.rb

unicorn.rbに必要事項を記載

rails_root = File.expand_path('../../', __FILE__)

worker_processes 2
working_directory rails_root

listen "#{rails_root}/tmp/unicorn.sock"
pid "#{rails_root}/tmp/unicorn.pid"

stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"

unicornをデーモンとして起動

$ unicorn_rails -c config/unicorn.rb -E development -D

ちなみに停止する時は以下。

$ kill -QUIT `cat tmp/unicorn.pid`

nginxを起動

$ sudo nginx

ブラウザでhttp://localhost:8080でアクセスしてwelcome to nginx!が表示されればOK。

nginxのconfファイルを編集

/usr/local/etc/nginx/serversに適当な名前のファイルを作る。

cd /usr/local/etc/nginx/servers
vi HelloRails.conf

以下を記載。

upstream unicorn {
    server unix:/Users/ky/RubyProjects/HelloRails/tmp/unicorn.sock;
}

server {
    listen 8081;
    server_name localhost;

    root /Users/ky/RubyProjects/HelloRails/public;

    access_log /usr/local/var/log/nginx/HelloRails_access.log;
    error_log /usr/local/var/log/nginx/HelloRails_error.log;

    client_max_body_size 100m;
    error_page 500 502 503 504 /500.html;

    try_files $uri/index.html $uri @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;
    }
}

server unix:***のところとHelloRailsは環境に合わせて適宜変更。

ファイルを作成したらnginxを再起動します。

$ sudo nginx -s reload

これで、ブラウザでhttp://localhost:8081にアクセスしてうまく表示されればいいんですが、私の場合502 Bad Gatewayが表示されてしまいました。

エラーログ/usr/local/var/log/nginx/HelloRails_error.logを確認すると、unicorn.sock failed (13: Permission denied)の文字が。

$ ps aux | grep nginx

してみると、

ky               26206   0.4  0.0  4268792   1028 s001  S+    1:36PM   0:00.01 grep nginx
nobody           26136   0.0  0.0  4335716   1720   ??  S     1:22PM   0:00.01 nginx: worker process
root             26068   0.0  0.0  4327288   1972   ??  Ss    1:06PM   0:00.01 nginx: master process nginx

と、rootとnobodyで立ち上がってるのが良くないのかな?と思い、nginxのユーザーを変更します。

nginx.confのuserを変更

$ cd /usr/local/etc/nginx
$ vi nginx.conf
user  ky staff;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

(以下略)
$ sudo nginx -s reload

macではデフォルトでグループはstaffのようですね。

これで無事http://localhost:8081でつながりました。

3 COMMENTS

現在コメントは受け付けておりません。