502エラー発生の経緯
本来の実現したいこととしては、docker環境でローカルからアプリ画面(127.0.0.1:8000/login)にアクセスして画面表示させることでした。
その為、.envをローカル環境用に設定、migrate等を実行し、アプリ画面にアクセスするとブラウザで502 Bad Gateway
が発生!
調査
nginxが問題を起こしてる、つまりwebコンテナに何か原因がある?と判断して以下の調査をしました。
・webコンテナからログを確認
→ログがきていない。
/var/log/nginx # cat error.log
^C
/var/log/nginx # tail -f access.log
^C
・コンテナの情報確認
→webコンテナのポート番号は8000で間違いなし。
backend $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75f873c841cf nginx:1.18-alpine "/docker-entrypoint.…" 34 minutes ago Up 34 minutes 0.0.0.0:8000->80/tcp laravel-zaikokanri_web_1
・curlでアクセス確認
→コンテナ外、内どちらでやっても502が返ってくると想定していたが、コンテナ内だとポートからアクセスできない
と出た。
backend $ curl http://127.0.0.1:8000/login
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
//appコンテナ上でcurl
root@44bec85b6eab:/work# curl http://127.0.0.1:8000/login
curl: (7) Failed to connect to 127.0.0.1 port 8000: Connection refused
・上記のポートで接続できないエラーについて
TerminalとDocker Desktop for Macが同期されているか確認。
→同期はされているのでこちらは原因ではなかった。
参考記事:
https://kin29.info/docker%E3%81%A7localhost%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3[…]E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E6%96%B9%E6%B3%95%E3%80%82/
backend $ docker-machine ls
-bash: docker-machine: command not found
backend $ env | grep DOCKER
・laravel側のログ確認
→/storage/下のディレクトリがうまく読み込めてない?
root@44bec85b6eab:/work/storage/logs# tail -n 70 laravel.log
[previous exception] [object] (ErrorException(code: 0): Trying to get property 'id' of non-object at /work/storage/framework/views/467cdeb7f738538e076e5b9450a25a2f1a0592cd.php:170)
[stacktrace]
#0 /work/storage/framework/views/467cdeb7f738538e076e5b9450a25a2f1a0592cd.php(170): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(8, 'Trying to get p...', '/work/storage/f...', 170, Array)
#1 /work/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(107): require('/work/storage/f...')
・
・
・
#57 /work/public/index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#58 {main}
"}
・/storage/下のパスを確認
→ログに出ていた467cdeb7f738538e076e5b9450a25a2f1a0592cd.php
が/views/下に無い。
root@44bec85b6eab:/work/storage# ls
app framework logs
root@44bec85b6eab:/work/storage# cd framework
root@44bec85b6eab:/work/storage/framework# ls
cache sessions testing views
root@44bec85b6eab:/work/storage/framework# cd views
root@44bec85b6eab:/work/storage/framework/views# ls
28cb2f865463e2e3762dd6f06692912617362439.php 6dc82b1823500a9c6c2f1e97645ae08c793bc98c.php b3ea762d1458efe150fd9b812ad0bdd120c62243.php
46231ddce89fc639cc7622aeddfdb557006e1889.php 796bc76b9f8350b55eb11f50b70aedabbb178ef4.php bec2fce69b216686db7b8eea0903139fd5099dd9.php
4946bdd88728158c003f26ec8998f15ee0eb44a8.php 9eb3fa105fa342374e012ac7651851c0ebe14d7c.php fb4872a70f0e2b297c5bd136f2f76b99a9e3734d.php
69a7641f7a9123abe5851686ad7abd2a641cee84.php a1eb93da705d3b32143cc42f584a4079a76e72d5.php
結論
結果、今回はappコンテナでcompose install
実行することで解決!
root@44bec85b6eab:/work# composer install
Package manifest generated successfully.
82 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
何故解決したのか
502エラーってリクエストに時間がかかり過ぎることが原因
だと思い込んでいたので、何でcomposerをインストールしてサーバエラーが解決したのか?と疑問でした。。
ちなみに、composerとはPHPプログラミング言語向けのソフトウェアや必要なライブラリの依存関係を管理するパッケージ
です。
結論、解決できた理由は以下の通りです。
composer installはcomposerをインストールしているわけではなく
、インストールしたcomposerというパッケージ管理ソフトを使って、composer.json に記載されているPHPの動作に必要なパッケージをインストールするコマンド
。
その為、gitでクローンした直後や何か構成変更を行った後は、composer installを実行しておかないとアプリケーションが正しく動かない
ようです。
そこで動作に必要なライブラリなどをダウンロードしたりしている為。
そして、
502エラー自体は単にサーバー側で何かエラーが起きてます
ということしかわからない状態。
今回の場合結果としてリクエストに時間がかかったように見えただけで、正しくは単純にアプリが正常に動作する状況を作れていなかった
ということでした。。
また、
laravel側のログに出ていた/storage/frameworkはフレームワーク(今回はlaravel)が使うフォルダで、通常開発者がいじってどうこうするフォルダではない。
つまり、ここでエラーが出ているということは、何らかの構成変更が行われたのにcomposer installが行われていない
、もしくはそもそもcomposer installが行われていない
のどちらかになるということでした。