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

    ゼロから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)

      構築の順番

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

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

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

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

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

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

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

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

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

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

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

      http://127.0.0.1
      202409_zerophp_02

      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
      202409_zerophp_03

      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
      202409_zerophp_04

      終わりに

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

      アジアクエスト株式会社では一緒に働いていただける方を募集しています。
      興味のある方は以下のURLを御覧ください。