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

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

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



結論からいうと、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)↑カッコの数が間違っていたようでした。下から２つ目のカッコを追記しました。指摘ありがとうございます。検証していませんが、修正しました。

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

```
// ↓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のファイルを編集して正しく書き直しましょう。