CentOS6.10にPHP8.1をインストールしてPHP-FPMを動かす方法

# ※CentOS6は2020年11月にサポート終了しました
- ※opcache,iconv,argon2を有効にしてのphp8.1のビルドが通りませんでしたので無効にしていますが
- 最後にphpizeでopcacheをインストールします
- サポート終了しているのでガッツリ使う人はいないと思いますが一応...
- CentOS6.10のminimal.isoを使いインストール済み

```diff:/etc/ssh/sshd_config (rootログイン禁止/空文字パスワード禁止)
- #PermitRootLogin yes
+ PermitRootLogin no
---
- #PermitEmptyPasswords no
+ PermitEmptyPasswords no
```
```sh:sshd再起動
/etc/rc.d/init.d/sshd restart
```


```sh:repoファイルのURL書き換え(そのままではyum updateできないため)
sudo sed -i -e "s/^mirrorlist=http:\\/\\/mirrorlist.centos.org/#mirrorlist=http:\\/\\/mirrorlist.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo
sudo sed -i -e "s/^#baseurl=http:\\/\\/mirror.centos.org/baseurl=http:\\/\\/vault.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo

yum -y update
```

```sh:apache2.2とphp5.3をインストール
yum -y install httpd php php-mbstring
```

```sh:gccとか開発ツールを入れておく
yum -y groupinstall "Development Tools"
yum -y install wget
```

- 作業は /usr/local/src内で行う

```sh
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib64/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib64/pkgconfig
```

```sh:libxml2(https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.14.tar.xz)
./configure \
--with-history \
--with-python=/usr/bin

make
make install
```

```sh:python3のためにzlibを入れる(https://zlib.net/zlib-1.2.13.tar.gz)
./configure -s
make
make install
```

```sh
# python3(https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tgz)
./configure --enable-optimizations

make altinstall

ln -sfn /usr/local/bin/python3.10 /usr/bin/python3.10
```
> 警告 make install は python3 バイナリを上書きまたはリンクを破壊してしまうかもしれません。そのため、make install の代わりに exec_prefix/bin/pythonversion のみインストールする make altinstall が推奨されています。
[2. Unix プラットフォームで Python を使う – 2.2. Python のビルド](https://docs.python.org/ja/3/using/unix.html?highlight=altinstall)

```sh:いらない？
# http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
./configure
make
make install
```

```sh:OpenSSL(https://www.openssl.org/source/openssl-1.1.1q.tar.gz)
./Configure \
no-shared \
linux-x86_64 \
no-md2 \
no-mdc2 \
no-rc5 \
no-rc4 \
enable-ssl2 \
enable-ssl3

make
make install
```

```sh:sqlite3(https://www.sqlite.org/2022/sqlite-autoconf-3390400.tar.gz)
./configure

make
make install
```

```sh:curl(https://curl.se/download/curl-7.85.0.tar.gz)
./configure \
--with-ssl

make
make install
```

```sh:oniguruma(https://github.com/kkos/oniguruma/releases/download/v6.9.8/onig-6.9.8.tar.gz)
./configure

make
make install
```

```sh:libpng(https://download.sourceforge.net/libpng/libpng-1.6.38.tar.gz)
./configure

make
make install
```

```sh:libjpeg(https://www.ijg.org/files/jpegsrc.v9e.tar.gz)
./configure

make
make install
```

```sh:freetype2(https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.gz)
# freetype2
./configure
make
make install
```

```sh:libsodium(https://download.libsodium.org/libsodium/releases/libsodium-1.0.18-stable.tar.gz)
./configure
make
make install
```

```sh
# libgd 2.3.3
./configure \
--with-jpeg \
--with-png \
--with-webp \
LIBWEBP_CFLAGS=-I/usr/local/libwebp/include \
LIBWEBP_LIBS=-L/usr/local/libwebp/lib

make
make install
```


```sh
# iconv 1.17
./configure

make
make install
```

```sh
/usr/local/cmake-3.24.2-linux-x86_64/bin/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/libzip-1.9.2
```



```sh:php8.1のインストール
wget --no-check-certificate https://www.php.net/distributions/php-8.1.11.tar.gz
./configure \
--prefix=/usr/local/php-8.1.11 \
--with-config-file-path=/etc/php8 \
--with-config-file-scan-dir=/etc/php8/php.d \
--with-fpm-user=apache \
--with-fpm-group=apache \
--enable-fpm \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv \
--with-freetype \
--with-jpeg \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-exif \
--enable-sysvsem \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--with-sodium \
--enable-gd \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--enable-ftp \
--with-gettext \
--enable-soap \
--disable-debug \
--with-pear \
--disable-opcache \
--without-iconv

make -j $(nproc)
make install
```

# php.iniとphp-fpmを作る
```sh
mkdir /etc/php8
cp /usr/local/src/php-8.1.11/php.ini-production  /etc/php8/php.ini
cp /usr/local/src/php-8.1.11/sapi/fpm/init.d.php-fpm /etc/init.d/php8-fpm
chmod 700 /etc/init.d/php8-fpm
chkconfig php8-fpm on
```

```sh
You may want to add: /usr/local/php-8.1.11/lib/php to your php.ini include_path
```
- make install後、上記のようなメッセージが表示されるので下記のようにする
```diff:/etc/php8/php.ini
- ;include_path = ".:/php/includes"
+ include_path = ".:/usr/local/php-8.1.11/lib/php"
```

# php-fpmの設定
```sh
# 設定ファイルのサンプルがあるのでリネームして使う
cd /usr/local/php-8.1.11/etc
mv php-fpm.conf.default php-fpm.conf
cd php-fpm.d
mv www.conf.default www.conf
```

```diff:vim /usr/local/php-8.1.11/etc/php-fpm.d/www.conf
- listen 127.0.0.1:9000
+ listen 127.0.0.1:9081 # ポート変更

- pm = dynamic
+ pm = ondemand
```

```sh
service php8-fpm start
```

# apach2.2(古い)でphp-fpmを使うためにmod_fastcgiを入れる
```sh
cd /usr/local/src
wget https://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm
yum install mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm
```

# mod_fastcgiの設定
```diff:/etc/httpd/conf.d/fastcgi.conf
- #FastCgiWrapper On
+ FastCgiWrapper Off

# global FastCgiConfig can be overridden by FastCgiServer options in vhost config
- FastCgiConfig -idle-timeout 20 -maxClassProcesses 1
+ #FastCgiConfig -idle-timeout 20 -maxClassProcesses 1

# 末尾に追記
+ ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/
+  
+ # PHP 8.1
+ FastCgiExternalServer /var/www/fcgi-bin/php-fpm81 -host 127.0.0.1:9081 -pass-header Authorization 
+ Action php-fastcgi81 /fcgi-bin/php-fpm81
```

```sh:上記ScriptAliasを使うために用意
mkdir /var/www/fcgi-bin
```

# Apacheの設定
```diff:/etc/httpd/conf/httpd.conf
- #NameVirtualHost *:80
+ NameVirtualHost *:80
```

```/etc/httpd/conf.d/vhost_php81.conf
<VirtualHost *:80>
    DocumentRoot /var/www/php81.centos6.test
    ServerName php81.centos6.test
 
    <FilesMatch ".+\.php$">
        SetHandler php-fastcgi81
    </FilesMatch>
 
    ErrorLog logs/php81.centos6.test-error_log
    CustomLog logs/php81.centos6.test-access_log combined
</VirtualHost>
```

```sh
mkdir /var/www/php81.centos6.test
cd /var/www/php81.centos6.test
vi index.php
```

```php
<?php phpinfo();
```

# SELINUXをオフにする
```diff:/etc/selinux/config
- SELINUX=enforcing
+ SELINUX=disabled
```

# composerをインストール
- phpコマンドをphp8.1を使うようにする
```.bashrc
export PATH=/usr/local/php-8.1.11/bin:/usr/local/php-8.1.11/sbin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/php-8.1.11/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
```

```sh:グローバルにインストールする場合
wget https://getcomposer.org/installer -O composer-setup.php
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
```
```sh:ローカルにインストールする場合(各ユーザーのホームディレクトリで)
wget https://getcomposer.org/installer -O composer-setup.php
mkdir bin
php composer-setup.php --install-dir=bin --filename=composer
php -r "unlink('composer-setup.php');"
```

---
# LaravelをComposerでインストール
```sh
composer create-project laravel/laravel app --prefer-dist
```

以上で、Laravel9のwelcomeページの表示までできました

# phpizeでopcacheを入れる
- 通常PHPのビルド時にしか拡張機能を有効化できない(./configure --enable-XXX --with-XXXなど)
- phpizeを使うと拡張用ライブラリ(.so)をビルド、インストールすることができる
- peclの方が簡単ではあるが一部の機能しか対応していない、phpizeは全機能対応らしい
- php.iniのextension = <extension>を有効化する
```sh:autoconfを2.68以上にする
wget https://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.gz
./configure
make
make install
```

```sh:opcacheのビルド・インストール
cd /usr/local/src/php-8.1.11/ext/opcache
phpize
./configure --with-php-config=/usr/local/php-8.1.11/bin/php-config
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/src/php-8.1.11/ext/opcache/modules
make; make install
```

```diff:/etc/php8/php.ini
- ;zend_extension=opcache
+ zend_extension=opcache
```