はじめに
- この記事は、Ateam LifeDesign Advent Calendar 2023の1日目記事です
- 諸事情により、Amazon Linux 2023にLaravel環境を構築することになりました
- 最新のLaravel環境を構築するのが数年ぶりでした…
- なんだかんだ詰まりポイントがあったので、個人メモがてら書き残します
- なお、ECSやらRDSやら使わず、EC2に全乗せします
- そのため本番用ではなく、あくまでも初心者の学習用途としてお使いください
EC2環境の用意
AMI
インスタンスタイプ
- とりあえず実験的に動かすなら、t2.microで十分
キーペア
- 既に使っているキーペアがあれば、それを選択
- なければ「新しいキーペアの作成」
セキュリティグループ
- セキュリティグループで、普段Webサーバ用に使っているものがあればセット
- 昔はインバウンドルールを自力でセットする必要あったのに、今はEC2インスタンス立ち上げでこんな楽な設定方法あるんですね…
完了
- あとは特に変えずにOK
- 「インスタンスを起動」を選択
Elastic IPを関連付け
- EC2インスタンス再起動のたびにIPアドレスが変わると面倒なので、Elastic IPを確保するため、メニューの「Elastic IP」を選択
- 「Elastic IPアドレスを割り当てる」ボタン押下
- 特に設定変えず、「割り当て」ボタン押下
- 割り当てられたIPアドレスを、先程作成したEC2インスタンスに紐づける
EC2インスタンスに接続
IPアドレスをコピー
ssh接続
- ターミナルでコマンドを打つ
ssh ec2-user@[IPアドレス] -i [鍵のパス]
- 必要なものは接続先IPアドレス(コピー済み)と鍵
- EC2インスタンス作成の時に新しいキーペアを作成したなら、それを使う
- 既存の鍵を選択したなら、それを使う
- もし新しいキーペアを作成した場合、パーミッションを変えないと接続できない(権限強すぎエラーが出る)
-
chmod 0600 [ダウンロードした鍵]
で、パーミッション変更
-
- 無事に入れたらこんな表示になる
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
PHP, Apacheのインストールと起動
参考:Amazon Linux 2023 での LAMP のインストール
$ sudo dnf update -y
- 必要なものとりあえず入れる
$ sudo dnf install -y httpd wget php-fpm php-mysqli php-json php php-devel
この時点でPHPが使えるようになっているはず。
$ php -v
PHP 8.2.9 (cli) (built: Aug 3 2023 11:39:08) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.9, Copyright (c) Zend Technologies
with Zend OPcache v8.2.9, Copyright (c), by Zend Technologies
- Apache起動
sudo systemctl start httpd
- Apache自動起動設定
sudo systemctl enable httpd
- 設定確認
$ sudo systemctl is-enabled httpd
enabled
$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/httpd.service.d
└─php-fpm.conf
Active: active (running) since ~~~
...
-
activeになってたらOK
-
Webブラウザで開いてみる
Composerのインストール
- LaravelはComposerを使うため、先にComposerを入れる
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
$ composer -V
Composer version 2.6.5 2023-10-06 10:11:52
- Composerのバージョンが表示されたらOK
Laravelのインストール
- パーミッション変更
$ cd /var/www
$ sudo chmod 0777 /var/www
$ composer create-project laravel/laravel example-app
- example-appは、付けたいディレクトリ名
- 特にエラー無く終わればOK
Apacheの設定を変える
- 現状だと
/var/www/html
を見に行っているので、Laravelを見るように変える必要がある
$ sudo vi /etc/httpd/conf/httpd.conf
- 既に書かれているDocumentRootをコメントアウトし、作成したディレクトリのpublicを見るように追記
/etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html"
DocumentRoot "/var/www/example-app/public"
- もう少し下にDirectoryと書かれている箇所があるので、以下内容を追記
- これが漏れているとroutingが効かず、トップページ以外が404になる
/etc/httpd/conf/httpd.conf
<Directory "/var/www/example-app/public">
Allowoverride All
</Directory>
- config弄ったのでApache再起動で反映
- 本番ならreloadやgracefulの方が良いが、今回は新規構築なのであまり気にしない
$ sudo systemctl restart httpd
LaravelのPermission変更
- パーミッションを変えればOK
- 777が本当に適切かはよく確認すること
$ sudo chmod -R 0777 storage/
データベースの設定を確認
- これでLaravelは動いているっぽく見える
- しかしLaravelを入れるということはデータベースを使えてなんぼのはず
- ただしmigrateすると落ちるはず
$ php artisan migrate
Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:822
818▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
819▕ );
820▕ }
821▕
➜ 822▕ throw new QueryException(
823▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
824▕ );
825▕ }
826▕ }
+38 vendor frames
39 artisan:35
Illuminate\Foundation\Console\Kernel::handle()
- Laravelでは
.env
ファイルでデータベース等の各種設定を行う- .envファイルが現状こうなっちゃっているので、MySQLのインストールと初期設定が必要
/var/www/example-app/.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
- 一応、SQLiteを使えばMySQL入れるよりも簡単にデータベースが使える
- が、SQLiteは機能やセキュリティ的に貧弱なこともあるため、変に詰まるよりかは最初からMySQLやPostgreSQLを入れた方が良い
- この記事ではMySQLを入れることとする
MySQLクライアントをインストールする
参考:[小ネタ]Amazon Linux 2023にMySQL Clientをインストールする
参考:Failed to start mysql.service: Unit mysql.service not found. → mysql-server インストール忘れ
$ sudo dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
$ sudo dnf -y install mysql mysql-community-client
- 今回はRDSを使わず、MariaDBじゃなくMySQLをそのまま入れるので
$ sudo yum install -y mysql-server
- 入ったらmysql立ち上げ
$ sudo systemctl start mysqld
$ sudo systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled)
Active: active (running) since ~~
...
- active (running)になってたらOK
MySQLの初期設定
- MySQLは初回起動時、自動的にパスワードが設定される
- ログを見ると仮パスワードが書かれているので、まずはそれで入る
$ sudo less /var/log/mysqld.log
...
[Server] A temporary password is generated for root@localhost: [Password]
...
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.35
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
- 初期パスワードのまま他操作するとエラーになるので、パスワードを変えておく
- パスワードはダミーです。もっとまともなパスワードを設定するようにしましょう
mysql> set password for root@localhost='NEW_password1234';
- データベースを作る
mysql> CREATE DATABASE laravel;
Query OK, 1 row affected (0.01 sec)
mysql> exit
Bye
.envを編集
/var/www/example-app/.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=NEW_password1234
これでコケずに実行完了するはず。
$ php artisan migrate
INFO Preparing database.
Creating migration table ............................................................................................................... 38ms DONE
INFO Running migrations.
2014_10_12_000000_create_users_table ................................................................................................... 50ms DONE
2014_10_12_100000_create_password_reset_tokens_table ................................................................................... 59ms DONE
2019_08_19_000000_create_failed_jobs_table ............................................................................................. 46ms DONE
2019_12_14_000001_create_personal_access_tokens_table .................................................................................. 75ms DONE
tinkerで確かめる
- LaravelはtinkerというREPLが使える
- Ruby on Railsで言うところの
rails console
みたいなやつ
- Ruby on Railsで言うところの
> $user = new App\Models\User();
= App\Models\User {#7003}
> $user->name = 'hoge';
= "hoge"
> $user->email = 'hoge@example.com';
= "hoge@example.com"
> $user->password = 'hogefuga1234';
= "hogefuga1234"
> $user->save();
= true
> User::all();
= Illuminate\Database\Eloquent\Collection {#7217
all: [
App\Models\User {#7219
id: 1,
name: "hoge",
email: "hoge@example.com",
email_verified_at: null,
#password: "...",
#remember_token: null,
created_at: "yyyy-mm-dd hh:ii:ss",
updated_at: "yyyy-mm-dd hh:ii:ss",
},
],
}
>
- これで、無事にデータベースに値が入っていることが確認できる
- 以上です