ブログ


【Amazon Linux 2023】 Laravelが動く環境を構築する
こんにちは、T.Uです。
今回は前回に続き、Amazon Linux 2023でLaravel Jetstreamが動く環境を構築する手順を紹介します。
前回の記事もぜひ見ていただけますと幸いです。
また、各バージョンは以下のとおりです。
- Laravel 11
- Laravel Jetstream 5
- PHP 8.3
- Node.js 22
- MySQL 8.4
目次
Amazon Linux 2023とは
Amazon Linux 2023は、2023年3月にリリースされたAmazon Linux 2の後継OSです。
Amazon Linux 2では、yum
やamazon-linux-extras
などを使っていましたが、Amazon Linux 2023ではdnf
を使うようになったり、ベースOSが変わっていたり…と色々と変わっている点があります。
また、Amazon Linux 2のサポート期限が、2025年6月30日と残り短くなっているため、Amazon Linux 2023への移行が必要となってきます。
Amazon Linux 2で新しいインスタンスを作成すると、画像のようなアスキーアートが表示されるようになっています。

インスタンス作成
まずは、インスタンスを作成します。大まかな流れは、Amazon Linux 2で行った流れと同じです。
「インスタンスを起動」からインスタンスの情報を入力します。

今回は、「名前とタグ」には、「al2023-laravel」を入力します。
「Amazonマシンイメージ」は、「Amazon Linux 2023」を選択します。

「インスタンスタイプ」には、「t3a.small」を選択します。
「キーペア(ログイン)」には「新しいキーペアを作成」からキーペアを作成し、作成したキーペアを選択します。


ネットワーク設定では、以下の設定にします。
- セキュリティグループを作成
- 「自分のIP」からのSSHトラフィックを許可
- インターネットからのHTTPSトラフィックを許可
- インターネットからのHTTPトラフィックを許可
ここまで入力ができたら、「インスタンスを起動」をクリックして、インスタンスを作成します。

インスタンスが作成できたら、画像のような表示になります。

Elastic IPを割り当て
「Elastic IPアドレスを割り当てる」から、Elastic IPを割り当てます。

AmazonのIPv4アドレスプールを選択し、「割り振る」をクリックします。

Elastic IPの割り当てができたら、「Elastic IPアドレスの関連付ける」から、EC2インスタンスとElastic IPを関連付けます。

「インスタンス」と「プライベートIPアドレス」を選択したら、「関連付ける」をクリックします。

DNS
次は、先ほど登録したElastic IPアドレスを、ドメインに紐づけます。
今回は、Route 53に登録されているドメインに登録するので、「レコードを作成」をクリック。

「レコードタイプ」に「A」、「値」に「Elastic IPのIPアドレス」を入力し、「レコードを作成」をクリックして、レコードを登録します。

SSH
インスタンスの作成が完了したら、まずはSSHでインスタンスに接続します。
インスタンスを作成する際に、ダウンロードした鍵ファイルの権限を変更します。
chmod 400 al2023-laravel.pem
権限を変更したら、鍵ファイルを使ってインスタンスにSSHします。
IPアドレスには、Elastic IPで登録したIPアドレスを入力します。
ssh -i al2023-laravel.pem ec2-user@[IPアドレス]
SSHができたら、rootユーザーに切り替えておきます。
# rootユーザーに切り替え
sudo su
タイムゾーンとロケールの設定
サーバーのタイムゾーンを Asia/Tokyo に設定し、ロケールを日本語に設定します。
# タイムゾーンの設定
timedatectl set-timezone Asia/Tokyo
# ロケールの設定
localectl set-locale LANG=ja_JP.utf8
PHPインストール
PHP 8.3 をインストールします。
Amazon Linux 2では、amazon-linux-extras
を使って、インストールしていましたが、Amazon Linux 2023ではamazon-linux-extras
は利用できないため、dnfコマンドでインストールします。
# PHP と必要なモジュールのインストール
dnf install -y php8.3 php8.3-cli php8.3-pdo php8.3-fpm php8.3-mysqlnd php8.3-mbstring php8.3-gd php8.3-intl
PHP が正しくインストールされたかを確認します。
# php -v
PHP 8.3.10 (cli) (built: Jul 30 2024 13:44:37) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.10, Copyright (c) Zend Technologies
with Zend OPcache v8.3.10, Copyright (c), by Zend Technologies
nginxインストール
次に、nginx をインストールします。
# nginx のインストール
dnf install -y nginx
nginx を起動し、そのステータスを確認します。
# nginxを起動
systemctl start nginx
# nginxが自動起動されるように設定
systemctl enable nginx
ここまでできたら、登録したドメインをブラウザで開くと、nginxのウェルカムページが表示できるようになります。

Composerインストール
次に、Composer をインストールします。
export HOME="/root"
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
composer -V
で、正しくインストールできたか確認することができます。
以下のようにComposerのバージョンや、PHPのバージョンが出力されます。
# composer -V
Composer version 2.8.4 2024-12-11 11:57:47
PHP version 8.3.10 (/usr/bin/php)
Run the "diagnose" command to get more detailed diagnostics output.
Node.jsインストール
Node.jsをインストールします。
# Node.jsのリポジトリを追加
curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash -
# Node.jsをインストール
dnf install -y nodejs
Node.jsとnpmが正しくインストールされたか確認します。
# node -v
v22.12.0
# npm -v
10.9.0
MySQLインストール
MySQLのリポジトリを追加し、MySQLサーバーをインストールします。
# MySQL リポジトリの追加
dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
# MySQL サーバーのインストール
dnf install -y mysql-community-server
MySQL サーバーを起動します。
# MySQLを起動
systemctl start mysqld
# MySQLが自動起動されるように設定
systemctl enable mysqld
MySQLが起動できたら、MySQLインストール時に自動生成される、初期パスワードを確認します。
cat /var/log/mysqld.log | grep password
初期パスワードを確認できたら、初期パスワードの変更やデータベース・ユーザーを作成します。
# MySQLに接続
mysql -u root -p
まずは、初期パスワードを変更します。
ALTER USER 'root'@'localhost' IDENTIFIED BY '[新しいパスワード]';
FLUSH PRIVILEGES;
上から順番に実行して、データベース作成・ユーザー作成・ユーザーに権限設定を行います。
# データベース作成
CREATE DATABASE app;
# ユーザー作成
CREATE USER 'laravel'@'localhost' IDENTIFIED BY '[パスワード]';
# ユーザーに全権限追加
GRANT all ON app.* TO 'laravel'@'localhost';
# 権限の変更をデータベースに反映
FLUSH PRIVILEGES;
Laravelセットアップ
Laravelを配置するディレクトリを作成し、権限を変更します。
# アプリの配置先を作成
mkdir -p /srv/al2023-laravel.wingdoor.co.jp
# ec2-userをnginxグループに追加
usermod -a -G nginx ec2-user
# ファイルの所有者を変更
chown -R ec2-user:nginx /srv/al2023-laravel.wingdoor.co.jp
chmod 2775 /srv/al2023-laravel.wingdoor.co.jp
アプリの配置先に移動し、Laravelプロジェクトを作成します。
# アプリの配置先に移動
cd /srv/al2023-laravel.wingdoor.co.jp
# 現在のディレクトリにlaravel/laravelをセットアップ
composer create-project laravel/laravel .
Laravel Jetstreamをインストールし、セットアップします。
# Laravel Jetstreamをインストール
composer require laravel/jetstream
# Laravel Jetstream(Inertia.js)をセットアップ
php artisan jetstream:install inertia
.envの以下の項目を変更します。
APP_URL=http://al2023-laravel.wingdoor.co.jp
APP_LOCALE=ja
APP_FAKER_LOCALE=ja_JP
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=app
DB_USERNAME=laravel
DB_PASSWORD=[設定したパスワード]
マイグレーションを実行して、データベースにusersテーブルなどを作成します。
php artisan migrate:fresh
ここまでセットアップできたら、nginxの設定を変更します。
# /etc/nginx/conf.d/al2023-laravel.wingdoor.co.jp.conf
server {
listen 80;
server_name al2023-laravel.wingdoor.co.jp;
root /srv/al2023-laravel.wingdoor.co.jp/public;
index index.php index.html;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
client_max_body_size 15m;
location ^~ /.well-known/acme-challenge/ {
root /srv/certbot;
default_type "text/plain";
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 180;
}
}
php-fpmの設定を変更します。
# /etc/php-fpm.d/www.conf
user = nginx
group = nginx
nginxとphp-fpmの設定を変更したら、プロセスを再起動します。
また、php-fpmも自動起動されるように設定します。
# nginxを再起動
systemctl restart nginx
# php-fpmを再起動
systemctl restart php-fpm
# php-fpmを自動起動するように設定
systemctl enable php-fpm
ここまでできたら、ブラウザで設定したドメインを開くと、Laravelのトップページが表示されるようになります。

https化(常時SSL化)
EPELリポジトリを追加し、Certbotをインストールします。
CertbotはLet’s Encrypt証明書を簡単に取得および更新するためのツールです。
# Certbotのインストール
dnf install -y certbot
証明書を発行する際に使用されるトークンファイルを保存するディレクトリを作成します。
mkdir /srv/certbot
certbot certonly
で証明書をリクエストします。
今回はトークンファイルで認証する方式(HTTP-01 challenge)の他にも、DNSで認証する方式(DNS-01 challenge)などがあります。
certbot certonly \
--webroot \
-w /srv/certbot \
-d al2023-laravel.wingdoor.co.jp \
-m [メールアドレス] \
--agree-tos
証明書の発行が成功したら、以下のようなメッセージが表示されます。
ここで、fullchain.pem
とprivkey.pem
のパスをnginxの設定ファイルに記入するので、控えておきます。
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for al2023-laravel.wingdoor.co.jp
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/al2023-laravel.wingdoor.co.jp/fullchain.pem
Key is saved at: /etc/letsencrypt/live/al2023-laravel.wingdoor.co.jp/privkey.pem
This certificate expires on 2025-04-05.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
証明書が発行できたら、nginxの設定を変更します。
# /etc/nginx/conf.d/al2023-laravel.wingdoor.co.jp.conf
server {
listen 80;
server_name al2023-laravel.wingdoor.co.jp;
location ^~ /.well-known/acme-challenge/ {
root /srv/certbot;
default_type "text/plain";
}
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
server_name al2023-laravel.wingdoor.co.jp;
ssl_certificate /etc/letsencrypt/live/al2023-laravel.wingdoor.co.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/al2023-laravel.wingdoor.co.jp/privkey.pem;
root /srv/al2023-laravel.wingdoor.co.jp/public;
index index.php index.html;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
client_max_body_size 15m;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 180;
}
}
nginxの設定ファイルを変更できたら、nginxを再起動します。
# nginxを再起動
systemctl restart nginx
再度、ブラウザで設定したドメインを開くと、https化されていることを確認できます。

まとめ
今回は、Amazon Linux 2023でLaravel Jetstreamが動く環境を構築する手順を紹介しました。Amazon Linux 2023は2028年までサポートが行われるため、長期運用に適しています。一方、Amazon Linux 2のサポート終了が近づいているため、早めの移行検討が必要です。
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!