4
1

More than 1 year has passed since last update.

エンジニアなら一度は経験有り!? 502 BatGatewayに対処して学んだ知識

Last updated at Posted at 2022-01-22

はじめに

先日、開発中アプリケーションの本番環境にアクセスしたところ、もやは全エンジニアにとってお馴染みとなった502 BadGatewayに出会しました。

「またコイツかよ!今度はなんだよ!」と正直心の中で思いましたが、この問題への対処を通して初めて知り学べたことがあったので備忘がてら残したいと思います。

502エラー.png


※開発中アプリケーションは以下のような環境です。

【環境】

  • EC2(Amazon Linux2)
  • Webサーバ (nginx/1.20.1)
  • アプリケーションサーバ (puma/3.12.6)
  • Ruby on Rails5.2.5

RailsアプリケーションをNginxをインストールしたEC2上で稼働させている

調査

Nginxのエラー確認

まずは、どのような状況になっているのか確認するため、EC2上でNginxのエラーログを確認

EC2
# 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で設定されているので、ここを変えれば任意の場所に変更可能となっています。

/etc/nginx/nginx.conf
# エラーログ場所指定
error_log  /var/log/nginx/error.log;

Pumaの確認

そもそもpumaがちゃんと起動されているのか?と疑問に思ったので確認すると・・・
起動していなかった。。。🥺

EC2
# 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を起動

/var/www/applications/workspace/アプリ名
# pumaを起動
$ bundle exec pumactl start
=> No such file or directory @ rb_sysopen - tmp/pids/server.pid
# どうやらpidsディレクトリなるものが無いらしい

解決方法と学んだこと

ここからが今回の問題の解決方法と初めて知った知識になります。

解決方法

/var/www/applications/workspace/アプリ名
$ 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は開発中によく起きる現象だと思うので、たくさんの原因が考えられますが、この記事が同じ現象に当たった人の参考に少しでもなれば幸いです。

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1