私なりのLaravel環境構築

2024年1月28日~2024年1月31日

最近新しいノートPCを購入した。
どうせならLaravel10の環境構築手段をまとめて残しておこうという気持ち。

タイトルにある通り「私なり」がかなり大事で、今はもっとLaravel SailHomesteadを使ったり、既に環境構築済みならDockerやVMのスナップショットを持ってくるのが楽だと思う。
でも、過去と今の私に需要があるので、未来のために残しておく。

目標環境

バージョン名が書いてある物は、そのバージョンじゃないと動かない可能性大

  • Laravel10
  • PHP8.1
    • Laravel10はPHP8.1が条件
  • Apache
  • MySQL
  • AlmaLinux9
  • Oracle VM VirtualBox
    • 今回はホストOS(Windows11)にVMでゲストOS(AlmaLinux9)の環境を構築する
  • Tera Term

更にちょっと説明すると、

  • VMでWindows上にAlmaLinuxの仮想環境を作りその中にLaravel10の環境を作る
  • Laravelを共有フォルダでVMと共有し、ホストOS(Windows)側のIDEで弄れるようにする
  • ゲストOS(AlmaLinux)でローカルWebサーバーを建て、ホストOSだけがそのWebサーバーにアクセスできるようにする

が目標。

VMでAlmaLinux9を動かすまで

Visual Studio 2019のインストール

まず、VirtualBoxに必要なVisual Studio 2019をダウンロードする。
ARM64,x86,x64版とかあるが、インテル、AMDなら大体x64。MacのM1やM2ならARM64。

一応、「Windowsマーク右クリック→システム」から確認できる。

VirtualBoxのインストール

次に、Oracle VM VirtualBoxからVirtualBoxの最新版(執筆時点で7.0.14)をダウンロード&インストールする。

途中で出てくる以下のようなPythonの警告はそのまま無視して「Yes」を。

どうやら、こちらの記事のように「Python Core Package」を使うとPythonでVirtualBoxをいろいろできるみたい。

しかし、いろいろする気はないし、Python2の話らしいので無視してYes。

AlmaLinux9のインストール

次に、OSのAlmaLinux9をインストールする。

DVD版(約10GB)かMinimal版(約2GB)か悩ましいところだけど、自分で必要な機能がわかっていて、容量とダウンロード時間に余裕が無い人以外は、とりあえずすべて入っているDVD版で良いと思う。

ダウンロードできたら、VMの新規を押下

好きな名前とダウンロードしたAlmaLiunxのISOを選択。
また、自動インストールをスキップにチェック。

ハードウェアはホストOSのスペックにもよるが、以前の設定で問題なかったのでそれと同じに。

仮想ハードディスクは用途にもよるけど、数十GBあれば十分だと思われる。

起動する前に、「ホストキーの組み合わせ」を任意のキーに設定し、いつでもVMの世界からマウスを脱出できるように。

設定したらそのまま起動

めっちゃわかりにくいけど、初期カーソル位置のInstall AlmaLinux 9.3でEnter。

とりあえず日本語を選択

ソフトウェアの選択でサーバーを選択。これでCUIになる。

インストール先とrootパスワードを設定したらインストール

これでインストール完了

VMの下準備

sudoが打てる一般ユーザーの作成

インストールが終わったら、まずrootでログインする

次に一般ユーザーを「adduser username」で作成し、「passwd username」でパスワードをつける。

パスワードを打ち込むときは、画面に何も表示されないけどセキュリティ上の仕様なので心の目で打ち込む。

次に、wheelというグループに今作ったユーザーを入れ、中に入っている人のみがsudoを打てるようにする。

「usermod -aG wheel username」でグループに追加。
aが追加、Gがグループを意味する。

「groups username」でユーザーが所属するグループを確認できる。

次にwheelに入っていればsudoを打てるようにする。
「visudo」でsudoersファイルを安全に弄れる。

“%wheel ALL=(ALL) ALL”があればおk。なければ追加。

これで一般ユーザーの作成完了。

ネットワーク設定

ここでは、VMのNATアダプターとホストオンリーアダプターを使った設定を行う。
VirtualBoxの公式ドキュメントはこちら

この2つの詳しい仕組みとかはよく理解できていないんだけど、大体以下みたいな感じ

  • NATアダプター
    • 「ゲストOS→外部」の接続を可能にする
    • ゲストOSのローカルIPアドレスをホストOSのローカルIPアドレスに変換し、外部にアクセスする
    • 「外部→ゲストOS」の接続は不可
  • ホストオンリーアダプター
    • 「ゲストOS⇔ホストOS」」の接続を可能にする
    • ホストOSからゲストOSへのSSH、Webサーバーへの接続に使う
    • 「外部→ゲストOS」の接続は不可

VirtualBoxの設定

まず、起動しているゲストOSを停止する。忘れがち。

次に、ツール→ネットワークから

作成を押下し、ホストオンリーネットワークを新しく作成。

作成したら、新しいホストオンリーネットワークのIPv4アドレスをコピーしてどっかに残しておく。

次に、さっき作成したAlmaLinuxの仮想マシンの設定。

ネットワークのアダプター1が初期設定のNATなっていることを確認。

アダプター2のネットワークアダプターを有効化し、ホストオンリーアダプターを選択。
名前はさっき作ったホストオンリーネットワークの名前と同じものを。

アダプター2が押せない場合は、仮想マシンが稼働している可能性あり。

AlmaLinuxの設定

AlmaLinuxの仮想マシンを起動。
先ほど作成したユーザーでログイン。

以下の画像のように、ホストオンリーネットワークで使われるenp0s8はデバイスとして存在するが、コネクションが設定されていないのがわかる。

したがって、「nmcli con add type ethernet con-name enp0s8 ifname enp0s8」でenp0s8のコネクションを作成する。

作成したら、コネクションの設定を行う

「nmcli connection modify enp0s8 ipv4.method manual ipv4.addresses {先にコピーしたIPv4アドレスの下3桁を変化させたもの}/24」で設定。

私の場合コピーしたのが「192.168.250.1」なので、これに被らない「192.168.250.2」とかを設定する。

「nmcli device status」で繋がったことを確認したら「sudo systemctl restart NetworkManager」でネットワークマネージャーの再起動。

これで設定完了。

SSH接続

SSH接続したいので、Tera Termの最新版をインストール。

インストールしたら、先にenp0s8で設定したIPアドレスでアクセスできるか確認。

「ログインしたいユーザー名@enp0s8で設定したIPアドレス」でアクセス。

続行。

パスフレーズにユーザーのパスワードを入れてアクセス。

これでアクセスできれば、とりあえずVMのホストオンリーネットワーク設定は大丈夫

公開鍵認証

現在はパスワードとユーザー名でSSH接続する方法を取っている。
ホストOSからしかアクセスできないのでこれでも問題ないんだけど、本番環境では公開鍵認証を行うのでそれもやっとく。

まず、新しくteratermを起動しキャンセルを押下。

設定→SSH鍵生成

ED25519を選択し、パスフレーズとコメントをつけたい人は記入。

パスフレーズをつけると秘密鍵を使う度にパスフレーズを求められ面倒なので、ローカル環境の今回は非推奨。

公開鍵と秘密鍵を自分でわかる場所に保存。

次に、普通にパスワード認証でSSH接続した状態で公開鍵をTeraTermにD&D。

SCPを使いファイル転送をするか聞かれるので、そのままOK。

ユーザーのホームディレクトリに公開鍵が来ていることがわかる。

RedHatのdocumentを見てもらえばわかる通り、「~/.ssh/authorized_keys」の公開鍵を使って認証するので、公開鍵を指定の場所に移し名前を変える。

ユーザーのホームディレクトリで以下を打ち込む

mkdir .ssh
chmod 700 .ssh
mv id_ed25519.pub .ssh/authorized_keys

ここまでやったら一回SSH接続を落とし、秘密鍵で接続できるか確認。

接続出来たら、本番環境を想定しrootへのログインとパスワードでのログインを拒否する。

sshをされる際の設定ファイルは「/etc/ssh/sshd_config」にあるのでこれをいじる。
本番環境で弄るときは、バックアップ等慎重に。

「sudo vi /etc/ssh/sshd_config」で弄る。

PermitEmptyPasswords no # 空白パスワードの禁止
PasswordAuthentication no # パスワードによるログイン禁止
PermitRootLogin no # rootへのログイン禁止

設定が終わったら
sudo sshd -t
でエラーが出ないか確認し
sudo systemctl restart sshd

でsshdの再起動。

これで公開鍵認証でのみアクセスできるようになってたら完了。

共有フォルダの実装

現在ゲストOSにあるファイルをホストOSで弄ろうとすると、gitで共有したり、rsyncで共有したりといちいち何かを介して共有する必要がある。

さすがに面倒なので、VMの共有フォルダ機能を使い、特定のフォルダ内のファイルは全て自動で同期するようにする。

共有フォルダを使うためにGuestAddtionsが必要なので、まずそれを入れる。

以下でパッケージの更新と、必要なもののインストール。

sudo dnf update
sudo dnf install kernel-devel kernel-headers gcc gcc-c++
sudo dnf install bzip2

ちょっと関係ない話なんだけど、「RedHat系ディストリビューションを使っているならRHEL公式リポジトリが提供するパッケージを使ったほうが良い」ということを最近認識した。

RHEL公式リポジトリで提供されているものは、RHEL系ディストリビューションで動くことや安全性が保障されている。つまり、こんな言い方は悪いんだけど責任転嫁がある程度効くし、品質が高い。

なので、できる限りEPELなどのサードパーティーリポジトリは避けよう。

インストールが終わったら、SSHじゃなくVMの「デバイス」→「Guest Addtions CD イメージの挿入」

次に

sudo mount -r /dev/cdrom /media
cd /media
sudo ./VBoxLinuxAdditions.run
cd ..
sudo umount /media

以上のコマンドでインストールし、
sudo reboot

で再起動

そしたらVirtualBoxの共有フォルダの設定で、新しい共有フォルダの追加(右の緑十字)

フォルダーのパスはホストOSの共有したいフォルダを選択し、フォルダ名をつける。

自動マウントと、永続化するにチェック。

これで、
ls -l /media
を見てみると。

のように、フォルダが作成されている。

でも、権限的に弄れない状態なので、
sudo gpasswd –add username vboxsf
で任意のユーザーをvboxsfに入れる。

追加したら、SSH接続を再起動。

これで、ホストPCに以下のようなファイルを入れてみる。

lsで見てみると。

共有できていればおk。

ゲストOSに入れるLaravel以外のソフトウェア

主にPHP、Apache、バーチャルホスト、MySQL、共有フォルダによるシンボリックリンクエラーの回避らへんをやる。
最終的にLaravelで作成したWebページをホストOSで編集・確認できるようになればおk。

Apacheを入れる

ApacheはWebサーバーのこと。
最近Nginxの台頭もすごいが、とりあえずは慣れている方で。

sudo dnf install httpd
でインストール。

sudo systemctl start httpd
でApache起動。

sudo systemctl enable httpd
で自動起動。

ファイアウォールとSELinux

ファイアウォールの80番ポートの開放。
sudo firewall-cmd –permanent –add-service=http
sudo firewall-cmd –reload

で80番ポート(HTTP)を永久開放し、ファイアウォールの再起動。

SELinuxについてなんだけど、実務の方でも適用するか無効化するかは別れるようなので自分で考えて決めるのが吉。今回はローカルサーバーなので、SELinuxは永続的にpermissiveにする

また、完全無効化(disabled)にするとしてもRedHatのドキュメントをみると「/etc/selinux/config」で「SELINUX=disabled」にするのは非推奨らしい。

permissiveは問題ないらしいので、
sudo vi /etc/selinux/config
で「SELINUX=permissive」にする。

もし、一時的に変更するなら「setenforce=0」でpermissive、「setenforce=1」でenforcing。

SELinuxの現在の状態確認は「getenforce」。

これで再起動すると、ssh接続するときと同じIPアドレスでテストページを表示できるはず。

PHPとComposerのインストール

Laravelの前提条件である、PHPとComposerをインストールする。

Laravel10ではPHP8.1.0以上、Composer2.2.0以上が必要なのでそこに注意しながら入れていく。

dnf update
した上で、
dnf list php

で提供されているPHPのバージョンを確認する。
私の場合は8.0だったので、パッケージでのインストールは無理そう。

次に
dnf module list php

でモジュールのPHPバージョンを見てみる。

moduleではPHP8.1が提供されているので、外部リポジトリに頼らずにいけそう。

sudo dnf module install php:8.1/common
sudo dnf install php-intl php-pdo php-mysqlnd
php-opcache
で必要な拡張モジュールもインストール(他にもあるかも)。
24/02/02追記:php-opcacheを追加。これを入れるとPHPが爆速になる。

Composerは公式ページにある方法でインストールする。
公式ページの内容が変わるかもしれないので、ここに記述は避けておく。

コマンドを全部打ち終わるとホームディレクトリにcomposer.pharがあるので、パスを通す。

以下のように/usr/local/binにcomposerとしておけばおk。

sudo mv composer.phar /usr/local/bin/composer
composer -V

でバージョンが確認できればおk。

MySQLのインストール

こちらもPostgreSQLやMariaDBなど台頭するものがあるが、慣れているものをとりあえず入れる。

sudo dnf install mysql-server
でとりあえずインストール。

sudo systemctl start mysqld
sudo systemctl enable mysqld
で起動と自動起動。

どうやら、mysql_secure_installationは必要ないという記事があったりするので、公式ドキュメントの方法でセットアップしてみる。

mysql -u root -p
でmysqlにrootでログイン。

私の場合PWは設定されていなかったので、無入力でいけた。設定されていた場合は公式ドキュメントを。

ログイン出来たら
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘root-password’;
でroot-passwordをお好きなPWにしてパスワード変更。

また、一応匿名ユーザとかテストDBができているか確認。

匿名ユーザーも、testテーブルも出来ていないみたいなので本当にrootパスワードを変えるだけでよさそう。

ついでにLaravelで使うDBを作成する。
create database DB名
でDBを作成。

MySQLはこれで完了。

Laravel

1からインストールする場合

これはLaravelを引き継がず1からインストールする場合。

インストール

インストールの日本語ドキュメントはこちら

cd /media/sf_Share/
で共有フォルダに移動。

composer create-project laravel/laravel example-app
でexample-appとしてインストール。

しっかり共有されていることを確認。

Laravelの諸設定

これはLaravelを引き継がず1からインストールする場合。

  • .envのDBを設定
    初期設定でMySQLになってるので、使うデータベース名とrootのパスワードだけ入れる。
  • config/app.phpの設定
    ‘timezone’ => ‘Asia/Tokyo’,
    ‘locale’ => ‘ja’,
    ‘faker_locale’ => ‘ja_JP’,
  • php artisan migrate

おそらくこれくらい。
※ストレージリンクとnpm install && npm run xxxを行う際はホストOSで行う。

GitHubからGitでLaravelを持ってくる場合

インストール

これはGitからプロジェクトを持ってくる場合。

共有フォルダを使っているので、Git操作は全てホストOS側で行う。

GitをホストOSでダウンロード&インストールする。

インストールする際の選択肢は人によるが、私の場合は以下のような感じ。
デフォルトじゃない所のみ載せる。

コミットメッセージなどを入力する際のデフォエディタ

デフォルトのブランチ名を「main」に

あとは全部デフォルト。

Git導入完了。

ホストOSにGitを入れたら主に以下の選択肢からリポジトリをクローンする。

私はPHPStormの連携で持ってきた。素晴らしく楽。

Laravelの諸設定

これはGitからプロジェクトを持ってくる場合。

やることの目次

  • composer install
    本番環境の場合は「composer install –optimize-autoloader –no-dev」
  • .env.exampleを.envに
    DBやメールの設定も
  • php artisan key:generate
  • php artisan migrate
  • php artisan storage:link
    必ずホストOSで行うこと。Windowsのシンボリックリンク関連の権限問題でゲストOSからは作成不可。

    ホストOSにPHPのインストールが必要。パス通さないとだめ。
  • npm install && npm run dev
    これも上と同じ理由でホストOSで行うこと。
    ゲストOSは「sudo dnf install nodejs」でnodejsで一応インストールする。
    ホストOSはインストーラから。

サーバー関連の設定

Apacheの設定

今回は
vi /etc/httpd/conf.d/[好きな名前].conf
などでLaravelプロジェクトと紐づくApacheの設定ファイルを作成する。

中身は以下みたいな感じ

<VirtualHost *:80>
    DocumentRoot /media/sf_Share/QTM/public
    ServerName qtm.test
    <Directory  /media/sf_Share/QTM/public>
        Require ip 192.168
        AllowOverride All
    </Directory>
</VirtualHost>

少し説明すると、

  • <VirtualHost *:80>
    どのIPアドレスからでも、80番ポートはVirtualHost内サブディレクトリの設定を適用。
  • DocumentRoot /media/sf_Share/QTM/public
    Apacheが取り扱うディレクトリを指定。
  • ServerName qtm.test
    アクセスしたいドメイン名。
    バーチャルホストを行うので設定。
  •  <Directory  /media/sf_Share/QTM/public>
    /media/sf_Share/QTM/publicにアクセスするときだけDirectory内のサブディレクトリの設定を適用。
    これがないと以下のRequireとAllowOverrideが適用できない。
  • Require ip 192.168
    192.168から始まるIPのみ許可。
    ローカルIPのみを許可する意図。
  • AllowOverride All
    ディレクトリ内に.htaccessがあったらそこに記述されたディレクティブで全てオーバーライド。
    Laravelには.htaccessがあるよ。

この設定をした上で、「apachectl configtest」で文法エラーチェック。

設定をしたら、共有フォルダの権限をApacheに与える。
sudo gpasswd –add apache vboxsf
そしてApacheとPHP-FPMを再起動
sudo systemctl restart httpd
systemctl restart php-fpm.service

これでIPアドレスにアクセスすると、Laravelページが表示できているはず。

もしできていなければ、「/var/log/httpd/error_log」のエラーログをみる。
大体権限かSELinux関連だと思う。

バーチャルホストの設定

現在は、http://[ローカルIP]でアクセスできるようになっているけど、http://[ドメイン名]でアクセスできるようにする。

具体的には、さっきApacheで設定したサーバーネームでアクセスできるようにする為、ホストOSのバーチャルホストの設定を行う

cmdをctrl+shiftで管理者実行。

実行したら
notepad C:\Windows\System32\drivers\etc\hosts

でバーチャルホストの設定をいじる。

こんな感じで「IPアドレス ドメイン名」で保存。

すると任意のドメイン名でアクセス可能に。

以上が現時点での私のLaravel環境構築。

もし、phpMyAdminをEPELリポジトリから入れたかったら

phpMyAdminというMySQLをGUIで簡単に管理できるツールがある。
開発時にあるととても便利なため、是非入れたい。本番環境では脆弱性につながる可能性があるので入れない。

しかし、このphpMyAdminはRHELのリポジトリに存在しないので、今回はサードパーティーリポジトリであるEPELから入手する。

EPELのインストールと設定

かなり前に先述した通り、出来る限りリポジトリはサポート・互換性的にRHELのものを使った方がよい。
そのため、EPELをインストールしてもデフォルトで利用不可にし、enablerepoオプションを付けた時のみ利用可能にする。

とりあえず
sudo dnf install epel-release
でEPELをインストールし
sudo dnf repolist epel
で初期状態が有効化であることを確認。

「/etc/yum.repos.d/epel.repo」の「enable=1」を「enable=0」にすると初期状態で無効化できるので

sudo vi /etc/yum.repos.d/epel.repo
で編集。

sudo dnf repolist epel
で確認。

おk。

phpMyAdminのインストールと設定

初期でEPELは無効化されているので、enablerepoオプションをつけインストール

sudo dnf –enablerepo=epel install phpmyadmin

インストールすると「/etc/httpd/conf.d/phpMyAdmin.conf」に設定ファイルができているのでこれをいじる。

初期ではAliasを使いURLの指定をしており、[IPアドレス]/phpMyAdminまたは[IPアドレス]/phpmyaddminでアクセス可能になっているが、バーチャルホストを設定したいので以下のようにする。

#Alias /phpMyAdmin /usr/share/phpMyAdmin
#Alias /phpmyadmin /usr/share/phpMyAdmin
<VirtualHost *:80>
   DocumentRoot /usr/share/phpMyAdmin
   ServerName phpMyAdmin.test
   <Directory /usr/share/phpMyAdmin/>
      AddDefaultCharset UTF-8
      Require ip 192.168
   </Directory>
   <Directory /usr/share/phpMyAdmin/setup/>
      Require ip 192.168
   </Directory>
</VirtualHost>

設定をした後、ctrl+shiftでcmdを開き
notepad C:\Windows\System32\drivers\etc\hosts
でバーチャルホストの設定。

これでphpmyadmin.testに接続すると

いいね。

もちろんホストオンリーアダプターのおかげでゲストOSと接続できるのはホストOSのみなので、他のPCからは接続できない。