PHP7にAPCuを導入しWebサイトを高速化

当BlogサイトはPHPベースのWordPressで動作しているのですが、htmlの静的ページに比べると非常に動作が遅いです。

今回、PHP7にAPCuを導入(ソースビルド)することで3倍近く高速化に成功しましたので投稿しておきます。

私のWebサーバー(CentOS 7 + Apache 2.4 + PHP 7)は、yumではなくソースからビルドして動作させているので、巷に溢れる高速化手段を簡単に導入できずにいましたが、たまたま見かけたこのサイトを参考にさせていただき無事改善させることができました。ありがとうございました!

まず結果から

Server Software: Apache/2.4.41
Server Hostname: ji0vwl.net
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,4096,128
TLS Server Name: ji0vwl.net

未対策APCuを導入
Requests per second:3.33 [#/sec]10.30 [#/sec] (x3.1)
Connect (min):43 [ms]46 [ms]
Processing (min):372 [ms]137 [ms]  (÷2.7)
Waiting (min):361 [ms]124 [ms]   (÷2.9)
Total (min):415 [ms]183 [ms]

接続時間は変わりませんが、処理時間と待ち時間が3分の1ほどに短縮され、このWebサーバーで捌ける秒間リクエスト数が約3倍となりました。

 

導入

基本的にはこのページの通りなのですが、PHPのビルドのところだけ違います。Apache 2.4.41とOpennSSL 1.1.1cはすでに導入済みなので、PHPだけ再ビルドすればOKです。

5. PHP 7.3.8 を /usr/local/php7.3.8 にインストールする

5.1. PHPAPCu/APCu_bcの準備

それぞれ最新のソースをwgetでダウンロードしてきます。apcuとapcu_bcは、PHPのソース展開後 php-7.3.8/ext/ ディレクトリ内に展開し、それぞれリネームします。

$ sudo -i
# cd /usr/local/src
# yum -y install libxml2-devel systemd-devel libpng-devel libwebp libwebp-devel libwebp-tools
# wget http://jp2.php.net/get/php-7.3.8.tar.gz/from/this/mirror -O /usr/local/src/php-7.3.8.tar.gz
# tar -xvzf php-7.3.8.tar.gz
# cd php-7.3.8/ext
# wget -q https://pecl.php.net/get/apcu-5.1.17.tgz
# wget -q https://pecl.php.net/get/apcu_bc-1.0.5.tgz
# tar zxvf apcu-5.1.17.tgz
# tar zxvf apcu_bc-1.0.5.tgz
# mv apcu-5.1.17 apcu
# mv apcu_bc-1.0.5 apcu_bc
# cd ..
# rm -rf configure
# ./buildconf --force
Forcing buildconf
Removing configure caches
buildconf: checking installation...
buildconf: autoconf version 2.69 (ok)
rebuilding aclocal.m4
rebuilding configure
rebuilding main/php_config.h.in

 

5.2. PHP 7.3.8 を /usr/local/php7.3.8 にインストールする

–with-apxs2=[dir]でPHPとApacheを、–with-openssl=[dir]でPHPとOpenSSLを、–with-mysql-sock=[dir]でPHPとmySQLを結びつけます。

今回は–enale-apcと–enable-apcuを追加しています。

# ./configure \
--prefix=/usr/local/php7.3.8 \
--with-apxs2=/usr/local/httpd4/bin/apxs \
--with-openssl=/usr/local/ssl \
--with-mysql-sock=/var/lib/mysql/mysql.sock \
--with-mysqli \
--with-pdo-mysql \
--enable-mbstring \
--with-freetype-dir=/usr \
--with-png-dir=/usr \
--with-jpeg-dir=/usr \
--with-webp-dir=/usr \
--with-gd=shared \
--with-zlib \
--with-fpm-systemd \
--with-fpm-user=apache \
--with-fpm-group=apache \
--enable-gd-jis-conv \
--enable-fpm \
--enable-apc \
--enable-apcu
# make
# make install
# libtool --finish /usr/local/src/php-7.3.8/libs

 

5.3. php.iniを作成する

いままでphp.iniを作らずに素の状態でやってきましたが、APCuを有効にするために作成します。Opcacheも有効にしておきます。php.iniを作る場所ですが、私の場合PHPインストールディレクトリ配下のlib/ディレクトリ内でした。分からない場合はこちら

# cd /usr/local/php7.3.8/lib
# vim php.ini
max_execution_time=600
memory_limit=128M
error_reporting=0
display_errors=0
log_errors=0
user_ini.filename=
realpath_cache_size=2M
cgi.check_shebang_line=0
date.timezone = "Asia/Tokyo"
zend_extension=opcache.so

[opcache]
opcache.enable=1
;opcache.enable_cli=0
opcache.memory_consumption=64
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
;opcache.max_wasted_percentage=5
;opcache.use_cwd=1
;opcache.validate_timestamps=1
opcache.revalidate_freq=2
opcache.revalidate_path=0
;opcache.save_comments=1
opcache.fast_shutdown=1
;opcache.enable_file_override=0
opcache.optimization_level=0xffffffff
;opcache.inherited_hack=1
;opcache.dups_fix=0
;opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
;opcache.max_file_size=0
;opcache.consistency_checks=0
;opcache.force_restart_timeout=180
;opcache.error_log=
;opcache.log_verbosity_level=1
;opcache.preferred_memory_model=
;opcache.protect_memory=0
;opcache.restrict_api=
;opcache.file_cache=
;opcache.file_cache_only=0
;
apc.enabled = 1
apc.enable_cli=1
apc.shm_size=40M
apc.ttl=3600
apc.gc_ttl=3600
;apc.mmap_file_mask=/tmp/apc.XXXXXX
;
;;mbstring
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII

 

:wqで保存したら、最後にhttpd4(私のWebサーバーの名前)を再起動して完了!

# systemctl restart httpd4

 

パフォーマンス確認方法

Macのコンソールから、ab(Apache Bench)コマンドを実行。簡単ですね。

$ ab -n [総リクエスト数] -c [同時リクエスト数] [URL]

$ ab -n 10 -c 10 https://ji0vwl.net/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking ji0vwl.net (be patient).....done


Server Software:        Apache/2.4.41
Server Hostname:        ji0vwl.net
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,4096,128
TLS Server Name:        ji0vwl.net

Document Path:          /
Document Length:        26601 bytes

Concurrency Level:      10
Time taken for tests:   0.971 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      271380 bytes
HTML transferred:       266010 bytes
Requests per second:    10.30 [#/sec] (mean)
Time per request:       971.152 [ms] (mean)
Time per request:       97.115 [ms] (mean, across all concurrent requests)
Transfer rate:          272.89 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       46  183 212.3     89     586
Processing:   137  410 165.4    466     578
Waiting:      124  398 165.5    453     566
Total:        183  593 171.0    628     799

Percentage of the requests served within a certain time (ms)
  50%    628
  66%    652
  75%    664
  80%    777
  90%    799
  95%    799
  98%    799
  99%    799
 100%    799 (longest request)

 

t3a.nanoという貧弱インスタンスでも GoogleのPageSpeed Insightsでも高得点が出るようになりました。パソコンの方は甘いので簡単に100点が出ますが、モバイルの方はかなり辛めで、いままで良くても80点代後半でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

リンクが含まれる投稿はサイト管理者の承認後に表示されます(スパム対策)