また同じ環境を作りたくなったときのためにメモ。
前提
既にVPSを作成していること。
ドメインも取得済み。
OSはRockylinux(CentOS系)。
CentOS、RedHat、Almalinuxでも大丈夫だと思います。
今回SELinuxは無効にしている。有効な場合はSELinuxの設定も必要になります。
sestatus
SELinux status: enabled か disabled
必要なソフトをインストール
# システムアップデート
sudo dnf update -y
# EPELリポジトリを追加
sudo dnf install -y epel-release
# PHP 8.3のインストール
sudo dnf install -y php php-cli php-fpm php-mysqlnd php-zip php-gd \
php-mbstring php-curl php-xml php-bcmath php-json php-intl \
php-opcache php-pdo php-sodium
# Composerのインストール
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
# Nginxのインストール
sudo dnf install -y nginx
# MariaDBサーバーのインストール
sudo dnf install -y mariadb-server mariadb
# Node.js/npmのインストール(Vite用)
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo dnf install -y nodejs
# Gitのインストール
sudo dnf install -y git
DB設定
# MariaDBを起動・有効化
sudo systemctl start mariadb
sudo systemctl enable mariadb
# MariaDBバージョン確認
mysql --version
# MariaDBセキュリティ設定
sudo mysql_secure_installation
Enter current password for root: [Enter(初めて設定するので空Enter)]
Switch to unix_socket authentication: n
Change the root password?: y
New password: [強力なパスワードを入力]
Re-enter new password: [同じパスワードを再入力]
Remove anonymous users?: y
Disallow root login remotely?: y
Remove test database?: y
Reload privilege tables now?: y
mysql_secure_installationで問われる質問で、軽く調べたものを以下メモ。
- Switch to unix_socket authentication
これをyesにするとパスワード無しでrootにログインできるらしいけど、だいたいはアプリからパスワード使ってログインするので基本はNoで良さそう。 - Remove anonymous users?
使用しない匿名ユーザーを残しておくのはリスクでしかないのでYes。 - Disallow root login remotely?
rootユーザーにリモートログインはリスクだからYesで禁止する。 - Remove test database?
testデータベースは今使う予定が無いし、使いたくなったら好きな名前で作るからYesで削除。 - Reload privilege tables now?
今までの設定を即時反映したいので当然Yes。
# MariaDBにログイン
sudo mysql -u root -p
以下をMariaDB内で実行。
CREATE DATABASE 任意のDB名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER '任意のユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON 作成したDB名.* TO '作成したユーザー名'@'localhost';
FLUSH PRIVILEGES;
SHOW DATABASES;
EXIT;
アプリケーションのデプロイ
# アプリケーション用ディレクトリを作成
sudo mkdir -p /var/www
cd /var/www
# Gitからクローン(または直接アップロード)
sudo git clone <your-repository-url> プロジェクト名
# またはSCPでアップロード
# scp -r /path/to/local/プロジェクト名 user@your-vps:/var/www/
cd プロジェクト名
# 所有者を変更
sudo chown -R nginx:nginx /var/www/プロジェクト名
sudo chmod -R 755 /var/www/プロジェクト名
sudo chmod -R 775 /var/www/プロジェクト名/storage
sudo chmod -R 775 /var/www/プロジェクト名/bootstrap/cache
Laravelアプリの設定
以下で失敗したら、
Composer依存関係のインストールで失敗 →「Composerインストールで失敗した場合」
npm installで失敗 → 「npmインストールで失敗した場合」
envファイルに必要なアプリの環境変数を設定する。
今回の例だとDBぐらいですが、皆さんがそれぞれ作るアプリで必要な環境変数を設定する感じです。
cd /var/www/プロジェクト名
# Composer依存関係のインストール
composer install --no-dev --optimize-autoloader
# npm依存関係のインストールとビルド
npm install
npm run build
# .envファイルを作成
sudo cp .env.example .env
sudo vi .env
# アプリケーションキーを生成(作成は1回のみ!)
sudo php artisan key:generate
# マイグレーション実行
sudo php artisan migrate --force
# キャッシュクリア・最適化
sudo php artisan config:cache
sudo php artisan route:cache
sudo php artisan view:cache
sudo php artisan optimize
# ストレージリンク作成
sudo php artisan storage:link
Composerインストールで失敗した場合
# 1. Gitの所有権エラーを解消
git config --global --add safe.directory /var/www/プロジェクト名
# 2. ディレクトリの所有権と権限を修正
sudo chown -R $USER:$USER /var/www/プロジェクト名
sudo chmod -R 755 /var/www/プロジェクト名
sudo chmod -R 775 /var/www/プロジェクト名/storage
sudo chmod -R 775 /var/www/プロジェクト名/bootstrap/cache
# 3. vendorディレクトリを作成
mkdir -p /var/www/プロジェクト名/vendor
# 4. Composerインストールを再実行
cd /var/www/プロジェクト名
composer install --no-dev --optimize-autoloader
# Composerインストール完了後
sudo chown -R nginx:nginx /var/www/プロジェクト名
sudo chmod -R 755 /var/www/プロジェクト名
sudo chmod -R 775 /var/www/プロジェクト名/storage
sudo chmod -R 775 /var/www/プロジェクト名/bootstrap/cache
npmインストールで失敗した場合
# ディレクトリの所有権を現在のユーザーに変更
sudo chown -R $USER:$USER /var/www/プロジェクト名
# npm installを実行
cd /var/www/プロジェクト名
npm install
# ビルドを実行
npm run build
# 完了後、nginx用に所有権を戻す
sudo chown -R nginx:nginx /var/www/プロジェクト名
sudo chmod -R 755 /var/www/プロジェクト名
sudo chmod -R 775 /var/www/プロジェクト名/storage
sudo chmod -R 775 /var/www/プロジェクト名/bootstrap/cache
Nginx設定
# Nginx設定ファイルを作成
sudo vi /etc/nginx/conf.d/プロジェクト名.conf
server {
listen 80;
server_name your-domain.com www.your-domain.com;
root /var/www/プロジェクト名/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index 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:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
client_max_body_size 100M;
}
PHP-FPM設定
# PHP-FPM設定を編集
sudo vi /etc/php-fpm.d/www.conf
以下を確認、変更
user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
サービスの起動
# PHP-FPMを起動・有効化
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
# Nginxを起動・有効化
sudo systemctl start nginx
sudo systemctl enable nginx
# 設定をテスト
sudo nginx -t
# Nginxを再起動
sudo systemctl restart nginx
ファイアウォール設定
ファイアウォールでHTTP/HTTPSを許可。ConohaVPSを使っている場合はConohaコンソールでセキュリティグループも追加。
# HTTP(80)とHTTPS(443)を許可
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# 確認
sudo firewall-cmd --list-services
SSL証明書の設定(Let's Encrypt)
# Certbotのインストール
sudo dnf install -y certbot python3-certbot-nginx
# SSL証明書の取得
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# 自動更新の確認
sudo certbot renew --dry-run
テーブル作成
migrationファイルの内容が反映される。
cd /var/www/プロジェクト名
# 1. 状態確認
php artisan migrate:status
# 2. マイグレーション実行
php artisan migrate --force
# 3. キャッシュクリア
php artisan optimize:clear
php artisan optimize
Laravel Queue・Scheduler設定
Laravelはデフォルトで重い処理(メール送信・動画など)はキューに保存して非同期で行うようです。
.envでQUEUE_CONNECTION=databaseの設定が入っていますが、jobsテーブルがキューの役割をしているみたい。
php artisan queue:workでキューが動くみたいですが、再起動などすると再度実行する必要があるため、何があっても自動実行してくれるように以下の設定をします。
# Supervisorのインストール(Queue処理用)
sudo dnf install -y supervisor
# Supervisor設定
sudo vi /etc/supervisord.d/laravel-worker.ini
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/プロジェクト名/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=nginx
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/プロジェクト名/storage/logs/worker.log
stopwaitsecs=3600
以下はスケジュール実行の設定。
スケジュール実行する処理を入れていないのであれば不要ですが、将来入れたときに「ローカルでは動くのに本番では動かない?!」とならないために初期設定のときに入れておくみたい。
sudo crontab -e -u nginx
* * * * * cd /var/www/プロジェクト名 && php artisan schedule:run >> /dev/null 2>&1
動作確認
ここまで終わったら、https://ドメイン名でアクセスできるはず。
# ログを確認
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/www/プロジェクト名/storage/logs/laravel.log
# ステータス確認
sudo systemctl status nginx
sudo systemctl status php-fpm
sudo systemctl status mysqld
終わりに
ふー何とか終わった・・
GitHub Copilotに聞いて、意味を理解しながら進めていったけど、思うようにいかず、意外と時間がかかった。
自力で構築はかなり大変なので本当にAI様様だと感じました^^;