naota7118 / ocr_check_app

0 stars 0 forks source link

Proxy Error: The proxy server could not handle the request #32

Closed naota7118 closed 1 month ago

naota7118 commented 1 month ago

Dockerで本番環境にデプロイし、https://ocrcheck.comにアクセスしたところ、このようなエラーが表示された。

スクリーンショット 2024-08-03 午後2 44 22
naota7118 commented 1 month ago

現状把握

Reason: DNS lookup failure for: rails DNS(ドメインネットワークサービス)が「rails」を探そうとして失敗した。

Apacheの設定ファイル(httpd.conf)に以下の行を追加している。(Apacheのリバースプロキシ化のため)

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests Off
ProxyPass / http://rails:3000/
ProxyPassReverse / http://rails:3000/

原因

ProxyPassの設定が間違っていて、転送先が見つからない。

やったこと

ProxyPassをRailsコンテナのサービス名railsからドメイン名ocrcheck.comに変更した。

結果

503エラーが返ってきた。

スクリーンショット 2024-08-03 午後3 04 50
naota7118 commented 1 month ago

screenコマンドでdocker-compose upを実行している →セッション上にログが表示される。そのログを確認するには? →screenlog.0というファイルにログが出力されるらしい cat screenlog.0を実行しても何も表示されない →その前のscreenコマンドでdocker-compose upがすぐに終了してしまっている?

screen -L -dm echo RAILS_ENV=production ${SUDO_PASS} | sudo -S docker-compose -f docker-compose.yaml -f docker-compose-prod.yaml up -d --build && 仮想端末上で実行されているのはscreen -L -dm echo RAILS_ENV=production ${SUDO_PASS}までで、それ以降は通常のEC2インスタンス内で行われている?

naota7118 commented 1 month ago

そもそも仮想端末上にこだわる必要がないと考えた。
メインシェルでもコンテナの起動はデタッチモードで実行できるため。
後者のほうがdocker logsでログも確認しやすい。

naota7118 commented 1 month ago

Railsコンテナのログを確認するとA server is already runningと出た。
前回起動した時のプロセスが残っていると考えられる。
docker-compose-prod.yamlを修正した。

command: bash -c "rm -f tmp/pids/server.pid && rails assets:precompile && rails s -b 0.0.0.0"
naota7118 commented 1 month ago

再びRailsコンテナのログを確認すると、本番環境で実行できていないことがわかった。

=> Booting Puma
=> Rails 7.1.3.2 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 6.4.2 (ruby 3.3.0-p0) ("The Eagle of Durango")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 1
* Listening on http://0.0.0.0:3000/

docker-compose-prod.yamlでRailsコンテナに環境変数を指定した。

environment:
  - RAILS_ENV=production
naota7118 commented 1 month ago

Apacheコンテナのログを見ると、プロキシのエラーが原因と判明。

スクリーンショット 2024-08-06 午後6 38 43
naota7118 commented 1 month ago

Apacheのリバースプロキシ設定をローカルホストで指定していたが、異なるコンテナ同士を接続するにはdocker-compose.yamlのサービス名もしくはコンテナ名で指定する必要があった。

ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/

サービス名で指定したら解決した。

ProxyPass / http://rails:3000/
ProxyPassReverse / http://rails:3000/
naota7118 commented 1 month ago

当初コンテナのサービス名で指定していたにもかかわらずProxy Errorとなった原因は、おそらくscreenコマンドで仮想端末上でコンテナを起動していたため、railsがコンテナのサービス名だと認識されなかったのだろうと考えられる。

途中で仮想端末上ではなくメインシェルでコンテナ起動したので、認識されるようになったのではないか。