Help us understand the problem. What is going on with this article?

unicorn nginx rails の連携で自分がハマったところ

unicornとnginxを連携して、railsを表示させるという基本的なところの解説なのですが、他のインターネットの解説を見てやっても、自分の場合なかなかうまくいきませんでした。

同じように困っている人がいると思って自分の解決した方法を書きます。
環境はconohaのVPSで、CentOS7です。

結論からいうと、unicornとnginxを利用して、かつ、
/home/XXXXXX(ユーザー名)/YYYYY(railsのプロジェクト)
という場所にrailsのプロジェクトを置いてwebページを表示したい場合は、

chmod 701 /home/XXXXXX(ユーザー名)

を実行しないと、403 Forbidden が表示されます。

chmod 700 /home/XXXXXX(ユーザー名)
chmod 701 /home/XXXXXX(ユーザー名)

と実験をして、パーミッションが変わったときにrailsのページが表示されるかどうかを確認してください。これがこのページで一番言いたいことです。

では、手順を追って問題の発生するポイントを書いていきます。
まず、rails sをやって http://IPアドレス:3000 にアクセスして表示確認が完了したところから、解説を始めます。
(ちなみに、ポート3000はrailsのデフォルトのテスト用のポート)
(また、CentOSだと、sudo firewall-cmd --add-port=3000/tcp を実行しないと、表示がみれなくて、ハマります。・・・この点も原因がわかるまで苦労しました。ubuntuなら不要でした)

nginxのインストールの手順

// nginxのインストール
sudo yum install -y nginx
// CentOSはポートを手動で開かないといけないみたい
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
// nginxを起動
sudo systemctl start nginx

ここで、http://<グローバルIPアドレス> にアクセスして、nginxの表示がされるのを確認する。
nginxの表示は難しくありません。
(このとき、ポートを指定しなければ、ポート80を見ていることになる。ポート80はhttp用)

unicornのインストールの手順
Gemfileを開いて、
gem 'unicorn'
と書き込む。そして、以下のコマンドを実行。

bundle install
bundle update
// ↓たぶん、必要
gem install unicorn

config/unicorn.rb に以下のように記述する(vimで開く)

~/(YYYプロジェクトファイル名)/config/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"

次に、 /etc/nginx/conf.d/xxxxxx.conf を新規作成しても良いが、
自分の場合は、etc/nginx/nginx.conf を以下のように変更した。

http {                      
    upstream unicorn {                  
        server unix:/home/XXX(ユーザー名)/YYY(プロジェクト名)/tmp/unicorn.sock;             
    }                   

    server {                    
        listen 80 default_server;               
        listen [::]:80 default_server;              
        server_name <IPアドレス>;               
        #root /usr/share/nginx/html;                
        root /home/XXX(ユーザー名)/YYY(プロジェクト名)/public;              

        # Load configuration files for the default server block.                
        # include /etc/nginx/default.d/*.conf;              

        try_files $uri/index.html $uri @unicorn;                

        location @unicorn {                 
            proxy_pass http://unicorn;              
        }                   

        error_page 404 /404.html;                   
        location = /40x.html {                  
        }                   

        error_page 500 502 503 504 /50x.html;                   
        location = /50x.html {                  
        }
    }   
}   

(追記2019.10.17)↑カッコの数が間違っていたようでした。下から2つ目のカッコを追記しました。指摘ありがとうございます。検証していませんが、修正しました。

そして、以下のようにコマンドを実行。

// ↓unicornの起動
unicorn_rails -c config/unicorn.rb -E development -D
// ↓プロセスの確認
ps -ef | grep unicorn | grep -v grep
// ↓nginxの再起動(ここでは不要だったかも)
sudo systemctl restart nginx
// ↓nginxの状態確認
systemctl status nginx

さて、この状態で、http://<グローバルIPアドレス> にアクセスすれば、他の解説ページではrailsのページが表示されると書いていますが、自分の場合は表示されませんでした。(泣)

そして、いろいろ実験した結果、最初に書いたように

chmod 701 /home/XXXXXX(ユーザー名)

というコマンドを実行しないと、403 Forbidden が表示されるという結論に至りました。
本当に大変だったのですが、このパーミッションの変更が必要と言ってる解説サイトは、なぜか全然ヒットしませんでした。自分もパーミッションエラーが原因な気がしていましたが、これだという指摘をしてくれる解説サイトがないと関係のないところを編集して、時間ばかりかかってしまいました。

(ちなみに、etc/nginx/nginx.confのユーザーをnginxからユーザー名に変えても表示できましたが、それだと今度はBootstrapを組み込もうとする段階で、Bootstrapが反映されない。(泣)
という、現象に陥ります。そして、もう一度、unicornとnginxの設定を何度も編集テストしていった結果、chmodでパーミッションを変更すれば、解決するという結論に至りました。)

その他のエラーについて
nginx.confの設定ファイルの書き方がおかしいときは、

sudo systemctl restart nginx

のコマンドを実行した際に

Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

というエラーが出ます。このエラーの原因は、nginx.confの設定ファイルの書き方にルール違反があったときに出ます。nginx.confのファイルを編集して正しく書き直しましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした