ローカルDocker環境で開発していたLaravelをEC2環境で動かした

AWS

ずっとローカル&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含めて動きました。。。長かったです。