LinuxでApache2.4(httpd 2.4.43)＋PHP7.4をソースコンパイルしてWebサーバー構築 - 2.PHP導入編

# 前提と準備

## Linuxサーバー構築の記事
- [Sambaでファイルサーバー構築(CentOS 8.1・openSUSE 15.1・Ubuntu 20.04)](https://qiita.com/kazumi75kitty/items/4298795029ba9f67b9d2)
- [LinuxでApache2.4＋PHP7.4をソースコンパイル - 1.Apache導入](https://qiita.com/kazumi75kitty/items/daaf8ff8feb50ad04f41) /[【Raspberry Pi】](https://qiita.com/kazumi75kitty/items/67686eccaaec73251458)
- LinuxでApache2.4＋PHP7.4をソースコンパイル - 2.PHP導入【この記事】 /[【Raspberry Pi】](https://qiita.com/kazumi75kitty/items/50f1a447f6ebc2ee2b61)
- [LinuxでApache2.4＋PHP7.4をソースコンパイル - 3.MySQL導入](https://qiita.com/kazumi75kitty/items/76807c637c096618a0e1)/[【Raspberry Pi】](https://qiita.com/kazumi75kitty/items/4212dacc45944f27ca94)
- [LinuxでApache2.4＋PHP7.4 - 4.セキュリティ(chownとfirewalld)](https://qiita.com/kazumi75kitty/items/8ad51806ac50bd04b644)
- [LinuxでIPsecゲートウェイをVPN構築 - 1.StrongSwan導入](https://qiita.com/kazumi75kitty/items/60941f00ae91c4d9f555) /[【Ubuntu 20.04＋Raspberry Pi】](https://qiita.com/kazumi75kitty/items/08259681247a6c2ebd0d)
- [LinuxでIPsecゲートウェイをVPN構築 - 2.VPNへの接続確認](https://qiita.com/kazumi75kitty/items/f5a33abda9f8edd5c47f) /[【Ubuntu 20.04＋Raspberry Pi】](https://qiita.com/kazumi75kitty/items/c83f920f052d83d62457)

[前回](https://qiita.com/kazumi75kitty/items/daaf8ff8feb50ad04f41)はApache httpd 2.4.43をソースコンパイルでWebサーバーで構築しましたが、今回は、前回に引き続き、ApacheにWebアプリサーバーの基幹であるPHP 7.4をソースコンパイルで導入します(⑅•ᴗ•⑅)

## 環境
- Webサーバープログラム：Apache 2.4.43 ＋ PHP 7.4.6(ソースコンパイル)
- クライアント：Windows10 Pro
- サーバーのアーキテクチャ：x64(動作はHyper-Vの第2世代で確認) Linuxのディストリビューション：CentOS 8.1 / openSUSE 15.1 Leap / Ubuntu 20.04(すべて64bit)

## 前提
- ユーザーはrootでインストール(私の検証ではadminという管理者アカウントにて、そこからsudoで処理しています)
- どのディストリビューションでも、ファイアウォールはfirewalldを使う(ディストリビューション独自のファイアウォールコマンドは使用しない)
- [前回](https://qiita.com/kazumi75kitty/items/daaf8ff8feb50ad04f41)の記事のApache導入を完了していること(動作が確認できて、Webサーバーとして構築されていること)

## サーバー条件
### IPアドレス
- クライアント：192.168.1.11
- Webサーバー：192.168.1.18(どのディストリビューションでも同じIPアドレスで検証)
- 所属ネットワークセグメント：192.168.1.0/24
![Webサーバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/a7610e28-afe4-2724-d772-8e45a4b1931e.png "Webサーバーとクライアントのネットワーク図")

### パッケージを個別ダウンロードしてインストールする機能とバージョン(2020年6月時点)
- zlib-1.2.11.tar.gz
- apr-1.7.0.tar.gz
- apr-util-1.6.1.tar.gz
- mysql80-community-release-el8-1.noarch.rpm (CentOS 8.1)
- mysql80-community-release-sl15-3.noarch.rpm (openSUSE 15.1)
- mysql-apt-config_0.8.15-1_all.deb (Ubuntu 20.04)
- oniguruma-devel-6.8.2-1.el8.x86_64.rpm (CentOS 8.1)
- httpd-2.4.43.tar.gz
- php-7.4.6.tar.gz

それ以外の必要なパッケージは、ディストリビューションの標準パッケージコマンド(dnfやaptなど)でインストールし、個別ダウンロードは不要です。

ダウンロードについては、公式サイトにアクセスして、そこからダウンロードしてFTPで転送するか、ダウンロードファイルのURLさえわかれば、wgetで入手することもできますが、入手方法は省略しています。

# 作業手順
## PHPのインストール
### PHPのソースコンパイルに必要なライブラリを導入

```CentOS8.1
# dnf -y install libxml2 libxml2-devel sqlite-devel
# dnf -y install oniguruma-devel-6.8.2-1.el8.x86_64.rpm
```

```openSUSE15.1
# zypper -n install libxml2-tools libxml2-devel sqlite3-devel oniguruma-devel
```

```Ubuntu20.04
# apt-get -y install libxml2 libxml2-dev libsqlite3-dev libonig-dev
```

PHP7.3までは、SQLiteと鬼車のライブラリを使わなくてもマルチバイト文字列を扱うようインストールができたのですが、PHP7.4ではソースコンパイルで必須となりました。

CentOS 8.1のみ、鬼車ライブラリ(oniguruma-devel-6.8.2-1.el8.x86_64.rpm)はデフォルトパッケージには存在しないため、CentOSパッケージのダウンロードページから持ってきました。

2020年6月現在：
[http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/oniguruma-devel-6.8.2-1.el8.x86_64.rpm](http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/oniguruma-devel-6.8.2-1.el8.x86_64.rpm)

### PHPのソースコンパイル
コンパイルには20～30分前後かかる見込みです。Apacheより規模が大きいので、コンパイル中はコーヒー1杯で休憩をはさんだほうがいいかもしれません(\*˘︶˘\*).｡.:\*♡

```
# cd [php-7.4.6.tar.gzが置いてあるディレクトリ]
# tar xvzf php-7.4.6.tar.gz
# cd php-7.4.6/
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysqli --with-pdo-mysql --enable-mbregex --enable-mbstring
# make
# make test
```

- MySQLはPDOを有効にします
- マルチバイト文字列を有効にします

「make」「make test」が時間がかかるコマンドです。
途中でエラーがなければコンパイル完了です。
なお、CentOS 8.1とUbuntu 20.04でmake testで私がテストしたところ、なんとバグは一つもなかったのです( ๑･∞･๑ )　…OSと相性がいいのかもしれません
![php_test_fail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/7b96f024-3b82-4ae7-c416-ac2b1e909e6f.png "Tests failedが0件")

### PHPのインストール
コンパイルが完了したら、インストールします。

```CentOS8.1・Ubuntu20.04
# make install
Installing PHP SAPI module:       apache2handler
/usr/local/apache2/build/instdso.sh SH_LIBTOOL='/opt/apr-1.7.0/build-1/libtool' libphp7.la /usr/local/apache2/modules
/opt/apr-1.7.0/build-1/libtool --mode=install install libphp7.la /usr/local/apache2/modules/
libtool: install: install .libs/libphp7.so /usr/local/apache2/modules/libphp7.so
libtool: install: install .libs/libphp7.lai /usr/local/apache2/modules/libphp7.la
libtool: warning: remember to run 'libtool --finish /home/admin/php-7.4.6/libs'
chmod 755 /usr/local/apache2/modules/libphp7.so
[activating module `php7' in /usr/local/apache2/conf/httpd.conf]
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-zts-20190902/
Installing PHP CLI binary:        /usr/local/bin/
Installing PHP CLI man page:      /usr/local/php/man/man1/
Installing phpdbg binary:         /usr/local/bin/
Installing phpdbg man page:       /usr/local/php/man/man1/
Installing PHP CGI binary:        /usr/local/bin/
Installing PHP CGI man page:      /usr/local/php/man/man1/
Installing build environment:     /usr/local/lib/php/build/
Installing header files:          /usr/local/include/php/
Installing helper programs:       /usr/local/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php/man/man1/
  page: phpize.1
  page: php-config.1
/home/admin/php-7.4.6/build/shtool install -c ext/phar/phar.phar /usr/local/bin
ln -s -f phar.phar /usr/local/bin/phar
Installing PDO headers:           /usr/local/include/php/ext/pdo/
```

```openSUSE15.1
# make install
Installing PHP SAPI module:       apache2handler
/usr/local/apache2/build/instdso.sh SH_LIBTOOL='/opt/apr-1.7.0/build-1/libtool' libphp7.la /usr/local/apache2/modules
/opt/apr-1.7.0/build-1/libtool --mode=install install libphp7.la /usr/local/apache2/modules/
libtool: install: install .libs/libphp7.so /usr/local/apache2/modules/libphp7.so
libtool: install: install .libs/libphp7.lai /usr/local/apache2/modules/libphp7.la
libtool: warning: remember to run 'libtool --finish /home/admin/php-7.4.6/libs'
chmod 755 /usr/local/apache2/modules/libphp7.so
[activating module `php7' in /usr/local/apache2/conf/httpd.conf]
Installing shared extensions:     /usr/local/lib64/extensions/no-debug-zts-20190902/
Installing PHP CLI binary:        /usr/local/bin/
Installing PHP CLI man page:      /usr/local/php/man/man1/
Installing phpdbg binary:         /usr/local/bin/
Installing phpdbg man page:       /usr/local/php/man/man1/
Installing PHP CGI binary:        /usr/local/bin/
Installing PHP CGI man page:      /usr/local/php/man/man1/
Installing build environment:     /usr/local/lib64/build/
Installing header files:          /usr/local/include/php/
Installing helper programs:       /usr/local/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php/man/man1/
  page: phpize.1
  page: php-config.1
/home/admin/php-7.4.6/build/shtool install -c ext/phar/phar.phar /usr/local/bin
ln -s -f phar.phar /usr/local/bin/phar
Installing PDO headers:           /usr/local/include/php/ext/pdo/
```

PHPのライブラリのいくつかは「/usr/local/include/php/」「/usr/local/lib/php/」のように、用途に応じて複数の配置場所へ配置されます。openSUSE 15.1の場合は「/usr/local/lib64/php/」に配置されるものもあります。
また、この時点で、**PHPのDLL(ダイナミックリンクライブラリ、外部拡張アプリケーションに該当する)は自動的にApacheのフォルダに配備されます**。

次に、PHPの環境設定ファイルのコピーを行います。
まずはphp.iniをPHPのライブラリフォルダ/usr/local/lib(openSUSEの場合はlib64)/にコピーします。

```CentOS8.1・Ubuntu20.04
# cp php.ini-development /usr/local/lib/php.ini
# ls -l /usr/local/lib
合計 328
-rw-r--r-- 1 root root 144402  6月 24 12:34 libz.a
lrwxrwxrwx 1 root root     14  6月 24 12:34 libz.so -> libz.so.1.2.11
lrwxrwxrwx 1 root root     14  6月 24 12:34 libz.so.1 -> libz.so.1.2.11
-rwxr-xr-x 1 root root 113656  6月 24 12:34 libz.so.1.2.11
drwxr-xr-x 4 root root     37  6月 24 16:19 php
-rw-r--r-- 1 root root  72278  6月 24 16:21 php.ini
drwxr-xr-x 2 root root     21  6月 24 12:34 pkgconfig
```

```openSUSE15.1
# cp php.ini-development /usr/local/lib64/php.ini
# ls -l /usr/local/lib64
合計 72
drwxr-xr-x 1 root root   338  6月 25 16:59 build
drwxr-xr-x 1 root root    42  6月 25 16:59 extensions
-rw-r--r-- 1 root root 72278  6月 25 17:01 php.ini
```

### Apache側の設定
Apacheで、PHPファイルが認識できるようにする必要があるので編集します。PHPのDLLは、PHPインストール時にhttpd.confで自動的に書き込まれるので追加不要です。httpd.conf側でやるべきことは、PHPのMIMEタイプがApacheで認識されればよいのです。

```
# vi /usr/local/apache2/conf/httpd.conf
```

```xml:/usr/local/apache2/conf/httpd.conf
…
<IfModule dir_module>
    DirectoryIndex index.html　← 「index.php」を追加
</IfModule>
…
<IfModule mime_module>
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    …
    AddType application/x-httpd-php .php  ←   この行を追加
</IfModule>
…
```

### PHPの環境設定
PHPの文字コードや参照ライブラリの設定を変えます。

PHPをコンパイルインストールした際に、ディストリビューションによって、php.iniの格納ディレクトリが違います。**openSUSEのみ、/usr/local/lib64/にPHPが含まれています**ので、ライブラリフォルダ「lib」の違いが紛らわしいです

```CentOS8.1・Ubuntu20.04
# vi /usr/local/lib/php.ini
```

```openSUSE15.1
# vi /usr/local/lib64/php.ini
```

```ini:php.ini
# 内容が長いので、一部修正するもののみ、修正後のもののみを記載します。セミコロン「;」は外します。「;」外すだけの行も含めて記載されています
output_buffering = On
default_charset = "UTF-8"
 [CentOS 8.1・Ubuntu 20.04] include_path = ".:/usr/local/include/php:/usr/local/lib/php"
 [openSUSE 15.1] include_path = ".:/usr/local/include/php:/usr/local/lib64"
extension_dir = "/usr/local/include/php/ext"
date.timezone = Asia/Tokyo
mbstring.language = Japanese
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8, SJIS, EUC-JP, JIS, ASCII
mbstring.substitute_character = none
```

## PHPの動作確認
### PHP確認用のページ
まずは確認用のPHPページを作ります。

```
# vi /usr/local/apache2/htdocs/phpi.php
```

```php:phpi.php
<?php phpinfo(); ?>
```

なぜPHPファイルを/usr/local/apache2/htdocs/に配置する？？って聞かれますが、Apacheをソースコンパイルでインストールすると、Webページデータの格納フォルダは「/usr/local/apache2/htdocs/」がデフォルトだからです。まぁ、httpd.confで格納先を変更できますが、今回はそれは割愛します。

### Apacheの再起動

```
# systemctl stop httpd
# systemctl start httpd
# systemctl status httpd
```
再起動しないとPHPのモジュールをロードした状態でApacheが動作しないので、一度止めてから、再スタートします。その後、statusで起動していることを確認します。
![phpinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/2b6b4331-954a-f90f-1338-ab07b7b7c61c.png "PHPが認識できた！！")
PHPが正しく認識できました！！(\*´꒳`\*)

![pdo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/56400b99-ffef-a001-7e85-05fbb766dc93.png "PDOも使える！！")
PDOもちゃんと認識できています。そうしないとMySQLとSQLiteが使えないからね…( ´ •̥  ̫ •̥ ` )

![susephpi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/f15e2352-43c2-1acf-3272-e38058e85cf3.png "openSUSE 15.1での実行結果")

openSUSE 15.1の場合だと、php.iniの場所が「/usr/local/lib64」となって認識されていることがわかります。

# 次回
MySQLを導入して、PHPのWebアプリサーバーがデータベースを利用できるようにします