ずっとローカル&Dockerで開発していたウェブシステム(Laravel)を、EC2で動かそうとしてエラーになったので、解決までの流れをメモしておきます。
次々出てくるエラーを淡々と解決していく
まず、EC2作成後、セキュリティグループで 8000ポートを解放して、 http://【IP】:8000 へアクセスしたところ、vendor/autoload.php が見つからないと言われる。
どうやら、composer update
が必要なようなので、実行。
すると、今度は 500エラーが・・・
ここでちょっと調べてみたら、そもそもEC2のAmazonLinuxに色々とインストールするものが足りていなかったので(Gitを入れたぐらい)、追加してみることに。
anyenvとnodenv、そしてyarn
作っていたシステムはnode.jsを使っていたのでnodenv(とanyenv)をインストール。
最新バージョンは現時点で 19.1.0 だったので、それをインストール。
しかし、Yarnをインストールしようとしてnpmコマンドを実行したらこんなエラーが。
[ec2-user@XXX ~]$ npm install yarn -g
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
ちょっと調べてみたら、yumで最新Updeteをやっても、上記必要なGLIBCがないらしい。
低いバージョン17.9.1 を入れた所、エラーが出なくなった。
yarn devでエラー
yarn でインストール後、yarn dev を実行したら、
Error: ENOSPC: System limit for number of file watchers reached, watch '/home/ec2-user/
・・・
なんだろうと思ったのですが、inotifyというファイル監視の上限数の問題っぽいので、以下のコマンドで上限数を拡張します。
sudo sysctl fs.inotify.max_user_watches=24288
しかし、エラーのまま・・・
yarn dev が動くようになったものの、ブラウザからシステムにアクセスしても500エラーのまま。
yarn dev 実行時、「APP_URL: undefined」と出るのが気になるので、ここらへんを調べる事にします。
ちょっと色々調査しても解決しなさそうなので、一旦EC2に普通に環境構築してみようと思います。
EC2環境でnginx+PHP8+MySQL8環境を作成
Dockerで環境作成した時は、参考資料ほぼそのままに設定したこともあり、特に大きな問題は起きなかったのですが、自分でゼロから環境構築してみると、あまり気にしていなかったnginxとphp-fpmの設定で躓いてしまい、かなり時間が掛かってしまいました。
ここを正しく設定していないと、File not foundと言われてnginxでPHPが動きません。
ApacheはPHPをモジュールで実行するのであまり気にしなくていいですが、nginxはFPMを使うので面倒です。
nginxの設定で躓いた箇所
前述の通り、一通りインストールが終わって、PHPファイルにブラウザからアクセスしようとすると「file not found」と出てしまいます。
設定を見直す事にしました。
まずはnginxの設定ファイルです。(/etc/nginx/nginx.conf
環境によりパスは違うかも)
そもそもなのですが、nginxはPHPを使うためにFastCGIという仕様(インタフェース)を使って動かします。なので、その設定が正しくないと動きません。
また、そのFastCGIを使ってPHPを動かすには、どのような通信を使うかを設定します。
ポイントは以下の通り。
- nginxでPHPを動かすにはPHP-FPMというPHPのFastCGIで動くPHPをインストールする必要がある
- FastCGIを使う際、TCP SocketかUnixSocketどちらかを使う(今回の場合、後者にしないと動かなかった)
- 最終的に、以下のような設定で動作(最初、記述の順番がおかしくて動かなかった)
location ~ \.php$ {
root /var/www/eve/eve/public;
fastcgi_pass unix:/var/opt/remi/php81/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
PHP-FPMの設定も修正
あとは、PHP-FPM側の設定も必要です。(/etc/opt/remi/php81/php-fpm.d/www.conf 環境やバージョンでパスは変わります)
UnixSocketを使うので、以下のように設定します。これも、PHP-FPMのパスは環境で変わるので注意。この設定が、nginx.confと差異があると動きません。
listen = /var/opt/remi/php81/run/php-fpm/php-fpm.sock
また、user, group, listen.group, listen.owner も nginx に修正しておきます。
viteを使ってる場合
やっとPHPが動いたと思いきや、今回ログイン処理にbreezeを使っていたのですが、npm run dev を実行してブラウザ表示したら、うまくCSS等が読み込めませんでした。(Laravelのデカイロゴが出て表示が崩れてる)
どうやらこのコマンドだとローカル以外からのアクセス禁止にしているようなので、vite.config.js
の設定に、以下を追加(Laravel内)する。
server: {
host: true,
},
そうしたら、やっと画面が正常に表示されました。
DB接続設定でしょうもないミス
と思いきや、migrateしようとしたらエラーでDBに繋がらず(Access Denyと言われる)、 .envの設定を見直しても合ってるのでなぜだろう、、、と思っていたら、パスワードに記号が入ってるせいか、DB_PASSWORD="パスワード"
のように、ダブルクォートで囲んであげる必要がありました。
これでDB含めて動きました。。。長かったです。