さくらのVPSでlaravel環境構築

この記事では、**さくらインターネットのVPS（CentOS Stream 9）**上にLaravelの開発環境を構築する手順をまとめています。

主に以下のような構成としています。

- Webサーバ: Apache
- PHP: 8.4 以上
- データベース: MariaDB 10.5.27
- フレームワーク: Laravel 11
- OS: CentOS Stream 9 x86_64

# 1.Windowsで.sshフォルダにSSHキーを追加する

### 鍵ファイルを作成
PowerShellを使用。.sshフォルダに移動しコマンドで鍵ファイルを作成する
```powershell
# .sshフォルダへ移動
cd $env:USERPROFILE\.ssh

# SSH鍵の作成（ファイル名を明示的に指定）
ssh-keygen -t ed25519 -C "sakura-centos-key" -f id_ed25519_sakura_centos
```

パスフレーズについてのプロンプトが表示されます：  
```
Enter passphrase (empty for no passphrase):
```
- パスフレーズを設定しない場合：そのまま Enterキー を押してください
- パスフレーズを設定する場合：任意の文字列を入力して Enterキー を押し、再入力を求められたらもう一度入力します

#### SSHキー生成について
| オプション | 意味 |
|:----------|:---- |
| `ssh-keygen` | SSH鍵を生成するためのコマンド（Secure Shell Key Generator）|
| `-t ed25519` | 鍵の種類（type）を指定。<br>→ `ed25519` は高速・安全な楕円曲線暗号方式 |
| `-C "sakura-centos-key"` | 鍵にコメントを付ける（公開鍵の末尾に表示される）。識別用に便利         |
| `-f id_ed25519_sakura_centos` | 出力ファイル名の指定。<br>→ 秘密鍵：`id_ed25519_sakura_centos`<br>→ 公開鍵：`id_ed25519_sakura_centos.pub` |

# 2.VPS側で公開鍵を登録
パスワードなしでSSH接続できるように公開鍵を登録する  
自分はコントロールパネルでサーバーを起動する際にSSHキー登録を行いました。

# 3.TeraTermでSSHログイン
コントロールパネル上で作成された「管理ユーザー名」を入力し「RSA/DSA/ECDSA/ED25519 鍵を使ってログイン」にチェックする。作成した秘密鍵ファイルを指定してSSHログインできることを確認する。

# 4.ユーザー作成
```
# まずroot権限への切り替える
sudo -i
# rootユーザーのパスワード設定
passwd root

# ちなみに別のユーザーに切り替えるには？
su - centos

# ユーザー作成（rootで実行）
adduser {ユーザー名} # 例: admin

# パスワード設定（rootで実行）
passwd admin

# sudo権限を付与（rootで実行）
usermod -aG wheel {ユーザー名}
```

作成したユーザーで公開鍵認証ログインする
```
# 作成ユーザーの .ssh ディレクトリを作成（rootまたはsudoで）
mkdir /home/{ユーザー名}/.ssh
chmod 700 /home/{ユーザー名}/.ssh
chown {ユーザー名}:{ユーザー名} /home/{ユーザー名}/.ssh
```

公開鍵をauthorized_keysに追加
```
# 公開鍵の文字列をファイルに追記
echo "（公開鍵の中身）" >> /home/{ユーザー名}/.ssh/authorized_keys
# 安全に貼り付けたい場合は、nanoやviエディタを使って手動で貼り付けてもOK
nano /home/admin/.ssh/authorized_keys

# 権限の変更
chmod 600 /home/{ユーザー名}/.ssh/authorized_keys
chown {ユーザー名}:{ユーザー名} /home/{ユーザー名}/.ssh/authorized_keys
```
これで、作成したユーザーでもTera Termから公開鍵認証によるSSHログインが可能になります。

# 5.OSの設定・更新
ここからは基本的に作成ユーザーでログインし作業します
```
# パッケージの更新（CentOS Stream 9）
sudo dnf -y update
```

ファイアウォールの設定
```
# firewalldの起動・状態確認
sudo systemctl status firewalld

# 起動
sudo systemctl start firewalld
# 自動起動を有効化（次回起動後も有効に）
sudo systemctl enable firewalld

# 設定の再確認（起動後）
sudo firewall-cmd --list-all
```

エディタをインストール。nanoでも良いがlinux操作に慣れたいこともありvim（viより高機能なバージョン）をインストールする。
```
sudo dnf install -y vim
```

# 6.Apacheのインストール
Apacheをインストールしてブラウザ上から確認します
```
# Apache（httpd）のインストール
sudo dnf install -y httpd

# Apacheの起動 & 自動起動設定
sudo systemctl enable --now httpd

# Apache起動確認
sudo systemctl status httpd
→ active(running)と表示されればOK

# ファイアウォールでHTTP/HTTPSを許可
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

# ファイアウォール設定確認
sudo firewall-cmd --list-services
→ http https ssh などが表示されれば成功です
```
コマンド上ではなくコンパネで接続可能ポートを設定しても良し  
WEB：TCP 80/443 を設定する

ブラウザでアクセスしてApacheのインストールを確認  
http://[VPSのIPアドレス]  
※VPSのIPアドレスは、さくらのコントロールパネルまたは `ip a` コマンドで確認できます。

# 7.PHPのインストール
まずは有効なリポジトリを確認
| コマンド               | 内容                   | 目的                    |
| ------------------ | -------------------- | --------------------- |
| `dnf repolist`     | 有効なリポジトリ一覧           | 基本確認                  |
| `dnf repolist -v`  | 有効なリポジトリの詳細情報付き      | リポジトリのURLやメタデータ確認     |
| `dnf repolist all` | **すべての登録済みリポジトリを表示** | 無効なリポジトリの存在や状態を確認したい時 |

今回はPHP8.4をインストールしたいため新たにリポジトリを導入する
```
# EPELリポジトリを導入（拡張リポジトリ）
sudo dnf install -y epel-release epel-next-release

# Remiリポジトリを導入
# Remiは、PHPの最新バージョンや拡張モジュールを提供する信頼性の高いリポジトリです。
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
```

ここで問題発生。メモリ不足により強制終了してしまうためスワップファイルを一時的に作成して対策します。
エラーにならない場合、次の項目は飛ばしてください。

### スワップファイルの作成
```
sudo fallocate -l 1G /swapfile
```
- fallocate: 指定したサイズの空のファイルを効率的に作成するコマンド。
- -l 1G: 作成するファイルのサイズを 1GB に指定します。
- /swapfile: スワップ領域として使用するファイルの名前と場所。

```
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -h
```
- 600: このパーミッション設定により、ファイルの所有者だけが読み書き可能になります（他のユーザーはアクセス不可）。
- mkswap: 指定したファイルまたはデバイスをスワップ領域として初期化するコマンド。
- swapon: 指定したスワップ領域をシステムで利用可能にするコマンド。
- free: スワップ領域の確認

改めて下記コマンドを実行  
`sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm`

# 8.PHP8.4インストール
```
# 利用可能なPHPバージョンを確認
dnf module list php

# 既存のPHPモジュールをリセット
sudo dnf module reset php -y

# PHP8.4モジュールを有効化（remi提供）
sudo dnf module enable php:remi-8.4 -y

# PHP8.4をインストール
sudo dnf install -y php

# インストールを確認
php -v
```

ついでにLaravel向け拡張モジュールのインストールしておく
```
sudo dnf install -y php-json php-mbstring php-zip php-gd php-pdo php-mysqlnd php-mysqli
```

# 9.MariaDBのインストール
```
# MariaDBサーバー本体とクライアントツールのインストール
sudo dnf install -y mariadb-server mariadb

# MariaDBの起動と自動起動設定
sudo systemctl enable --now mariadb

# 起動確認
sudo systemctl status mariadb

# MariaDBのバージョン確認
mysql -V
```

- 初期セキュリティ設定 いくつか項目を以下のように設定してます  
`sudo mysql_secure_installation`  


| 質問内容                                              | 回答                   |
| ------------------------------------------------- | ---------------------- |
| Enter current password for root (enter for none): | そのままEnter（初期は空）        |
| Set root password?                                | `Y`（rootにパスワードを設定）     |
| Remove anonymous users?                           | `Y`（匿名ユーザー削除）          |
| Disallow root login remotely?                     | `Y`（リモートからのrootログイン禁止） |
| Remove test database and access to it?            | `Y`（テストDB削除）           |
| Reload privilege tables now?                      | `Y`（変更を即反映）            |
| Switch to unix_socket authentication? | `n` Laravel等のWebアプリでパスワード接続が必要なため |

```
# rootユーザーでログイン確認
mysql -u root -p

# ログイン後にユーザーを作成
CREATE USER '{ユーザー名}'@'localhost' IDENTIFIED BY '{パスワード}';
GRANT ALL PRIVILEGES ON *.* TO '{ユーザー名}'@'localhost';
FLUSH PRIVILEGES;
```

# 10.Composerのインストール
PHPのパッケージ管理システムであるcomposerをインストールします。Laravelを構築するには必須になるでしょう。
```
# インストーラーのダウンロード
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# ハッシュ値の検証（安全性チェック）
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

# composerのインストール本体実行
php composer-setup.php

# インストーラーの削除
php -r "unlink('composer-setup.php');"

# composerをシステム全体で使えるようにファイルを移動
sudo mv composer.phar /usr/local/bin/composer

# 最終確認：バージョン表示
composer --version
```

# 11.Node.jsインストール
Laravelフロントエンドのビルドに必要なNode.jsをインストールします
```
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo dnf install -y nodejs

# バージョンの確認
node -v

# Node.jsのパッケージ管理ツール npm のバージョンも確認
npm -v
```

# 12.gitのインストール
github上のLaravelをVPSにデプロイするためgitをインストールします。
```
# gitのインストール(バージョンの確認)
sudo dnf install -y git
git --version

# git用のSSH鍵ペアを作成(ホームディレクトリで作業)
cd ~
ssh-keygen -t ed25519 -C "github-vps-key" -f ~/.ssh/id_ed25519_github

# 公開鍵の内容をコピーしてGithubに登録
cat ~/.ssh/id_ed25519_github.pub
```
SSH接続時の情報を定義する.ssh/config を編集する  
※ `~/.ssh/config` は複数のSSH鍵を使い分けるための設定ファイルです。
```
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
```
```
# 保存後、権限も確認し変更する
chmod 600 ~/.ssh/id_ed25519_github

# 動作確認(エラーが出なければSSH接続成功です)
ssh -T git@github.com
```
これで無事githubからlaravelプロジェクトをcloneできるようになりました

# 13.Webサーバーの設定
laravel用のApache設定ファイルを作成します。ファイル名は任意ですがわかりやすい方が良いと思います。
/etc/httpd/conf.d/laravel.confの作成・設置
``` laravel.conf
<VirtualHost *:80>
    ServerName {ホスト名を指定}
    # laravelを設置したディレクトリに各自合わせてください
    DocumentRoot /var/www/html/app/public

    <Directory /var/www/html/app/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/laravel_error.log
    CustomLog /var/log/httpd/laravel_access.log combined
</VirtualHost>
```
Apacheを再起動して設定を反映させます  
`sudo systemctl restart httpd`

# 14.Laravelの構築
ここからはlaravelを設置したディレクトリに移動して基本的に作業します
```
# 依存パッケージのインストール
composer install

# envファイルの編集(DBの接続情報など設定します)
cp .env.example .env
sudo vim .env

# アプリケーションキーの生成
php artisan key:generate

# フロントエンド構築のため依存関係パッケージのインストールとソースコードのビルド
npm install
npm run build

# パーミッションの調整
sudo chown -R apache:apache /var/www/html/app
sudo chmod -R 775 storage bootstrap/cache
```
ブラウザで `http://[VPSのIPアドレス]` にアクセスし、Laravelの初期画面が表示されれば成功です  
お疲れ様でした！！