Webソリューション5課の王です。
本記事では、RedHat上でPHP実行できる環境を構築し、Laravelアプリケーションを動かせるまでの流れを紹介させていただきます。
近年ではコンテナ技術が十分に普及し、新規にインフラストラクチャー環境を構築する場合、これを採用することは一般的になってきたように思われる。
私もコンテナ技術を支持する人間の一人であり、本番環境のみならずローカルの開発環境でも活用している。
ところが、従来の資産を抱えているアプリケーションや、デプロイ先のインフラストラクチャー構成の都合などから、コンテナ技術を使えない/使うことが不適切な場合もある。
このような状況では昔ながらの方法でミドルウェア・実行環境のインストール・設定を行うことになるが、前述した通りコンテナ技術の普及により、その機会は減少しつつあると感じている。
その結果、いざミドルウェアのインストールや設定などをホストマシン上で行う必要に駆られた場合に、戸惑うWebエンジニアが増えていると考えている。
そこで、この記事ではホストマシン上でのWebサーバやデータベース(DB: database)のインストール、PHPの実行環境構築などを疑似的に体験する。
Dockerで簡単にできることを、手動で一々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)
ここでは、次の順番で各ミドルウェアやフレームワークをインストール、設定していく。
この順番で構築することで、動作の確認と構築時のトラブルシューティングを行いやすい。
最初にWebサーバであるApacheをインストールし、サーバレスポンスを返すことができているか確認する。
依存ライブラリ起因の問題を避ける目的で、最初に全てのパッケージを更新する。
[root@1164a8e8ea51 tmp]# dnf update -y
Apacheサーバーをインストールする
[root@1164a8e8ea51 tmp]# dnf install httpd -y
Apacheサーバーを起動する
[root@1164a8e8ea51 tmp]# systemctl start httpd
Apacheサーバーをシステム起動時に自動的に起動するよう設定する
[root@1164a8e8ea51 tmp]# systemctl enable --now httpd
Webブラウザで次のURLにアクセスして、Apacheの初期画面が表示されたらインストールは成功している。
http://127.0.0.1
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
公式サイトは以下となります。
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
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
公式サイトの手順: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.
参考記事: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インストールために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アプリケーションを動かせる環境の構築が終わり、ローカル環境経由してアプリケーションの訪問ができた。