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-

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も貯められたのでよしとしよう。