AQ Tech Blog

ゼロからPHPアプリ環境構築

作成者: ou.ishin|2024年09月22日

はじめに

Webソリューション5課の王です。

本記事では、RedHat上でPHP実行できる環境を構築し、Laravelアプリケーションを動かせるまでの流れを紹介させていただきます。

背景

近年ではコンテナ技術が十分に普及し、新規にインフラストラクチャー環境を構築する場合、これを採用することは一般的になってきたように思われる。
私もコンテナ技術を支持する人間の一人であり、本番環境のみならずローカルの開発環境でも活用している。

ところが、従来の資産を抱えているアプリケーションや、デプロイ先のインフラストラクチャー構成の都合などから、コンテナ技術を使えない/使うことが不適切な場合もある。

このような状況では昔ながらの方法でミドルウェア・実行環境のインストール・設定を行うことになるが、前述した通りコンテナ技術の普及により、その機会は減少しつつあると感じている。

その結果、いざミドルウェアのインストールや設定などをホストマシン上で行う必要に駆られた場合に、戸惑うWebエンジニアが増えていると考えている。

そこで、この記事ではホストマシン上でのWebサーバやデータベース(DB: database)のインストール、PHPの実行環境構築などを疑似的に体験する。

目的

Dockerで簡単にできることを、手動で一々Linux環境にインストールし、割と古典的なやり方でサーバ構築とアプリケーションのデプロイを行います。

対象読者

  • 普段コンテナ技術に頼ってアプリケーションの実行環境を構築しているが、ホストマシンへのミドルウェアインストール・設定などの経験が少ない人。
  • Linuxについて基本的な知識があり、簡単なコマンドを実行できる人。

注意

仮想環境を利用したため、コンテナを閉じたら、Linuxにインストールされた物は消えるので、このブログはあくまで勉強用なので、ご注意ください。

コンパイラインストールを利用してPHPをインストールするため、PHPインストール時気をつけてください。

仮想環境の事前準備

Dockerを使い、仮想環境でRed Hatコンテナを立ち上げる。

docker run -it -p 80:80 --name my_redhat_container -it --privileged registry.access.redhat.com/ubi8/ubi /sbin/init

RedHatバージョン確認

docker exec -it my_redhat_container bash

[root@dbafac670a97 /]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.10 (Ootpa)

構成情報

OS:Red Hat Enterprise Linux
Webサーバ:Apache HTTP Server(以下、単にApacheと書く。)
プログラミング言語:PHP(v8.3.9)
データベース:MySQL(v8.4)
フレームワーク:Laravel(v10.48.20)

構築の順番

ここでは、次の順番で各ミドルウェアやフレームワークをインストール、設定していく。

  1. Apache
  2. PHP実行環境
  3. MySQLサーバ
  4. Laravel

この順番で構築することで、動作の確認と構築時のトラブルシューティングを行いやすい。

ウェブサーバのインストール

最初にWebサーバであるApacheをインストールし、サーバレスポンスを返すことができているか確認する。

依存ライブラリ起因の問題を避ける目的で、最初に全てのパッケージを更新する。
[root@1164a8e8ea51 tmp]# dnf update -y

Apacheサーバーをインストールする
[root@1164a8e8ea51 tmp]# dnf install httpd -y

Apacheインストール後、Apacheの起動及び自動起動設定が必要

Apacheサーバーを起動する
[root@1164a8e8ea51 tmp]# systemctl start httpd

Apacheサーバーをシステム起動時に自動的に起動するよう設定する
[root@1164a8e8ea51 tmp]# systemctl enable --now httpd

Webブラウザで次のURLにアクセスして、Apacheの初期画面が表示されたらインストールは成功している。

http://127.0.0.1

PHPインストールの事前準備

PHPインストール前に、必要なツールのインストールを行う

tmpディレクトリに移動する
[root@1164a8e8ea51 tmp]# cd /tmp

作業に必要なコマンド等をインストール
[root@1164a8e8ea51 tmp]# dnf install -y wget make vim

PHPをインストールするために必要なコンパイラとライブラリをインストールする。
[root@1164a8e8ea51 tmp]# dnf install -y gcc libxml2-devel sqlite-devel openssl-devel libcurl-devel

PHPのインストール

公式サイトは以下となります。

https://www.php.net/manual/ja/install.unix.apache2.php

以下の手順で、PHPをインストール。今回はコンパイラインストールの方法でPHPをインストール。この方法でやると、すべての設定が自らで決めることができ、分かりやすい。

PHP 8.3.9のソースコードをダウンロードする
[root@1164a8e8ea51 tmp]# wget https://www.php.net/distributions/php-8.3.9.tar.gz

ダウンロードされたソースコードを解凍する
[root@1164a8e8ea51 tmp]# tar -xzf php-8.3.9.tar.gz

ソースコードディレクトリに移動する
[root@1164a8e8ea51 tmp]# cd php-8.3.9

PHPコンパイルする際にFPM(FastCGI Process Manager)を有効にし、zlib、curl、OpenSSLのサポートを追加し、FPMのユーザーとグループをapacheに設定する
[root@1164a8e8ea51 php-8.3.9]# ./configure --enable-fpm --with-zlib --with-curl --with-openssl --with-fpm-user=apache --with-fpm-group=apache

生成された設定に基づいて、PHPのソースコードをコンパイルし、実行可能なバイナリファイルを作成する
[root@1164a8e8ea51 php-8.3.9]# make

makeでコンパイルされたPHPのバイナリファイルや関連ファイルを、システムの指定されたディレクトリにインストールするコマンドです。これにより、PHPがシステム上で利用可能になる
[root@1164a8e8ea51 php-8.3.9]# make install

PHPバージョン確認、以下のように出力すれば、PHPのインストールが成功

[root@1164a8e8ea51 php-8.3.9]# php -v
PHP 8.3.9 (cli) (built: Jul 21 2024 10:31:45) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.9, Copyright (c) Zend Technologies

php-fpm利用するため、php-fpmの設定を行う

PHP-FPMに関する設定ファイル(3つ)をソースコードディレクトリから配置すべき箇所にコピーする。
[root@1164a8e8ea51 php-8.3.9]# cp sapi/fpm/php-fpm.conf /usr/local/etc/php-fpm.conf
[root@1164a8e8ea51 php-8.3.9]# cp sapi/fpm/www.conf /usr/local/etc/php-fpm.d/www.conf
[root@1164a8e8ea51 php-8.3.9]# cp sapi/fpm/php-fpm.service /etc/systemd/system/php-fpm.service

php-fpm.confを編集し、サブconfファイルの読み込みパスとエラーログパスを修正する
[root@1164a8e8ea51 php-8.3.9]# vim /usr/local/etc/php-fpm.conf
以下の行を修正する
include=NONE/etc/php-fpm.d/*.conf -> include=/usr/local/etc/php-fpm.d/*.conf
;error_log=log/php-fpm.log -> error_log=/var/log/php-fpm/php-fpm.log

www.confを編集し、ソケットとソケットファイルの所有者を修正する
[root@bb336a34a2bc php-8.3.9]# vim /usr/local/etc/php-fpm.d/www.conf
以下の行を修正する
・ローカルサーバー間での通信を効率的にするため、UNIXソケット経由で接続を受け付けできるように修正する
listen = 127.0.0.1:9000 -> listen = /var/run/php-fpm/php-fpm.sock

・PHP-FPMのソケットファイルの所有者と所有者グループをapacheユーザーに設定する。この設定により、PHP-FPMが作成したソケットファイルの所有者がapacheになり、apacheユーザーがこのソケットファイルにアクセスできるようになる
listen.owner = apache
listen.group = apache
listen.mode = 0666

ログパス及びソケットファイルパスの設定により、事前にディレクトリを作成する
[root@21bd57394587 php-8.3.9]# mkdir -p /var/log/php-fpm/
[root@21bd57394587 php-8.3.9]# mkdir -p /var/run/php-fpm/

各変更設定を反映し、php-fpmを起動する
[root@bb336a34a2bc php-8.3.9]# systemctl daemon-reload
[root@bb336a34a2bc php-8.3.9]# systemctl start php-fpm
[root@bb336a34a2bc php-8.3.9]# systemctl enable php-fpm

PHPとApache紐づけ

Apacheは静的ファイルサーバーであり、PHPスクリプトを直接実行することはできません。PHP-FPM(FastCGI Process Manager)などのPHP処理器と接続することで、ApacheはPHPスクリプトを処理し、動的なコンテンツを生成することができます。

本節ではPHPとApacheの紐づけに必要な手順を説明する

Apache側の設定ファイルを開き、PHPファイルを認識できるように修正する
[root@1164a8e8ea51 php-8.3.9]# vim /etc/httpd/conf/httpd.conf
以下のコードをhttpd.confの<Directory "/var/www/html">の中に追記
<FilesMatch \.(html|php)$>
SetHandler "proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost"
</FilesMatch>

ApacheサーバーがPHP-FPM(FastCGI Process Manager)を使用してPHPスクリプトを処理できるように修正する
[root@bb336a34a2bc php-8.3.9]# vim /etc/httpd/conf.d/php-fpm.conf
以下の内容でファイル新規作成
<IfModule proxy_fcgi_module>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>

Apacheとphp-fpmの設定ファイル修正したので、Apacheとphp-fpmを再起動する
[root@bb336a34a2bc php-8.3.9]# systemctl restart httpd
[root@bb336a34a2bc php-8.3.9]# systemctl restart php-fpm

テスト用のPHPファイル作成、ブラウザで確認

Apacheのルートディレクトリはデフォルト/var/www/htmlなので、/var/www/htmlの配下でテスト用ファイル作成する
[root@bb336a34a2bc php-8.3.9]# vim /var/www/html/index.php
以下のコードでファイル新規作成
<?php
phpinfo();

以下のページにアクセス、画像のように画面表示できたらPHPとApacheの接続が完了

http://127.0.0.1/index.php

Composerのインストール

公式サイトの手順:https://getcomposer.org/download/

以下の手順は公式サイトに記載されているものなので、手順に従いComposerをインストール
[root@7dfed4e0f8eb tmp]# cd /tmp
[root@7dfed4e0f8eb tmp]# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
[root@7dfed4e0f8eb tmp]# php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
[root@7dfed4e0f8eb tmp]# php composer-setup.php
[root@7dfed4e0f8eb tmp]# php -r "unlink('composer-setup.php');"
[root@7dfed4e0f8eb tmp]# mv composer.phar /usr/local/bin/composer
[root@7dfed4e0f8eb tmp]# composer --version
Composer version 2.7.7 2024-06-10 22:11:12
PHP version 8.3.9 (/usr/local/bin/php)
Run the "diagnose" command to get more detailed diagnostics output.

MySQLのインストール

参考記事:https://qiita.com/chibatty/items/86549498a0e505aeff5b MySQLのインストール

MySQLのリポジトリはデフォルト存在しないため、MySQL8.4のコミュニティ版リポジトリのRPMパッケージをダウンロードする。これにより、MySQLの公式リポジトリをパッケージとしてシステムに追加できます
[root@7dfed4e0f8eb tmp]# wget https://dev.mysql.com/get/mysql84-community-release-el8-1.noarch.rpm

ダウンロードしたMySQL8.4コミュニティ版リポジトリのRPMパッケージをインストールする。これにより、MySQL8.4のリポジトリがシステムに追加され、MySQL 8.4 のパッケージをdnfコマンドでインストールできる
[root@7dfed4e0f8eb tmp]# dnf install -y mysql84-community-release-el8-1.noarch.rpm

MySQLコミュニティサーバーをインストールするコマンドです。このコマンドにより、MySQL のサーバーコンポーネントがシステムにインストールされ、データベースサーバーを使用できる
[root@7dfed4e0f8eb tmp]# dnf install -y mysql-community-server

MySQLを起動する
[root@7dfed4e0f8eb tmp]# systemctl start mysqld

MySQLの起動状況を確認する
[root@7dfed4e0f8eb tmp]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-07-22 12:43:36 UTC; 8s ago

MySQLの初期パスワード取得及び変更

MySQLの初期パスワード取得
[root@7dfed4e0f8eb tmp]# grep 'temporary password' /var/log/mysqld.log
2024-07-22T12:43:32.179579Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 3srTF8b2+wKa

MySQLサーバに接続、同一サーバ内なので、Hostなどの指定は不要
[root@7dfed4e0f8eb tmp]# mysql -uroot -p
Enter password:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '変更後のパスワード';
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye

以上を持って必要な環境の準備が完了。

Laravel使いウェブシステム作成

LaravelインストールためにGitのインストールが必要

Gitバージョン管理システムをインストールする
[root@7dfed4e0f8eb tmp]# dnf install -y git

Gitバージョン管理システムのバージョンを確認する
[root@7dfed4e0f8eb tmp]# git --version
git version 2.43.5

Laravelのインストール手順

インストール前に不要なディレクトリを削除する
[root@7dfed4e0f8eb tmp]# cd /var/www
[root@7dfed4e0f8eb www]# rm -rf html

Composerを使い、Laravelをインストール
[root@7dfed4e0f8eb www]# composer create-project laravel/laravel:^10.0 html

アプリケーションディレクトリに移動し、Composerで必要なライブラリをインストール
[root@7dfed4e0f8eb www]# cd html
[root@7dfed4e0f8eb html]# composer install

Lravelのルートディレクトリと入り口ファイルをApacheの設定ファイルに設定する
[root@7dfed4e0f8eb html]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html" -> DocumentRoot "/var/www/html/public"
DirectoryIndex index.html -> DirectoryIndex index.php index.html

Apacheの設定ファイル変更したので、Apacheを再起動する
[root@7dfed4e0f8eb html]# systemctl restart httpd

アプリケーションのストレージディレクトリに書き込み権限を付与する
[root@7dfed4e0f8eb html]# chmod -R 777 /var/www/html/storage/

以下のURLにアクセスし、画面が正しく表示したら、Laravelのデプロイが完了

http://127.0.0.1

終わりに

以上の流れを持って、RedHat上で、Laravelアプリケーションを動かせる環境の構築が終わり、ローカル環境経由してアプリケーションの訪問ができた。