🙌

LaravelアプリをLightsailにdeployしてみる

2024/09/02に公開

既存のLaravelアプリをLightsailにdeployする

概要

Laravelアプリをデモで公開したかったので、安価なAWS Lightsailにdeployしていきます。
デモでしか使わないので、LightsailにDBなど全部入れていきます。
ユーザーや設定などもデフォでいくので、本番運用の場合は気をつけてくださいね。

Lightsailは料金が分かるところが良いですね。
https://docs.aws.amazon.com/ja_jp/lightsail/latest/userguide/what-is-amazon-lightsail.html

説明しないこと

  • AWSのアカウント作成方法
  • Laravelについて
  • SSL化について

構築する環境

  • php 7.4
  • MySQL 8.0.39
  • Nginx
  • Laravel

STEP

  1. Lightsailでインスタンス作成
  2. 必要なツールなどを入れる
  3. 設定

Lightsailでインスタンス作成

AWSのコンソールで検索する

インスタンスの作成

「create instance」

今回はOSだけ入れました。
Ubuntuの22.04LTSにしました。

データベースも入れるので、月$12にしました。
90日無料枠ありますね。
これ以下だと、エラーでデータベースを入れれなかったことがあります。

「Change SSH key pair 」で、SSHのkeyも作っときます。
新しく作成した場合は、鍵をダウンロードしておいてください。

インスタンスを作成で、起動まで少し時間かかりますが、すぐに出来上がります。

インスタンスが出来たら、一応HTTPSの443ポートを追加しておきます。

これ以降はSSH接続してターミナルで作業します

必要なツールをインストール

SSH接続して、ターミナルで作業しましょう。
ユーザーは「ubuntu」です。

アップデート

sudo apt-get update
sudo apt-get upgrade -y

ツールをインストール

git 、vimなども入れておきます

# tools
sudo apt-get install -y git docker.io vim unzip curl wget software-properties-common

# php7.4
sudo add-apt-repository ppa:ondrej/php -y
sudo apt-get update
sudo apt-get install -y php7.4 php7.4-fpm php7.4-mysql php7.4-xml php7.4-mbstring php7.4-curl php7.4-zip php7.4-bcmath php7.4-gd

# phpのバージョン確認
php -v
> PHP 7.4.33

# php-7.4-fpmが動いているか確認
sudo systemctl status php7.4-fpm

# Nginxのインストール
sudo apt-get install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx

# Nginxの確認
sudo systemctl status nginx

# MySQL 8.0.18のインストール
wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb

sudo apt-get update
sudo apt-get install mysql-server

mysql --version
> mysql  Ver 8.0.39-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))

# MySQLへの接続確認(rootでパスワードもなし)
sudo mysql -u root -p

プロジェクトをgit cloneしておく

場所は、

/var/www/ディレクトリ名

に入れました。例えば、/var/www/demo など。

権限を変えておきます

sudo chown -R ubuntu:ubuntu /var/www/demo
sudo chmod -R 755 /var/www/demo

下記だとうまくいかなかったです。

sudo chown -R www-data:www-data /var/www/ディレクトリ名
sudo chmod -R 755 /var/www/ディレクトリ名

DBのユーザー作っておきます。データもバックアップを入れておきます。

※関係ない方はこの部分はSKIPしてください。

🔽MySQLへ接続

sudo mysql -u root -p

🔽接続後

mysql> CREATE DATABASE demo;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| demo               |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

# adminユーザーとパスワードを作る
CREATE USER 'admin'@'localhost' IDENTIFIED BY '任意のパスワード';
# adminにdemoの全ての権限を与える
GRANT ALL PRIVILEGES ON demo.* TO 'admin'@'localhost';
# 変更を適用
FLUSH PRIVILEGES;

EXIT;

.envを変えておきます

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=demo
DB_USERNAME=admin
DB_PASSWORD=任意のパスワード

バックアップのDBを入れる

事前にデータをエクスポートしておいたので、SCPでサーバーにアップして、下記のコマンドで入れました。

ubuntu@ip-172-26-13-91:~$ mysql -u admin -p demo < /home/ubuntu/demo_20240101.sql
Enter password: 

Nginxの設定 サンプルを表示

うまくページが表示されるか見てみます
ページは、
http://パブリックIPアドレス
です。

php infoを表示してみる(確認したら削除してください)

echo "<?php phpinfo(); ?>" | sudo tee /var/www/フォルダ名/public/phpinfo.php

Nginxの設定

demoという名前のファイル作ります

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

🔽設定

server {
    listen 80;
    server_name 12.345.67.89;  # ここにドメイン名またはIPアドレスを入力

    root /var/www/demo/public;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

編集したら

# シンボリックリンク作成
sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/
sudo nginx -t  # 設定ファイルにエラーがないか確認
sudo systemctl reload nginx

表示確認

http://パブリックIPアドレス/phpinfo.php
確認できたらphpinfoは削除

sudo rm /var/www/フォルダ名/public/phpinfo.php

Laravelの依存関係をインストール

cd /var/www/demo
php composer.phar install

やらないこと

  • Laravelのアプリケーションキー作成はSKIP(既存のキーが.envに登録済)
  • データベースマイグレート(直接インポートしたので)

キャッシュクリア

php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear

Nginxの設定を変更 Laravelが表示されるように。

下記の記事を参考にしました
https://readouble.com/laravel/5.8/ja/deployment.html#:~:text=サーバ設定-,Nginx,-Nginxを実行

server {
    listen 80;
    server_name 12.345.67.89;  # ここにドメイン名またはIPアドレスを入力
    root /var/www/demo/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

nginxをリロード

sudo nginx -t  # 設定ファイルにエラーがないか確認
sudo systemctl reload nginx

以上でアプリが表示されて、動作も問題なければOK

その他

デモなのでSSLなどはやってません。
こうやってコマンドでインストールしながら構築していくのも楽しいですね。

Discussion