ゼロから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を御覧ください。