aws nginx + unicorn  (13:permission dnined) while connecting to upstream でハマッた時に試したことのTIPS



# aws nginx + unicorn (13:permission dnined) while connecting to upstream でハマッた時に試したことのTIPS

## nginx + unicorn 
下記、記事を aws のサーバーにあげた時のお話。
[Rubyで仮面ライダークウガのグロンギ語翻訳ロジックを書いてみた-part1-](http://qiita.com/UltraBirdTech/items/e049448f73d424872c05)

unicorn に接続しようとしても 
nginx のログにエラーログが出力されて、一向に unicorn との連携ができなかった。

## 前提
nginx からの、リバースプロキシで unicorn に接続。
サーバーを勉強始めて6ヶ月目(？)くらい

unicorn の port にするつもりの3000番は、
aws の EC2 インスタンスから開放済み(ネタバレ：今回の落とし穴)
諸々の設定を終えて、unicornの立ち上げ！！

```
bundle exec unicorn -c config/unicorn.rb -D
```

あれ？繋がらないぞー。エラー・・・

```
*11 connect() to unix:/home/centos/unicorn/tmp/unicorn.sock failed (13: Permission denied) while connecting to upstream
```
さぁ、検索を始めよう・・・(仮面ライダーWてきな 

## 確認したこと・試したこと
### unicorn.sockのパーミッションは正しいか？
パーミッションがないって言われたら、まず対象のファイルのパーミッションを調べたくなりますよね。
というわけで、本能に従って調べました。
パーミッションは777で指定してあったので問題なし。
```
srwxrwxrwx. 1 centos centos  0  1月 10 14:33 unicorn.sock
```
うーん。。。じゃあどこで駄目なんだろうか。調査続行。

### nginxを立ち上げたユーザーと、unicornを立ち上げたユーザーが一致しているか？
nginx を立ち上げるユーザーと、 unicorn を立ち上げたユーザーが一致しないと同じく permission denined で弾かれるそうです。
注意するポイントは、nginx はデフォルトだと nginx というユーザーになるということ。
ユーザーがあっているかを確認する時は、以下コマンドです。

```
[centos@ip-10-0-0-67 tmp]$ ps aux | grep nginx
nginx    6984  0.0  0.0 112660   956 pts/0    R+   10:20   0:00 grep --color=auto nginx
root     13688  0.0  0.1  48668  1392 ?        Ss    1月10   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx   13689  0.0  0.3  51304  4032 ?        S     1月10   0:00 nginx: worker process
```


```
[centos@ip-10-0-0-67 tmp]$ ps aux | grep unicorn
centos    6986  0.0  0.0 112660   960 pts/0    R+   10:21   0:00 grep --color=auto unicorn
centos   14733  0.0  2.3 218344 24220 ?        Sl    1月10   0:00 unicorn master config.ru -c config/unicorn.rb -D -p 3000
centos   14736  0.0  8.2 301024 83880 ?        Sl    1月10   0:02 unicorn worker[0] config.ru -c config/unicorn.rb -D -p 3000
centos   14738  0.0  8.0 299012 81788 ?        Sl    1月10   0:02 unicorn worker[1] config.ru -c config/unicorn.rb -D -p 3000
```

確認した結果、案の定 nginx は nginx。unicorn は centos で立ち上がっていたとさorz
nginx のユーザー指定は、下記ファイルで行います。
/etc/nginx/nginx.conf

```
#user  nginx;　# 初期設定
user centos;　# unicorn側のユーザーに合わせる
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
　　　・
　　　・
　　　・
```

再起動

```
sudo service nginx restart
```

```
[centos@ip-10-0-0-67 tmp]$ ps aux | grep nginx
centos    6984  0.0  0.0 112660   956 pts/0    R+   10:20   0:00 grep --color=auto nginx
root     13688  0.0  0.1  48668  1392 ?        Ss    1月10   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
centos   13689  0.0  0.3  51304  4032 ?        S     1月10   0:00 nginx: worker process
```
無事にユーザーは一致しました。
ただ、これだけだと駄目だった。他にも原因があるっぽい。
うーん。。。じゃあどこで駄目なんだろうか。調査続行(2回目)

### awsのEC2のポートは空いているか？
はっ！！これか！！？
・・・というのも、最初から調査段階でハマルと知っていたので、対応していたのですけどね。
unicorn の port を3000で繋ぎたかったため、
aws の EC2 インスタンスの3000番を接続できるように開ける必要あり。

再度、確認してみたのですが3000は空いている・・・
うーん。。。じゃあどこで駄目なん(ry

### unicorn起動時のportの指定は大丈夫か？
unicorn を立ち上げるコマンド実行時に、aws で開けていたポートに -port で指定していなかった。
unicorn のデフォルト port は8080（らしい）。
上記で3000を指定して開けていたので、unicorn起動時にポートを指定してあげる必要あり。

bundle exec unicorn の時に -p で port 番号を指定してあげて無事に解決。立ち上がりました。

```
bundle exec unicorn config.ru -c config/unicorn.rb -D -p 3000
```

## おまけ
bundle exec unicorn config.ru -c config/unicorn.rb -D -p 3000
-c 設定ファイルの指定
-D デーモン化の指定
-p ポート番号の指定（今回の立役者）


## まとめ
サーバー、ハマッた。
噂どおり、サーバーはハマると余裕で一日中使いますね・・・
合宿中にハマッたのですが、朝の8:00から15:00まで戦っていました。

今回、ハマれたし、TIPSも貯められたのでよしとしよう。