Vagrant で Laravel12環境構築

Windows環境に、Vagrant(AlmaLinux)でLaravel12が動く環境構築をしていきます。
VagrantとVirtualBoxはすでにwindowsに導入されている前提で進めていきます。
docker未使用。

# 環境構成
- AlmaLinux9(2025/5時点最新)
- Nginx 1.27.x
- MariaDB 11.7.2
- PHP 8.4.6
- Laravel 12

# VM構築
まずはサクッとVMを作っていきます。

### vagrant pluginインストール
vagrant plugin 入れてなかったら下記実行
入れてたらskipで

### vbguest
```bash:cmd

# 任意の場所に移動
cd C:\Users\[user_name]\Documents

# 修正されたvbguestプラグインをgit clone
git clone https://github.com/dheerapat/vagrant-vbguest.git

# cloneしたディレクトリに移動
cd vagrant-vbguest

# gem build
"C:\Program Files\Vagrant\embedded\mingw64\bin\gem" build vagrant-vbguest.gemspec


# vbguestをインストール
vagrant plugin install ./vagrant-vbguest-0.32.1.gem

```

:::note info
**vbguestについて**

**VirtualBox Guest Additions**という
VirtualBox が提供する仮想マシン(ゲストOS)にインストールする追加機能のセットがあります。
(ゲストOSとホストOS(windows)の連携を強化するためのコンポーネント)

Vagrantで起動したVMがVirtualBoxのバージョンとかみ合わず、
Guest Additionsが古いままだと、この追加機能がうまく動作しなかったりします。

vagrant-vbguestは、Guest Additionsのバージョンをホストと同期させたり、自動的にインストール・更新してくれる便利なプラグインです。

:::

:::note warn
**なぜわざわざGitCloneしたのか？**
本来であれば
```
vagrant plugin install vagrant-vbguest
```
でインストール可能です。
ですが、
Rubyのバージョンが上がったことで、File.exists?(path)がFile.exist?(path)に変更されたため
最新のvbguest(0.32.0)だとエラーが発生しています。
その為、このバグに対応しているものをわざわざcloneしてきています。

詳しくは以下を参照。
:::

https://qiita.com/nakazii-co-jp/items/074c64f5e72f06c94b25

### vagrant設定・接続
vagrantで使用できるAlmaLinuxのboxファイルは[almaLinux wiki](https://wiki.almalinux.org/installation/vagrant-boxes.html)や
[HashiCorp](https://portal.cloud.hashicorp.com/vagrant/discover/almalinux)を確認してください。

```shell:cmd
cd [作業用フォルダ]
ex) cd C:\Users\[user_name]\Documents\vagrant\laravel

# vagrant初期化
vagrant init almalinux/9 --box-version 9.5.20241203
```

### Vagrantfile編集
```diff:Vagrantfile
- # config.vm.network "private_network", ip: "192.168.33.10"
+   config.vm.network "private_network", ip: "192.168.33.10"

# ここではwindowsにshareというフォルダを作ってvagrantと同期させます
- # config.vm.synced_folder "../data", "/vagrant_data"
+   config.vm.synced_folder "./share", "/var/www/laravel", create: true

# 標準の共有を無効化
- # config.vm.synced_folder ".", "/vagrant", disabled: true
+   config.vm.synced_folder ".", "/vagrant", disabled: true

+   # メモリとCPUを増やす（例: メモリ4GB、CPU 2コア）
+   config.vm.provider "virtualbox" do |vb|
+     vb.memory = "4096"
+     vb.cpus = 2
+   end
```

```shell:cmd
# vagrant 起動
vagrant up

# vagrant接続
vagrant ssh
```

### VM(AlmaLinux)設定
```bash:bash
# SELINUX設定確認
getenforce
  > Permissive

# SELINUX無効化
cd /etc/selinux/

# バックアップファイル作成
sudo cp -p config config.org

# configファイル編集
sudo vi config
```

```diff:config
- SELINUX=permissive
+ SELINUX=disabled
```

```bash:bash
# タイムゾーン設定
sudo timedatectl set-timezone Asia/Tokyo

# 確認
timedatectl

# Vimと日本語パッケージとロケール(言語)パッケージ追加
sudo dnf install -y vim langpacks-ja glibc-langpack-ja

# 日本語化
sudo localectl set-locale LANG=ja_JP.UTF-8

# 反映
source /etc/locale.conf

# 確認
localectl status
```

### 各種パッケージインストール
```bash:bash
# epelリポジトリの追加
sudo dnf -y install epel-release

# ホストOSとゲストOSで連携するのに必要なパッケージとwgetのインストール
sudo dnf -y install kernel-devel kernel-headers dkms gcc gcc-c++ wget

# 全体パッケージの更新
sudo dnf -y update

#VM抜けて再起動
exit
vagrant reload

#再接続
vagrant ssh

# SELINUX設定確認
getenforce
  > Disabled
```

### firewall設定
```bash:bash
# firewalldインストール
sudo dnf install -y firewalld

# firewall起動
sudo systemctl start firewalld

# 自動起動設定
sudo systemctl enable firewalld

# firewall設定(http:80/https:443ポート開放)
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent

# 再起動
sudo firewall-cmd --reload

#反映確認
sudo firewall-cmd --list-all-zones

  >
    public (active)　←activeになっている部分を確認
    target: default
    icmp-block-inversion: no
    interfaces: eth0 eth1
    sources:
    services: dhcpv6-client http https ssh　←httpとhttpsがあればOK
```

# Nginx導入＆設定

```bash:bash
# Nginxインストール
sudo dnf -y install nginx

# 設定ファイル作成
sudo vim /etc/nginx/conf.d/default.conf
```

```nginx:default.conf(新規作成)
server {
  listen 80 default_server;
  server_name localhost;
  root /var/www/laravel/public;
  index index.php index.html;

  # アップロードサイズ制限(default 1MB)
  client_max_body_size 20M;

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

  # php-fpm設定
  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/run/php-fpm/www.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
  }

  # キャッシュの設定
  location ~ .*\.(jpg|gif|png|css|js|ico|woff) {
    expires 10d;
    access_log off;
    log_not_found off;
  }
}
```

```bash:bash
# nginx起動
sudo systemctl start nginx

# 自動起動設定
sudo systemctl enable nginx

# 状態確認
systemctl status nginx
  > Active: active (running) ←になっていればOK
```

# PHP導入＆設定

```bash:bash
# 既存phpパッケージの確認(確認して無ければ次はskip)
dnf list installed | grep php

# 既存phpパッケージの削除
sudo dnf remove php*
```

### 手順

参考：[RemiでCentOS7にPHP8をインストールする](https://qiita.com/C_HERO/items/1512ba1e33c330c9ab0d)
公式：https://rpms.remirepo.net/wizard/

公式で
`Operating system`
`Wanted PHP version`
`Type of installetion`
をそれぞれ選択するとコマンドが出てくるのでそれに従う

```bash:bash
# Remiリポジトリの追加
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

# yum-utilsパッケージのインストール(yum-config-managerコマンドの追加)
sudo dnf -y install dnf-utils

# php8.4のインストール
sudo dnf -y install php84

# php本体のパス確認
which php84

# シンボリックリンクの設定(/usr/bin/php84は上記で出たパスに書き替え)
sudo ln -sf /usr/bin/php84 /usr/bin/php

# どこでもphpが叩けるかの確認
php -v
```

### PHPモジュールの導入
```bash:bash
# 現在のモジュール確認
php -m

## 現在のモジュールと推奨されているモジュールを比較して、差分を書けばOK
## 但し、php-fpm と php-mysqlnd は書いてなくても必要です！

# モジュールのインストール
sudo dnf -y install php-fpm php-mysqlnd php-dom php-imagick php-mbstring php-openssl php-pcre php-xml php-zip php-pear
```

### PHP設定

#### php.iniの設定について
参考：[初心者向け CentOS7.9 に PHP8.0をインストール](https://shimaichi.blog/centos7-php8/)

```bash:bash
# php.iniの場所確認
php -i | grep php.ini

# バックアップ作成
sudo cp -p /etc/php.ini /etc/php.ini_bk

# php.ini編集
sudo vim /etc/php.ini
```

```diff:php.ini
# phpバージョンの非表示
- expose_php = On
+ expose_php = Off

# POSTできるデータサイズの変更
- post_max_size = 8M
+ post_max_size = 20M

# アップロードできるファイルサイズの変更
- upload_max_filesize = 2M
+ upload_max_filesize = 20M

# タイムゾーンの変更
- ;date.timezone =
+  date.timezone = "Asia/Tokyo"

# 日本語対応(マルチバイト対応)
- ;mbstring.language = Japanese
+  mbstring.language = Japanese

- ;mbstring.internal_encoding =
+  mbstring.internal_encoding = UTF-8

- ;mbstring.http_input =
+  mbstring.http_input = auto
```

### php-fpm設定
```bash:bash
# バックアップ作成
sudo cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_bk

# www.conf編集
sudo vim /etc/php-fpm.d/www.conf
```

```diff:www.conf
- user = apache
+ user = nginx

- group = apache
+ group = nginx
```

```bash:bash
# php-fpm起動
sudo systemctl start php-fpm

# php-fpm自動起動設定
sudo systemctl enable php-fpm
```

:::note warn
動かした際にSessionがpermissionエラーとなる場合があります。
その場合は下記コマンドを実行。
```bash:bash
# php sessionの所有者/グループをnginxに変更
sudo chown -R nginx:nginx /var/lib/php/session
```
:::

# MariaDB導入＆設定
公式サイトからリポジトリを確認。
https://mariadb.org/download/

- MariaDB Server Repositoriesタブを選択し、各セレクトボックスで以下を選択する

  - **Choose a distribution**
　⇒ Red Hat Enterprise Linux9

  - **Choose a MariaDB Server version**
　⇒ 11 Rolling (最新を選択)

  - **Mirror**
　⇒ 近いところを選択(基本はデフォルトで選択される) <br><br>

- 以下のようなテキストが表示されるのでコピーする
 
 ```text:text
# MariaDB 11 Rolling RedHatEnterpriseLinux repository list - created 2025-05-22 03:30 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/11.rolling/rhel/$releasever/$basearch
baseurl = https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/11.rolling/rhel/$releasever/$basearch
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
```

### リポジトリ追加
```bash:bash
sudo vim /etc/yum.repos.d/MariaDB.repo
```

- 先程コピーしたテキストを張り付けて保存

### MariaDBインストール
```bash:bash
# パッケージキャッシュ更新
sudo dnf makecache

# MariaDB インストール
sudo dnf install -y MariaDB-server MariaDB-client
```

### MariaDB設定

```bash:bash
# my.cnf編集(設定ファイル)
sudo vim /etc/my.cnf
```

```diff:my.cnf(mysqldブロックに追加する。なければ新たに追加)
+ [mysqld]
+ character-set-server = utf8
+ innodb_buffer_pool_size = 512M
```

:::note info
`innodb_buffer_pool_size`については下記サイトを参照

[三流エンジニアの落書き帳](https://koreshiki-nanno.hatenablog.com/entry/2020/12/11/233628)

MySQL8.0.3から登場した
`innodb_dedicated_server`についても要チェック

[MySQL 道普請便り第92回　innodb_dedicated_serverによるbuffer_poolの割り当て](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0092)
:::

```bash:bash
# mariaDB起動
sudo systemctl start mariadb

# mariaDB自動起動設定
sudo systemctl enable mariadb
```

### rootユーザーパスワード設定(セキュリティ初期設定)
```
# セキュリティ初期設定
sudo mariadb-secure-installation
```

```text:対話モード
Enter current password for root:　　←何も入力せずにEnter押下

Switch to unix_socket authentication [Y/n] ← OSのrootユーザーとしてログインしていれば、MariaDB のrootユーザーにパスワードなしでログインできるようになる設定。ローカルなので[Y]

Change the root password? [Y/n] ← MariaDBのrootユーザーのパスワードを変えるかなので[Y]

New password:  ←新しいパスワードを入力(出来れば大小文字、数字、特殊文字含む8文字以上で)
Re-enter new password:　←再度同じパスワードを入力

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]: ←匿名ユーザーを消すが聞かれているので[Y]

Disallow root login remotely? [Y/n]:　←rootユーザーのリモートログインを禁止するか[Y]

Remove test database and access to it? [Y/n]:　←テスト用のデータベースを削除してアクセスしますか？[Y]

Reload privilege tables now? [Y/n]: ←特権テーブルを更新するかなので[Y]

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB! ←これが出ればOK
```

### MariaDBログイン
```
# MariaDB ログイン
mariadb -uroot -p

Enter password: ←表示されないので注意。先ほど設定したパスワードを入力
```

### Laravel用DB作成
```
# DB作成＆文字コード、照合順序セット
CREATE DATABASE laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# ユーザー作成(必要であれば)
CREATE USER 'laravel'@'localhost' IDENTIFIED BY 'password';

# 権限付与(必要であれば)
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel'@'localhost';
# 反映
FLUSH PRIVILEGES;
```

# Laravel導入＆設定

### Composer導入
[Composer公式サイト](https://getcomposer.org/)からDownloadコマンドを取得する。

以下の**Command-line installation**をコピーしてコマンドを実行する
https://getcomposer.org/download/

```bash:bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'.PHP_EOL; } else { echo 'Installer corrupt'.PHP_EOL; unlink('composer-setup.php'); exit(1); }"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

そのちょっと下くらいに、
>composer.phar into a directory on your PATH, so you can simply call composer from any directory (Global install), using for example:
```
sudo mv composer.phar /usr/local/bin/composer
```

と書いてありますが。
要はcomposerコマンドをどこからでも叩けるように配置し直しています。
```/usr/local/bin/```だと恐らく、呼び出せないと思うので```/usr/bin```に配置します。

```
sudo mv composer.phar /usr/bin/composer
```

```bash:bash
# Composerコマンド確認
composer --version
>
Composer version 2.8.9 2025-05-13 14:01:37
PHP version 8.0.30 (/usr/bin/php)
Run the "diagnose" command to get more detailed diagnostics output.
```

### Laravelインストール

詳しくは[公式ドキュメント](https://readouble.com/laravel/12.x/ja/installation.html)を参照。

```
# ディレクトリ所有者、権限変更
sudo chown -R vagrant:nginx /var/www

# ディレクトリ移動
cd /var/www/

# Laravelインストール
composer create-project laravel/laravel laravel
```

:::note info
Laravelインストールコマンドのフォーマット
```
composer create-project laravel/laravel:[バージョン指定] [laravelプロジェクトフォルダ名]
```

```
ex) composer create-project laravel/laravel:^10.0 laravel-app
```
:::

- 以下のようにsuccessfullyと実行結果が出力されればOK

```batch:実行結果
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

   INFO  Discovering packages.

  laravel/sail ................................................................................................................................ DONE
  laravel/sanctum ............................................................................................................................. DONE
  laravel/tinker .............................................................................................................................. DONE
  nesbot/carbon ............................................................................................................................... DONE
  nunomaduro/collision ........................................................................................................................ DONE
  nunomaduro/termwind ......................................................................................................................... DONE
  spatie/laravel-ignition ..................................................................................................................... DONE

83 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force

   INFO  No publishable resources for tag [laravel-assets].

Found 3 security vulnerability advisories affecting 3 packages.
Run "composer audit" for a full list of advisories.
> @php artisan key:generate --ansi

   INFO  Application key set successfully.
```

### Laravelの設定

これ以降、windows側 `[作業用フォルダ]/share` と
linux側 `/var/www/laravel` が同期されているので、
ファイル編集時はVSCodeで当該ファイルを編集しても良いですし
vimで操作してもどちらでもOKです。お好みで。

#### 権限周り再設定
```
# ディレクトリ所有者、グループ変更
sudo chown -R vagrant:nginx /var/www/laravel

# ディレクトリパーミッション設定
sudo find /var/www/laravel -type d -exec chmod 755 {} \;

# storage/cacheディレクトリのパーミッション設定
sudo chmod -R 775 /var/www/laravel/storage /var/www/laravel/bootstrap/cache

# ファイルのパーミッション設定
sudo find /var/www/laravel -type f -exec chmod 644 {} \;
```

#### Laravel.env編集(DB設定)
```config:.env
DB_CONNECTION=mariadb
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=[mariaDBのrootパスワード]
```

#### テストデータ挿入
```bash:bash
# マイグレーション実行
php artisan migrate

# シーダー実行
php artisan db:seed
```

# 動作確認
- ブラウザで192.168.33.10にアクセス
LaravelのTOP画面が表示されればOK！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649380/de323e9b-8425-4d66-85e2-36fc6ae7fb82.png)


# おまけ。ビルドとnode_modulesとgitの設定。

windowsとフォルダ共有をしているとnode_modulesが入らない為、
別の所にnode_modules置き場を作って、マウント(繋ぐ)させる。

### npm / node_modules設定

```
# npm本体とgitインストール
sudo dnf install -y npm git

# node_modules置き場を作る
sudo mkdir /home/vagrant/laravel_node_modules

# laravelプロジェクトフォルダにnode_modulesディレクトリを作成する
sudo mkdir /var/www/laravel/node_modules

# systemd設定の再読み込み
sudo systemctl daemon-reload

# マウントさせる
sudo mount --bind /home/vagrant/laravel_node_modules /var/www/laravel/node_modules

# npm install
npm install

# ビルド
npm run build
```

### Git初期設定
```
# gitのユーザー名/メールアドレスの設定
git config --global user.name "your name"
git config --global user.email "your email"
```

# 参考にさせていただいた記事

https://qiita.com/nakazii-co-jp/items/074c64f5e72f06c94b25

https://qiita.com/C_HERO/items/1512ba1e33c330c9ab0d

https://shimaichi.blog/centos7-php8/

https://koreshiki-nanno.hatenablog.com/entry/2020/12/11/233628

https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0092