AWSのCentOS7にPHP7.4をソースからインストール – OpenSSL1.1.1 TLS1.3 対応

AWSのCentOS7.8にPHP7.4をyumでインストールしたものの、OpenSSLのバージョンが1.0.2k-fips 26 Jan 2017と古いままだったのでOpenSSL-1.1.1g PHP7.4.7 をソースビルドしてCode-ITリポジトリからApache2.4をインストールした顛末をメモ。

CentOS7にOpenSSL1.1.1をインストール | Qiita

OpenSSLは上記記事を参考に/usr/local/openssl-1.1.1 にインストール済みです。ただパスが通っていないので以下の通りにシンボリックリンクを貼りました。追記)/usr/local/openssl-1.1.1 への環境変数も追加で登録しました。

# mv /usr/bin/openssl /usr/bin/openssl.bak
# ln -s /usr/local/openssl-1.1.1/bin/openssl /usr/bin/openssl

# export PATH=/usr/local/openssl-1.1.1/bin:$PATH

CentOS 6 の環境にPHP7をインストールしてApacheで動かすまで

少々古い記事ですがPHP7.4のコンパイルに必要そうなパッケージはyumで一気に揃えます。

# yum -y install httpd-devel gd-devel libxml2-devel mysql-devel t1lib-devel
# yum -y install bzip2-devel curl-devel gmp-devel aspell-devel recode-devel
# yum -y install libmcrypt-devel

PHP7.4.7は公式から/usr/local/src にwget でダウンロード、解凍します。

# cd /usr/local/src
# wget https://www.php.net/distributions/php-7.4.7.tar.gz
# tar zxvf php-7.4.7.tar.gz
# cd php-7.4.7 # ./configure --with-apxs2=/usr/bin/apxs --bindir=/usr/local/bin --with-openssl=/usr/local/openssl-1.1.1 --with-libxml --with-mysqli --with-zlib --with-curl --with-xsl --with-gettext --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gmp \ --enable-mysqlnd \ --enable-mbstring \ --enable-bcmath \ --enable-pcntl \ --enable-cgi \ --enable-cli \ --enable-exif \ --enable-ftp \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-sysvmsg \ --enable-shmop \ --enable-calendar \ --enable-opcache \ --enable-intl \ --disable-debug

途中、make testでopcacheインストールしてないよ!とかいろいろ怒られましたがyumでその都度インストール対応しました。

# yum --enablerepo=epel,remi-php74 install php-opcache

make & make install

# make
# make install

で表題の件。

CentOS7にyumでHTTP/2.0対応Apache/OpenSSLを導入してみる

CodeITリポジトリ導入。Apache2.4本体、秘密鍵のインストールして起動・・・

# cd /etc/yum.repos.d && wget https://repo.codeit.guru/codeit.el`rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release)`.repo
# yum install httpd

# cd /etc/pki/tls/certs/
# make localhost.crt
# make localhost.key # cd ../private/ # cp ../certs/localhost.key ./
# cp localhost.key localhost.key.orig ## 秘密鍵のパスフレーズを解除 # openssl rsa -in localhost.key.orig -out localhost.key

## Apache httpd HTTPSとHTTP/2通信用の設定
## ssl.confの # Virtual Host Context 行下に追記

# vi /etc/httpd/conf.d/ssl.conf

Protocols h2 http/1.1 (追記 # systemctl start httpd

起動しようとしたのですが失敗しました。

systemctl status httpd.service -l でエラーメッセージを取得すると、

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP

Google先生に訊いてみるとApache がWorker として起動していてPHPと不整合している旨了解しました。/etc/httpd/conf.modules.d/00-mpm.conf を編集して

#LoadModule mpm_event_module modules/mod_mpm_event.so ←チェック
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so ←チェックを外す

するとApache 起動しました。

PHPインストール時のMPMのエラーを手っ取り早く解消する

AWSのt2.microではPHPのソースビルドでも「aws virtual memory exhausted: メモリを確保できません」エラーが出てスワップを作らないとインストールできなかったほど限界で、マルチスレッドからシングルスレッドになりスピードダウンは否めないのでWorkerモードしてもどの程度負荷軽減できるか課題の残るところです。phpinfo.php で確認すると無事、OpenSSL1.1.1g TLS1.3 対応しました。

スワップ作成は以下のサイトが参考になりました。

[Rails] CapistranoでEC2へデプロイ:EC2仮想メモリ不足トラブルシュート