UbuntuにLaravelをデプロイする

今回の環境

開発機のWindows11に仮想マシンを作成。
仮想マシンはUbuntu 22.04.2 LTSにて構築。

必要なソフトのインストール

今回は「Nginx」「MySQL」「PHP」で環境を構築していきます。

Nginx

sudo apt update
sudo apt install nginx -y

動作確認は以下コマンド

sudo systemctl status nginx

IPアドレスを指定してブラウザからアクセスするとNginxのウェルカムページが表示されます。
表示されない場合はStatusが「active」になっていることを確認してください。

MySQL

sudo apt install mysql-server -y

セキュリティポリシーの設定

特に本番環境においてはセキュリティを高めるために設定を行っておきましょう。

sudo mysql_secure_installation
Would you like to setup VALIDATE PASSWORD component?

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
パスワード強度のチェックの有効/無効の設定。

推奨:y(有効)

There are three levels of password validation policy:

パスワードの強度ポリシーを選択する。

0: 弱いポリシー(最低8文字のみ)
1: 中程度のポリシー(8文字以上、数字、大小英字、特殊文字を含む)
2: 強いポリシー(中程度+辞書ファイルのチェック)

推奨:1 or 2
※ここでのポリシー選択によっては、rootユーザーのパスワード変更が発生する可能性があります

Remove anonymous users?

匿名ユーザーの削除を行うか。

推奨:y(削除)

Disallow root login remotely?

リモートrootログインの無効化を行うか。

推奨:y(無効化する)

Remove test database and access to it?

テストデータベースの削除を行うか。
デフォルトで作成される「test」というデータベースのこと。不要なことがほとんど。

推奨:y(削除)

Reload privilege tables now?

設定変更をすぐに反映したいため「y」で変更を反映する。

PHP

PHPとLaravel動作に必要な追加モジュールをインストールします。

sudo apt install php php-cli php-fpm php-json php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath
php -v

NginxとPHPの連携設定

設定ファイルの書き換えを行います。

sudo vim /etc/nginx/sites-available/default

serverブロックに以下を追記します。

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}

PHPのバージョン部分は自分の環境のバージョンに書き換えてください。

記述後にテストを行い、問題がなければ再起動を行います。

sudo nginx -t
sudo systemctl reload nginx

PHPの動作検証

WebルートディレクトリにPHPファイルを作成しアクセスを行います。

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

IPアドレス/info.php にアクセスして、PHPのサーバー情報が表示されればPHP + Nginxが正しく動作しています。
サーバー情報が見えてしまうため、動作検証後はinfo.phpを削除しておいた方が良いと思います。

Lravelのためのソフトのインストール

Composer

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version

インストール、パスの設定(システム全体で利用可能にする)、バージョンチェックを行います。
最後のコマンドでバージョン情報が出力されれば完了です。

Node,js(npm)

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
npm -v

最後のバージョン確認コマンドでバージョンが出力されればOK。

Laravelプロジェクトの準備

Laravelプロジェクトを準備する。以下を参考に、必要箇所を読み替えてください。
ドキュメントルートが「/var/www/html」なので、ここにプロジェクトのディレクトリが配置されるように用意すること。
FTPでのアップロードや、Git経由でのソースコードの取得が必要になります。Laravelアプリケーションの設定としては

  1. DB、ユーザーの作成
  2. .envの作成
  3. DB接続設定
  4. migrationの実行
  5. seederの実行

などが必要になります。MySQLのログインは「sudo mysql」とすることでrootユーザーログインができます。パスワードが設定されている場合はパスワードを確認してパスワードを利用してログインしましょう。(環境によって異なります。私がこの手順を実行した際にはパスワード無しでログインができました)。

以下、プロジェクトが「/var/www/html」に配置されていることを前提に進みます。

ドキュメントルートの変更

続いてドキュメントルートの変更を行います。

ドキュメントルートはWebサーバーアドレスにアクセスした際に表示されるディレクトリになります。
「Webサイトアドレス/ディレクトリ」とすることで、ドキュメントルート下のディレクトリにアクセスすることも出来るので、複数のWebサイトやシステムを動作させることも可能です。

「Webサイトアドレス/ディレクトリ」の形でLaravelアプリケーションを動作させようとすると、少し設定が複雑になるので、ドキュメントルートをLaravelアプリケーションにしていきます。

Nginxのサイト設定を追加

先ほども編集した「/etc/nginx/sites-available/default」を修正していきます。

root /var/www/html;

の記述をみつけてください。これがドキュメントルートです。
Laravelアプリケーションの「public」ディレクトリをドキュメントルートに設定するため、

root /var/www/html/lara-app/public;

と書き換えます。Laravelプロジェクトのディレクトリ名は自分のものに書き換えましょう。

続いて、index.phpを読み取るための設定を記述します。

index index.html index.htm index.nginx-debian.html;

この記述で最初に読み取るファイルを設定します。ここにindex.phpを追加します。

index index.php index.html index.htm index.nginx-debian.html;

書き換え後、Nginxの再起動を行います。

sudo systemctl reload nginx

以上で、Webサイトアドレス(IPアドレス)にアクセスするとLaravelプロジェクトが表示されます。
お疲れさまでした。

よくあるエラー:403 Forbidden

Laravelのアプリケーションディレクトリの権限設定が不足していると発生することがあります。

sudo chmod -R 755 /var/www/html/lara-app/public
sudo chown -R www-data:www-data /var/www/html/lara-app/storage
sudo chown -R www-data:www-data /var/www/html/lara-app/bootstrap/cache

などのコマンドで、必要なディレクトリにWebソフト(Nginxなど)がアクセスできるように設定しましょう。権限を付与するユーザーはNginxの場合

sudo cat /etc/nginx/nginx.conf

で確認できるファイルに

user www-data;

で定義されています。