DockerにAPCu OPcacheを入れてwordpressのアクセス集中負荷を軽減させる

PHP

とある期間にアクセスが集中してしまうwordpressサイトで負荷が上がってしまうので、その対策。
APCu OPcacheを使って

PHPのDockerfileに以下を追加

# Install opcache
RUN docker-php-ext-install opcache

# Install APCu
RUN pecl install apcu
RUN echo "extension=apcu.so" > $PHP_INI_DIR/conf.d/apcu.ini

追記したら、buildしてup -dする。

インストールができたのか確認

Dockerコンテナのシェルに入ってから確認

$ docker exec -it [コンテナ名] bash

 

導入前

# php -v
PHP 7.2.23 (cli) (built: Sep 27 2019 00:10:23) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
# php -i | grep 'apc'
# php -i | grep 'opcache'

どちらもレスポンスなし

導入後

# php -v
PHP 7.2.23 (cli) (built: Sep 27 2019 00:10:23) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.23, Copyright (c) 1999-2018, by Zend Technologies
php -i | grep 'apc'
Additional .ini files parsed => /usr/local/etc/php/conf.d/apcu.ini,
apcu
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enabled => On => On
apc.entries_hint => 4096 => 4096
apc.gc_ttl => 3600 => 3600
apc.mmap_file_mask => no value => no value
apc.preload_path => no value => no value
apc.serializer => php => php
apc.shm_segments => 1 => 1
apc.shm_size => 32M => 32M
apc.slam_defense => Off => Off
apc.smart => 0 => 0
apc.ttl => 0 => 0
apc.use_request_time => Off => Off
php -i | grep 'opcache'
/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini,
opcache.blacklist_filename => no value => no value
opcache.consistency_checks => 0 => 0
opcache.dups_fix => Off => Off
opcache.enable => On => On
opcache.enable_cli => Off => Off
opcache.enable_file_override => Off => Off
opcache.error_log => no value => no value
opcache.file_cache => no value => no value
opcache.file_cache_consistency_checks => 1 => 1
opcache.file_cache_only => 0 => 0
opcache.file_update_protection => 2 => 2
opcache.force_restart_timeout => 180 => 180
opcache.huge_code_pages => Off => Off
opcache.inherited_hack => On => On
opcache.interned_strings_buffer => 8 => 8
opcache.lockfile_path => /tmp => /tmp
opcache.log_verbosity_level => 1 => 1
opcache.max_accelerated_files => 10000 => 10000
opcache.max_file_size => 0 => 0
opcache.max_wasted_percentage => 5 => 5
opcache.memory_consumption => 128 => 128
opcache.opt_debug_level => 0 => 0
opcache.optimization_level => 0x7FFFBFFF => 0x7FFFBFFF
opcache.preferred_memory_model => no value => no value
opcache.protect_memory => 0 => 0
opcache.restrict_api => no value => no value
opcache.revalidate_freq => 2 => 2
opcache.revalidate_path => Off => Off
opcache.save_comments => 1 => 1
opcache.use_cwd => On => On
opcache.validate_permission => Off => Off
opcache.validate_root => Off => Off
opcache.validate_timestamps => On => On

どちらもインストールがされたことが確認できました

利用状況の確認ツール

apcとは違い、APCu、OPcacheは自前で確認ツールを設置する必要があります

APCuパネルダウンロード
https://github.com/krakjoe/apcu/

OPcacheパネルのソースダウンロード
https://gist.github.com/ck-on/4959032

それぞれwebサーバーのアクセスできるところに設置。
APCuはソースコードの中のユーザー名、パスワードを変更しておかないと管理者画面が見れませんが
セキュリティーには気をつけましょう。
basicのかかったディレクトリに入れるなど。

OPcacheは、ソースコードのメモリ再利用なので、すぐに利用が始まりますが、APCuはオブジェクトや変数の再利用なのでPHPから意図的に利用をさせないと、設置しただけでは利用されないことがわかります。

 

wordpressでAPCuを利用する場合

プラグイン版もあるようですが、wp-contentsにobject-cache.phpファイルを1つ置けばそれだけで有効化されます

ダウンロード
https://ja.wordpress.org/plugins/apcu/

APCuパネルを見れば、キャッシュが始まっているのが確認できます

 

効果の確認

アクセス集中による対策だったのでApache Benchで測定すると良いでしょう

php7.2-fpmの環境で-n100 -c10の比較で約6倍ぐらいの性能向上が見られました。すげー。

コメント

タイトルとURLをコピーしました