ゼロからPHPアプリ環境構築
目次
はじめに
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)
構築の順番
ここでは、次の順番で各ミドルウェアやフレームワークをインストール、設定していく。
- Apache
- PHP実行環境
- MySQLサーバ
- 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アプリケーションを動かせる環境の構築が終わり、ローカル環境経由してアプリケーションの訪問ができた。
アジアクエスト株式会社では一緒に働いていただける方を募集しています。
興味のある方は以下のURLを御覧ください。