Linux(Ubuntu) + Apache2 + PHP
のWebアプリケーション開発環境構築
その1


Apache~PHPセットアップ編

概要

Linux環境にてWebサーバーとしてApache2(以下Apache)、サーバー側開発言語としてPHPをセットアップしWebアプリケーションの開発環境を整えます。
最終的にはSSL自己証明書の作成や、データベースも連携し、PHPとTypeScriptを開発言語としVSCodeでデバッグを出来る環境を整え、HTMLやSASSなども抑えつつWebアプリケーション作成の基礎を学びます。

今回の目標。

  1. WSL2(Ubuntu)の環境にApache2でWebサーバーを構築する
  2. http://localhost:XXXX(任意のポート)へブラウザでアクセスし閲覧出来るようになる
  3. PHPをインストールし設定する
  4. ブラウザでアクセスし、PHPを実行する
  5. 複数のサイトでPHPのバージョンを切り返る(おまけ)

構築環境

Install Package/Tools

今回インストールするパッケージです。

  • WSL2(Ubuntu)
    • Apache2
    • PHP8.3
      • php8.3-mbstring
      • php8.3-pdo
      • php8.3-pgsql
      • php8.3-gd
      • php8.3-mysqlnd
      • php8.3-xml
      • php8.3-curl
      • php8.3-fpm
      • php-xdebug
      • etc…

ApacheとPHPのインストール

準備 apt アップデート

以下コマンドでaptのアップデートとphp用リポジトリを追加。

sudo apt update
 
# PHPインストール用のリポジトリ追加
sudo add-apt-repository ppa:ondrej/php
 
apt list --upgradable
sudo apt upgrade

Apacheインストール

sudo apt -y install apache2

PHPインストール

aptでphp8.3とphp用のモジュールもいくつかインストールします。

# 8.3インストール
sudo apt -y install php8.3 php8.3-mbstring php8.3-pdo php8.3-pgsql php8.3-gd php8.3-mysqlnd php8.3-xml php8.3-curl php8.3-fpm
# デバッガインストール
sudo apt -y install php-xdebug

補足:複数バージョンのPHPをインストール後にコマンドラインで使うバージョンを選択

PHPがすでにインストールされている環境では以下のコマンドに沿ってバージョンを選択してください。

# 実行後内容に従って選択
sudo update-alternatives --config php

※この設定はcliでのみ有効です。

Apache用PHPモジュール

Apacheにphp用のモジュールをインストールします。

# インストール
sudo apt -y install libapache2-mod-php
# 有効化
sudo a2enmod php8.3

補足:Apacheモジュールの有効化/無効化

# apache モジュールhoge無効化
sudo a2dismod hoge
# apache モジュールhoge有効化
sudo a2enmod hoge

Apache起動コマンド

以下コマンドでApacheを起動出来ます。

# apache2 コマンド
sudo service apache2 start    # 起動 
sudo service apache2 stop     # 停止
sudo service apache2 restart  # 起動/再起動
sudo service apache2 reload   # 停止中なら起動

設定

Apache編

Apache設定ファイル

Apacheの設定ファイルは etc/apache2 にあります。

apache2.confがApacheの設定ファイルです。
ファイル内には既定(ポート80)のサイトディレクトリやApacheの実行ユーザー等の設定が記載されています。
apache2.confに使用されている定数はenvvarsにて設定されています。

Apacheのモジュールを理解する

mods-availableとconf-availableにはそれぞれインストール済みのモジュールとその設定ファイルが入っています。
各モジュールを有効化すると、それぞれのモジュール、コンフィグのシンボリックリンクがconf-enabledとmods-enabledに設置されます。

apache2.confはconf-enabled、mods-enabled、sites-enabledディレクトリの中のファイルを全て読み込みます。

※ディレクトリの構造はUbuntu以外のディストリビューションでは変わります

  • etc
    • apache2
      • charset.conf
      • php8.3-fpm.conf
      • etc・・・(その他インストール済みモジュールのコンフィグ)
    • conf-enabled
      • charset.conf
      • etc・・・(その他有効化済みモジュールのコンフィ
    • mods-available
      • php8.3.conf
      • etc・・・(その他インストール済みモジュール)
    • mods-enabled
      • php8.3.conf
      • etc・・・(その他有効化済みモジュール)
    • apache2.conf
    • envvars
  • var
    • log
      • apache2
        • access.log
        • error.log
        • other_vhosts_access.log
        • etc・・・(その他apacheのログ)
    • www
      • html
        • index.html ← 現状http://localhostはこれを再生する
        • etc・・・(デフォルトサイトディレクトリ)

サイト用リソースディレクトリ作成

まずはLinuxのサイト開発者となるユーザーをwww-dataグループに加えます。www-dataはApacheの起動ユーザーのグループです。※Ubuntu以外のディストリビューションでは変わります。

# hogeユーザーをwww-dataグループに追加
sudo usermod -a -G www-data [hoge]

続いてサイトのディレクトリの保管場所を /var/www 直下に作ります。ここではディレクトリ名をhtdocsとしています。
htdocsの所有者として開発者のアカウントを、グループはwww-dataを指定し、パーミッションを775としてください。

  • var
    • www
      • html
        • (略)
      • htdocs
        • test.webapp.com
          • log
          • wwwroot
            • index.php
# htdocs作成
sudo mkdir /var/www/htdocs
# htdocsの所有者をhoge、グループをwww-dataに
sudo chown -R hoge:www-data /var/www/htdocs/
# パーミッションを775へ
sudo chmod -R 775 /var/www/htdocs/
サイトのルートディレクトリ作成する

htdocs内にサイトのリソース用ディレクトリを作ります。
今回はディレクトリ名を test.webapp.com とします。サイトのドメイン名や、プロジェクト名など、どのサイトかすぐ認識出来る名前を付けてください。
またディレクトリの中にwwwrootとlogディレクトリを作ります。

mkdir /var/www/htdocs/test.webapp.com/
cd /var/www/htdocs/test.webapp.com/
mkdir log
mkdir wwwroot

wwwrootの中にindex.phpを設置します。
index.phpの中は以下コードを記載して下さい。

<?php 
  phpinfo(); //PHPの環境情報の一覧を出力する関数 
?>

phpinfoはphpのバージョンやモジュールの読み込み情報を出力する関数です。テスト時に使用しましょう。

VirtualHostの設定を追加して、任意のポートでアクセスする

test.webapp.com ディレクトリ内のリソースを参照するVirtualHostの設定を行います。

/etc/apache2/sites-available/test.webapp.com.conf を作成します。

  • etc
    • apache2
      • sites-available
        • test.webapp.com.conf

内容は以下

/etc/apache2/sites-available/test.webapp.com.conf

# port40001の監視
LISTEN 40001
# port40001アクセス時の設定
<VirtualHost *:40001>
    # サイト用ディレクトリの定数設定
    Define SITE_DIR /var/www/htdocs/test.webapp.com
    
    # 管理者メールアドレス(エラー時に表示)
    ServerAdmin webmaster@localhost
    # ServerNameはSSL証明書と合わせる
    ServerName localhost
    # ドメインのルートディレクトリ
    DocumentRoot ${SITE_DIR}/wwwroot
    
    <Directory ${SITE_DIR}/wwwroot>
        # シンボリックリンクに対応
        Options FollowSymlinks Includes
        # 直接的なアクセスの許可
        Require all granted
        # .htaccessによる設定上書き許可
        AllowOverride All
    </Directory>
    
    ErrorLog ${SITE_DIR}/log/error.log
    CustomLog ${SITE_DIR}/log/access.log combined
</VirtualHost>

これは http://localhost:40001 でアクセスするためのVirtualHostの設定です。

続いてサイトの設定を有効化します。

sudo a2ensite test.webapp.com.conf
sudo service apache2 restart

ブラウザで http://localhost:40001 へアクセスします。
phpの動作環境が成形されたHTMLで表示されるはずです。これはphpinfo関数の実行内容です。
試しに index.php の内容を変更してみて、ブラウザに反映されるか確認しましょう。

PHP編

PHPのSAPI(実行環境)

PHPには主に以下の3つの実行環境が存在します。

  • Apacheモジュール版
  • Cli版
  • FastCGI版(fpm)

Apacheモジュール版はその名の通りApacheのモジュールとして動作します。インストールするだけで使え、尚且つ高速に動作しますが、モジュールとして読み込めるバージョンは一つであることに注意が必要です。

Cli版はコマンドラインでPHPを実行するための環境です。php ~ で実行するか、/usr/bin/php8.3 ~ のようにパスとバージョンを明記して実行できます。

FastCGI版はApacheとは独立したプロセスで起動させて、UNIXソケットで連携させる動作環境です。高速に動作し、Apacheとは独立しているがゆえに、複数のバージョンを同時に管理可能です。そもそもApache以外のWebサーバーとの連携はFastCGI版一択となります。

それぞれのPHPの動作環境の設定はphp.iniに記載されています。まずはphp.iniの設置場所です。

PHPの設定ディレクトリは /etc/php/ 内に各バージョン毎に分かれています。
さらに下に各実行環境(SAPI)毎の設定があります。
実行環境ごとにphp.iniが用意されているため、そちらで設定を追記/変更を行います。

  • etc
    • php
      • 8.3
        • apache2
          • (conf.d)
          • php.ini
        • cli
          • (conf.d)
          • php.ini
        • fpm
          • (conf.d)
          • (pool.d)
          • php-fpm.conf
          • php.ini
        • mods-available
          • xdebug.ini
          • etc・・・(各phpのモジュールの設定ファイル)

必要に応じてモジュールの有効化/無効化を行います。
これらの変更時には、かならずApache(やfpm)を再起動する必要があります。

php.iniを変更してPHPの動作環境を設定する

php.iniで良く行う最低限の設定を記載します。
以下はあくまで例です。

変更内容
### サーバーへデータを一度に送信(post)する際の制限

#最大データサイズ
post_max_size=512M

#送信ファイルの最大サイズ
upload_max_filesize=512M

#送信ファイルの最大数
max_file_uploads=20

また、以下の設定をファイルの末尾に追加すると、PHPのデバッガーであるxdebugを有効化出来ます。

### デバッガー有効化

[XDEBUG]
xdebug.start_with_request = yes
xdebug.client_port = 9003
xdebug.client_host = localhost
xdebug.mode = debug
xdebug.dump_globals = true
xdebug.dump_once = true
xdebug.dump.SERVER = *
xdebug.show_error_trace = 1
xdebug.show_exception_trace = 1
xdebug.show_local_vars = 1

PHPのモジュールを有効化する

PHPのモジュールは基本的にインストール時に有効化されています。
必要に応じて以下の方法で有効化して下さい。

PHPのモジュール有効化は phpenmod コマンドで行います。
無効化は phpdismod コマンドで行います。

PHPの有効なモジュールはwebであれば phpinfo() を確認しながら行います。
cliであれば php -m | grep <module-name> で確認します。

### PHP
sudo phpenmod mbstring # マルチバイト用モジュール有効化

# PHPバージョン指定 -v
sudo phpenmod -v 8.3 mbstring # 8.3のマルチバイト用モジュール有効化

# SAPI指定 -s
sudo phpenmod -s apache2 mbstring
sudo phpenmod -s cli mbstring
sudo phpenmod -s fpm mbstring

今回インストール/有効化したモジュールは以下

  • php8.3-mbstring :マルチバイト文字列操作用
  • php8.3-pdo :様々なデータベースに対応するインターフェースを提供(以下のモジュールと連携)
  • php8.3-pgsql :PostgreSQL接続用
  • php8.3-mysqlnd :MySQL接続用
  • php8.3-gd :画像操作機能
  • php8.3-xml :XMLパース用
  • php8.3-curl :Curl用
  • php8.3-fpm :FastCGI版PHP
  • php-xdebug :デバッグ用

これでPHPで開発する最低限の環境が整いました。
次回はPHPのコーディングを行います。

以下おまけ:複数のサイトでPHPのバージョン切り替える

fpmを有効化して複数のバージョンのPHPを使用する

前述の通りApacheモジュール版のPHPには有効化したバージョンしか同時に動かせないというデメリットがあります。
サイトごとにPHPのバージョンを切り替えたい、PHPのバージョンをアップデートする際に新バージョンのPHPをテストするコピーサイトを動かしたい等々複数のPHPを動作させる環境が必要となる場合があります。

これを解決するのがFast CGI版PHP、php-fpmです。php-fpmは独立したサービスとして起動させる必要があります。

こちらがphp-fpmのセットアップコマンドです。

# apache用のFast CGI(fcgi) モジュールインストール
sudo apt -y install libapache2-mod-fcgid
# fcgiの有効化
sudo a2enmod actions fcgid alias proxy_fcgi
# php8.3-fpmコンフィグの有効化(複数のバージョンがある場合は規定のバージョンのみ有効化すること)
sudo a2enconf php8.3-fpm

# fpmの開始
sudo service php8.3-fpm start
# fomの再起動
sudo service php8.3-fpm restart
# fpmの停止
sudo service php8.3-fpm stop

続いてsites-availableのコンフィグファイルのVirtualHostディレクティブに次のfpmの設定を追記します。

<IfModule proxy_fcgi_module>
    <FilesMatch ".+\.ph(?:ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
    </FilesMatch>
</IfModule>

全体は以下のようになります。

/etc/apache2/sites-available/test.webapp.com.conf

# port40001の監視
LISTEN 40001
# port40001アクセス時の設定
<VirtualHost *:40001>
    # サイト用ディレクトリの定数設定
    Define SITE_DIR /var/www/htdocs/test.webapp.com
    
    ・・・(略)
    
    CustomLog ${SITE_DIR}/log/access.log combined
    
    #### php-fpmでPHPを処理する設定 ####################### {
    <IfModule proxy_fcgi_module>
        <FilesMatch ".+\.ph(?:ar|p|tml)$">
            SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
        </FilesMatch>
    </IfModule>
    #### }
</VirtualHost>

これで http://localhost:40001 でサイトへアクセスした際は、Fcgi版のphp8.3が使用されます。

別バージョンを同居させてみる

例として以下のコマンドでPHP8.2をインストール/fpmをサービスとして開始し・・・

sudo apt -y install php8.2 php8.2-mbstring php8.2-pdo php8.2-pgsql php8.2-gd php8.2-mysqlnd php8.2-xml php8.2-curl php8.2-fpm
sudo service php8.2-fpm start

sites-available のコンフィグファイルの追記内容を以下のように変更すれば・・・

<IfModule proxy_fcgi_module>
    <FilesMatch ".+\.ph(?:ar|p|tml)$">
        # SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost" # 8.3
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost" # 8.2
    </FilesMatch>
</IfModule>

PHP8.2でサイトを実行可能です。