はじめに
先日、開発中アプリケーションの本番環境にアクセスしたところ、もやは全エンジニアにとってお馴染みとなった502 BadGatewayに出会しました。
**「またコイツかよ!今度はなんだよ!」**と正直心の中で思いましたが、この問題への対処を通して初めて知り学べたことがあったので備忘がてら残したいと思います。
※開発中アプリケーションは以下のような環境です。
【環境】
- EC2(Amazon Linux2)
- Webサーバ (nginx/1.20.1)
- アプリケーションサーバ (puma/3.12.6)
- Ruby on Rails5.2.5
RailsアプリケーションをNginxをインストールしたEC2上で稼働させている
調査
Nginxのエラー確認
まずは、どのような状況になっているのか確認するため、EC2上でNginxのエラーログを確認
# nginxのエラーログを確認
$ sudo cat /var/log/nginx/error.log
=> [error] 2716#2716: *179 connect() failed (111: Connection refused) while connecting to upstream
どうやらWebサーバであるNginxとアプリケーションサーバのPumaとの通信が上手くいっていないようだ
ちなみに、Connection refused
の現象の説明としては、以下記事がとても参考になりました。
(111: Connection refused) が出る場合
さらにちなむと・・・
Nginxのエラーログの吐き出し場所は/etc/nginx/nginx.conf
で設定されているので、ここを変えれば任意の場所に変更可能となっています。
# エラーログ場所指定
error_log /var/log/nginx/error.log;
Pumaの確認
そもそもpumaがちゃんと起動されているのか?と疑問に思ったので確認すると・・・
起動していなかった。。。🥺
# pumaのプロセスを確認
$ ps aux | grep puma
=> 起動していない
# ちゃんと起動しているとこんな感じのがでる
=> 実行user プロセス番号 0.5 2.8 1252212 223876 ? Sl 起動時刻 0:11 puma 3.12.6 (tcp://0.0.0.0:3000)
じゃあ手動で起動させようということで・・・
サーバ内アプリ配下(私の場合だと/var/www/applications/workspace/アプリ名
)でpumaを起動
# pumaを起動
$ bundle exec pumactl start
=> No such file or directory @ rb_sysopen - tmp/pids/server.pid
# どうやらpidsディレクトリなるものが無いらしい
解決方法と学んだこと
ここからが今回の問題の解決方法と初めて知った知識になります。
解決方法
$ ls -la /tmp
=> pidsディレクトリが無い
# tmpの下にpidsを作成
$ mkdir pids
# pumaを起動
$ bundle exec pumactl start
=> 無事起動し、502BadGatewayから解放!
原因・学んだこと
まず、pumaは起動と同時に、/tmp/pids
ファイルを参照し、server.pid
ファイルを作成します。
(server.pid
はpumaを停止すると削除され、起動するとまたその都度作られるもの)
これは、Pumaに限らず、他のrubyのアプリケーションサーバのUnicornなどのPassengerなどでも共通なんですね。
今回の場合だと、
/tmp/pids
ディレクトリが無く、pumaが起動されてないことによりNginxと通信できないことが直接の原因と見られます。。。
では実際に確認。pumaの起動中にそれぞれ見てみると・・・
# 同じプロセス番号でpumaが起動していることが確認できる
$ ps aux | grep puma
=> プロセス番号
$ cat /アプリ名/tmp/pids/server.pid
=> プロセス番号
補足的にしたこと
pids
ディレクトリ作成の変更を全てのブランチに反映させたあと、全環境にデプロイさせるため、以下2つを実行
これで、pidsと.keepがgit上で無視されることなく維持される。
1./tmp/pids
に.keep
を作成
2..gitignore
を修正
# アプリ名/tmp/pidsで実行
$ touch .keep
# .gitignoreに追記
/tmp/*
!/tmp/.keep
!/tmp/pids/.keep
なぜ、pids
が無かったのかは定かではないですが、以上のような方法で対処しました。
私自身、ミドルウェア周りの知識にとても疎かったので、結構苦労してしまいました、、、
502BatGatewayは開発中によく起きる現象だと思うので、たくさんの原因が考えられますが、この記事が同じ現象に当たった人の参考に少しでもなれば幸いです。
参考