アンテナメニュー開閉
←前の記事 次の記事→

【サーバ高速化】高速で強力なWordPressサイトを構築する3

Nginx、MariaDBのチューニングなど。

【サーバ高速化】高速で強力なWordPressサイトを構築する3
各種チューニング方法の紹介。(Bam 小兔女)

Nginx、MariaDBのチューニング、OPcache、APCuの導入

前回の記事はWordPressが使用可能になるまでの設定を紹介しました。

ただ、初期設定では本来の性能が上手く引き出せないために、動作は高速とは言えません。

今回の記事では前回導入したNginxおよびMariaDBのチューニング、そしてキャッシュアプリケーションのOPcacheとAPCuの設定を行います。

(本文前に)簡単な3行まとめ

  • Nginx、MariaDBのチューニング解説。
  • 他にもOPcacheとAPCuの導入も説明。
  • 前回より長い記事なので、時間がある時に読むのがおすすめ。

記事目次

FastCGI Cacheの導入

FastCGI CacheはNginx特有のキャッシュシステムです。

基本的にWordPressはPHPを用いていますが、動的にページを生成する(アクセスごとに生成)ため、その生成にかかる時間がネックとなります。

ここでFastCGI Cacheが活躍します。

このキャッシュシステムを利用すると、一度生成された内容をNginxがそのまま閲覧者に返すため、デメリットとなる時間が大幅に短縮されます。

これにより、とても高速にページを表示することが可能です。

まず『nginx.conf』を編集します。

$ sudo vim /etc/nginx/nginx.conf
nginx.conf
http {


# FastCGI Cache Settings
	fastcgi_cache_path /var/cache/nginx/fastcgi-cache levels=1:2 keys_zone=wp_cache:1m inactive=1d max_size=1000m;
	fastcgi_cache_key "$mobilef$scheme$request_method$host$request_uri";
	fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
	fastcgi_cache_lock on;
	fastcgi_cache_lock_timeout 5s;
	fastcgi_cache_use_stale error timeout invalid_header updating http_500;
#/FastCGI Cache Settings


次に各項目を順に説明します。

なお、Nginxの全項目についてのドキュメントはNginx公式サイトに記載されています。

fastcgi_cache_path

fastcgi_cache_path』はFastCGI Cacheのキャッシュを保存する場所(path)を設定します。

levels』はサブディレクトリの文字数を表し、1つ目は一文字、2つ目は2文字を表しています。なお、最大3階層まで設定可能です(例-1:2:3)

keys_zone』はキャッシュのゾーン名(名前は自由設定、例は『wp_cache』)を設定し、更にゾーンに使用するメモリを設定します。例では1m(1MB)です。

inactive』はアクセスの無いファイルを自動削除する時間です。例では1d(1日)で削除されます。

max_size』はFastCGI Cacheで生成された全キャッシュの最大量の制限を表します。例では1000m(1GB)に達すると新たなキャッシュが生成されません。

fastcgi_cache_key

fastcgi_cache_keyはキャッシュのキー情報を表します。

Nginxはこのキー情報を用いて閲覧者へファイルを手渡します。

なお、今回の例ではPC版およびモバイル版それぞれにキャッシュが分かれるよう設定しています。

これにより、PCとモバイルでは違う情報を表示しているサイトでも問題無くキャッシュを使用出来ます。

fastcgi_ignore_headers

fastcgi_ignore_headersは特定のヘッダ情報を無視する設定です。

例では『Cache-Control Expires Set-Cookie』を設定しており、キャッシュの際にこれら情報は無視されます。

fastcgi_cache_lock

fastcgi_cache_lockはキャッシュが有効時に同一のリクエストが同時要求された場合に各リクエストをまとめて一つにする機能です。

on』にすることで有効化されます。

fastcgi_cache_lock_timeout

fastcgi_cache_lock_timeoutはfastcgi_cache_lockのタイムアウト時間を表します。タイムアウトした場合にはキャッシュせずにそのまま送信されます。

fastcgi_cache_use_stale

fastcgi_cache_use_staleは設定した状態になった場合に古いキャッシュを使う設定です。

例では『error timeout invalid_header updating http_500』を設定しています。

次に『example.conf』を編集します。

exampleは例で、ここには適宜設定した名前を入れます。

$ sudo vim /etc/nginx/conf.d/example.conf
example.conf
server {


# FASTCGI CACHE SETTINGS
	fastcgi_buffer_size 128k;
	fastcgi_buffers 4 256k;
	fastcgi_busy_buffers_size 256k;
	fastcgi_temp_file_write_size 256k;
	fastcgi_cache_bypass $skip_cache;
	fastcgi_no_cache $skip_cache;
	fastcgi_cache wp_cache;
	fastcgi_cache_valid 200 302 1d;
	fastcgi_cache_valid 301 1h;
	fastcgi_cache_valid any 5m;

	add_header X-Cache $upstream_cache_status;
	add_header Vary 'User-Agent';

	set $skip_cache 0;

	if ($request_method = "GET") {
	set $skip_cache 0;
	}

	if ($request_method = "POST") {
	set $skip_cache 1;
	}
	
	if ($request_method = "HEAD") {
	set $skip_cache 1;
	}

	if ($query_string != "") {
	set $skip_cache 0;
	}

	if ($request_uri ~* "(/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|
	/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|
	sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
	set $skip_cache 1;
	}

	if ($request_uri ~* "(/wp-admin/|wp-login.php|wp-config.php|comments.php)") {
	set $skip_cache 1;
	}

	if ($request_uri ~* "preview=true") {
	set $skip_cache 1;
	}

	if ($request_uri ~* "amp=1") {
	set $skip_cache 1;
	}

	if ($request ~* "/wp-includes/.*") {
	set $skip_cache 1;
	}

	set $mobilef '';
	if ($http_user_agent ~* '(iPhone|iPod|incognito|webmate|Android.*Mobile|Windows.*Phone|dream|CUPCAKE|
	blackberry9500|blackberry9530|blackberry9520|blackberry9550|blackberry 9800|webOS|s8000|
	bada|Googlebot-Mobile)') {
	set $mobilef 'mobile.';
	set $skip_cache 0;
	}

	if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
	set $skip_cache 1;
	}
#/ FASTCGI CACHE SETTINGS


次に各項目について簡単に解説します。

fastcgi_buffer_size

fastcgi_buffer_sizeは受信した内容を読み取る際に使用するバッファ(一時保存)サイズを意味します。

例では『128k』を設定しています。

fastcgi_buffers

fastcgi_buffersは応答を読み取る際に使用するバッファの数とそのサイズを設定します。

例では『4 256k』を設定しています。

fastcgi_busy_buffers_size

fastcgi_busy_buffers_sizeは応答がビジー(応答待ち)時の最大バッファサイズです。応答を読み込む時にも使用されます。

例では『256k』を設定しています。

fastcgi_temp_file_write_size

fastcgi_temp_file_write_sizeはバッファリング時の一時ファイル書き込み最大サイズです。

例では『256k』を設定しています。

fastcgi_cache_bypass

fastcgi_cache_bypassキャッシュを返信しない項目を設定します。

例では『$skip_cache』を設定しています。

fastcgi_no_cache

fastcgi_no_cacheキャッシュしない項目を設定します。

例では『$skip_cache』を設定しています。

fastcgi_cache

fastcgi_cacheはキャッシュのゾーン名を設定します。

fastcgi_cache_pathのkey_zoneと同じゾーン名を設定して下さい。

例では『wp_cache』を設定しています。

fastcgi_cache_valid

fastcgi_cache_validはステータスごとの最大キャッシュ時間を設定します。

例では『200』『302』の時に1d(1日)、『301』の時に1h(1時間)、それ以外は5m(5分)となっています。

add_header X-Cache

add_headerはngx_http_headers_moduleの一種で、設定したリクエストヘッダを付与します。

例では『X-Cache $upstream_cache_status』を記述しており、ページをリクエストヘッダを確認すると『X-Cache』という項目が増えています。

$upstream_cache_status』はキャッシュの状態を表しており、状態によってそれぞれ『MISS(キャッシュ無し)』『HIT(キャッシュ使用)』『BYPASS(キャッシュ未使用)』が表示されます。

ちなみに、X-Cacheにはそれ以外の名前を入れても構いません。

add_header Vary

Vary』はPCとモバイルで別々に表示を変えている場合に使用するパラメータです。

VaryにはUser-Agentを設定しており、ユーザーエージェント(利用者の使用プログラム)によって変化することを明示しています。

これを利用することでGoogleBotが巡回した時にコンテンツを分けていることを知らせることが出来ます。

なので、PCとモバイルで同一の内容を配信している場合には使用しなくてもOKです。

set $skip_cache

ここで$skip_cacheを一旦『0』を設定(有効化)します。

1』を設定することで無効化となります。

後は例外として各項目ごとに無効化していきます。

例では『POST』『HEAD』『WPログイン時』『記事プレビュー時』『記事コメント時』『特定のphp使用時』『AMP有効時』にキャッシュを無効化しています。

AMPは次回以降に紹介予定のAccelerated Mobile Pages(AMP)の事です。

set $mobilef

今回のキャッシュ設定ではPCとモバイルに分けてキャッシュファイルを保存しています。

モバイルでアクセス時に通常のパラメータに専用のパラメータを付与することで、同ページでも別のキャッシュが生成されます。

Gzipの導入

Gzipはファイルを圧縮してサイズを縮小するフォーマットの一つです。

サイズを縮小することにより負担が減り、結果として速度の向上に繋がります。

nginx.conf』を編集します。

$ sudo vim /etc/nginx/nginx.conf
nginx.conf


# Gzip Settings
	gzip  on;
	gzip_static always;
	gunzip on;
	gzip_min_length 1024;
	gzip_buffers 4 8k;
	gzip_http_version 1.0;
	gzip_comp_level 1;
	gzip_proxied any;
	gzip_types text/plain text/css application/javascript text/xml application/atom+xml application/xml+rss application/json text/json text/javascript+json;
	gzip_disable "MSIE [1-6]\.";
	gzip_disable "Mozilla/4";
	gzip_vary on;
#/Gzip setting


次に各項目を簡単に解説します。

gzip

gzipを有効化するかどうかを設定します。

有効にすることでNginxが圧縮可能なコンテンツをリクエストごとに圧縮してクライアントに提供します。

gzip_static

gzip_staticは既に圧縮済みのgzファイルが存在する場合にそのファイルをクライアントに提供します。

通常、Gzipはクライアントがgzに対応しているかどうかを確認してサーバが送信を行います。

例で使用している『always』では、クライアントの対応の有無関係無しに圧縮済みのgzファイルを送信します。

なお、後述の『gunzip』を併用するとより効果的となります。

gunzip

gunzipは圧縮されたファイルを展開する機能です。

前述した『gzip_static』と併用すると、クライアントが対応している場合にはそのまま使用し、対応していない場合には解凍してファイルを展開します。

gzip_min_length

gzip_min_lengthは圧縮対象となるファイルの最小サイズを設定します。

例では『1024』を設定しており、1024byte以上のファイルがGzip圧縮対象となります。

gzip_buffers

gzip_buffersはGzip圧縮で使用するバッファの数とサイズを設定します。

例では『4 8k』を設定しています。

gzip_http_version

gzip_http_versionはGzipを使う時のhttpバージョンを設定します。

例では『1.0』を設定しています。

gzip_comp_level

gzip_comp_levelはGzipの圧縮レベルを設定します。

レベルは0から9まで使用可能で、0は無圧縮、9に近づくほど高圧縮となりますが、レベル1でも他とそこまで大きな差はありません。

むしろ高レベルに近づくほど負荷が増えるため、逆に表示速度が遅くなるおそれもあります。

例では『1』を設定しています。

gzip_proxied

gzip_proxiedは要求に応じてGzipを無効化します。

例は『any』を設定しており、全てのリクエストに対してGzip圧縮を行います。

gzip_types

gzip_typesはGzip圧縮を行うファイルタイプをMIME Typeで設定します。

htmlは未記入でもデフォルトで含まれています。

gzip_disable

gzip_disableはGzip圧縮を無効化するユーザーエージェントを設定します。

例では『MSIE 1-6』および『Mozilla4』を設定しています。

gzip_vary

gzip_varyはレスポンスヘッダにVaryを付与するかどうかを設定します。

例では『on』を設定しています。

Expiresの設定

Expires(有効期限)の設定を行います。

各ファイルのExpiresを設定することでクライアントにキャッシュを保持させることが出来ます。

これにより、サーバへの負荷が減ることになります。

次に『example.conf』を編集します。

exampleは例で、ここには適宜設定した名前を入れます。

$ sudo vim /etc/nginx/conf.d/example.conf
example.conf


# Expires
	location ~ .*\.(jpg|jpeg|gif|png|swf|woff|ico) {
		access_log off;
		expires 30d;
	}

	location ~ .*\.(css|js) {
		access_log off;
		expires 7d;
	}

	location ~ .*\.(html|htm) {
		access_log off;
		expires 10m;
	}
#/ Expires


例としてそれぞれグループA~Cに分けています。

共通点はアクセスログのオフです。

グループA

グループAは『jpg(jpeg)』『gif』『png』『swf』『woff』『ico』です。

基本的にこれらファイルは変化することがないため、有効期限は30日に設定しています。

 

グループB

グループBは『css』および『js(javascript)』です。

有効期限は7日にしていますが、cssに関しては編集する場合が多いと思われるため、場合によっては1dなど短い期間でも構いません。

グループC

グループCは『html』『htm』です。

有効期限は10日を設定しています。

Open file cacheの設定

Open file cacheはメタデータ等の情報をキャッシュ出来る機能です。

nginx.conf』を編集します。

$ sudo vim /etc/nginx/nginx.conf
nginx.conf


# Open file cache
	open_file_cache max=100000 inactive=20s;
	open_file_cache_valid 30s;
	open_file_cache_min_uses 2;
	open_file_cache_errors on;
#/ Open file cache


続いて簡単に解説します。

open_file_cache

open_file_cacheはキャッシュの最大数および自動削除の時間を設定します。

例は『max=100000』『inactive=20s(20秒)』です。

open_file_cache_valid

open_file_cache_validはOpen file cacheの有効時間を設定します。

例は『30s(30秒)』です。

open_file_cache_min_uses

open_file_cache_min_usesはOpen file cacheの非アクティブキャッシュの最小数を設定します。

例は『2』です。

open_file_cache_errors

open_file_cache_errorsはエラー時の情報もキャッシュするか否かを設定します。

例は『on』です。

nginx.conf設定例

nginx.confの設定例を記述します。

nginx.conf』を編集します。

$ sudo vim /etc/nginx/nginx.conf
nginx.conf

user  nginx;
worker_processes  4;
worker_rlimit_nofile 100000;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
	worker_connections 2048;
	multi_accept on;
	use epoll;
	accept_mutex_delay 100ms;
}

http {
	include       /etc/nginx/mime.types;
	default_type  application/octet-stream;
	charset UTF-8;
	limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
			'$status $body_bytes_sent "$http_referer" '
			'"$http_user_agent" "$http_x_forwarded_for"';

	server_tokens off;
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	types_hash_max_size 2048;
	access_log off;
	#access_log  /var/log/nginx/access.log  main;

	client_body_buffer_size    128k;
	client_max_body_size       10m;
	client_header_buffer_size    1k;
	large_client_header_buffers  4 4k;
	output_buffers   1 32k;
	postpone_output  1460;
	keepalive_timeout 10;
	client_header_timeout 10;
	client_body_timeout 10;
	reset_timedout_connection on;
	send_timeout 10;

	limit_conn_zone $binary_remote_addr zone=addr:5m;
	limit_conn addr 100;

# FastCGI Cashe Settings
	fastcgi_cache_path /var/cache/nginx/fastcgi-cache levels=1:2 keys_zone=wp_cache:1m inactive=1d max_size=1000m;
	fastcgi_cache_key "$mobilef$scheme$request_method$host$request_uri";
	fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
	fastcgi_cache_lock on;
	fastcgi_cache_lock_timeout 5s;
	fastcgi_cache_use_stale error timeout invalid_header updating http_500;
#/FastCGI Cache Settings

# GZIP Settings
	gzip  on;
	gzip_static always;
	gunzip on;
	gzip_min_length 1024;
	gzip_buffers 4 8k;
	gzip_http_version 1.0;
	gzip_comp_level 1;
	gzip_proxied any;
	gzip_types text/plain text/css application/javascript text/xml application/atom+xml application/xml+rss application/json text/json text/javascript+json;
	gzip_disable "MSIE [1-6]\.";
	gzip_disable "Mozilla/4";
	gzip_vary on;
#/GZIP setting

# Open file cache
	open_file_cache max=100000 inactive=20s;
	open_file_cache_valid 30s;
	open_file_cache_min_uses 2;
	open_file_cache_errors on;
#/ Open file cache

	include /etc/nginx/conf.d/*.conf;
}


次に簡単な解説を行います(既に解説済みの箇所は除く)。

user

userはNginxを動作させるユーザーを設定します。

例では『nginx』を設定しています。

worker_processes

worker_processesはNginxを動作させるプロセスの数を設定します。

基本的にはCPUの数を設定します。

例では『4』を設定しています。

worker_rlimit_nofile

worker_rlimit_nofileはワーカープロセスのオープンファイルの上限を設定します。

例では『100000』を設定しています。

error_log

error_logはNginx本体のエラーを記録するファイルのパスを設定します。

例では『/var/log/nginx/error.log warn』を設定しています。

pid

pidはメインプロセスのIDを保存するファイルを設定します。

例では『/var/run/nginx.pid』を設定しています。

worker_connections

worker_connectionsは最大接続数を設定します。

例では『2048』を設定しています。

ただし、『ulimit』で設定しないと設定が反映されない場合もあります。

$ sudo ulimit -n 2048

multi_accept

multi_acceptは多数のリクエストを受け入れるかどうかを設定します。

例では『on』を設定しています。

use

useはNginxが使用する接続方法を設定します。

例では『epoll』ですが、デフォルト設定なので明示しなくても大丈夫です。

accept_mutex_delay

accept_mutex_delayはaccept時にmutexを確保が出来なかった場合の待機時間を設定します。

例では『100ms』を設定しています。

include

includeは別の設定ファイルを読み込みます。

default_type

default_typeはデフォルトのMIMEタイプを設定します。

例では『application/octet-stream』を設定しています。

charset

charsetはNginxが使用するデフォルトの文字コードを設定します。

例では『UTF-8』を設定しています。

limit_req_zone

limit_req_zoneは設定したアクセス数に対して制限を行います。

例では『$binary_remote_addr zone=one:10m rate=1r/s』となっています。

これはゾーン『one』の維持に10MBを消費し、1秒間に同一IPから1回以上アクセスがあった場合に制限を実行(接続遅延)します。

また、併用策として『example.conf』のlocation内に『limit_req zone=one burst=10』を追記しています。

$ sudo vim /etc/nginx/conf.d/example.conf
example.conf
	location / {
		limit_req zone=one burst=10;
		index index.php index.html index.htm; 
		try_files $uri $uri/ /index.php?$uri&$args;
	}

こちらでは制限ゾーンに入ったIPが更に10回連続でアクセスを行った場合、503エラーが出力されます。

この設定を行うことにより、DoS攻撃に対し簡単に対策が出来ます(完全な対策ではないので注意)。

log_format

log_formatはログファイルの形式を設定します。

server_tokens

server_tokensはレスポンスヘッダに記載されるサーババージョンの出力有無を設定します。

例では『off』を設定しています。

sendfile

sendfileはsendfileAPIを使用するかどうかを設定します。

sendfileを使用することで効率良くファイルを送受信出来ます。

例では『on』を設定しています。

tcp_nopush

tcp_nopushはsendfileが有効時にTCP_CORKソケットオプションを使用するかどうかを設定します。

そのため、sendfileが有効でないと有効化出来ません。

なお、有効化するとレスポンスヘッダとファイルをまとめて送信するため、効率が良くなります。

例では『on』を設定しています。

tcp_nodelay

tcp_nodelayはTCP_NODELAYオプションを有効化することにより遅延無くファイルを送信します。

tcp_nopushとは逆のような設定ですが、両立することが可能です。

例では『on』にしています。

types_hash_max_size

types_hash_max_sizeはハッシュテーブルの最大サイズを設定します。

例では『2048』を設定しています。

access_log

access_logはNginxのアクセスログのパスを設定します。

off』にすることで若干パフォーマンスが向上します。

例では『off』していますが、基本的にはパス指定することをおすすめします。

client_body_buffer_size

client_body_buffer_sizeはクライアントのリクエストサイズを設定します。

例では『128k』を設定しています。

client_max_body_size

client_max_body_sizeはクライアントが要求するリクエストサイズの最大サイズを設定します。

例では『10m』を設定しています。

client_header_buffer_size

client_header_buffer_sizeはクライアントのリクエストヘッダを読み取る際に使用するバッファサイズを設定します。

例では『1k』を設定しています。

large_client_header_buffers

large_client_header_buffersは大きなリクエストヘッダを読み取る際のバッファサイズと数を設定します。

例では『4 4k』を設定しています。

output_buffers

output_buffersはディスクから応答を読み取る際に使用されるバッファサイズと数を設定します。

例は『1 32k』を設定しています。

postpone_output

postpone_outputは指定したサイズになるまで送信を遅延します。

例では『1460』を設定しています。

keepalive_timeout

keepalive_timeoutはkeepalive状態のタイムアウト時間を設定します。

例では『10』を設定しています。

client_header_timeout

client_header_timeoutはリクエストヘッダを読み取る際のタイムアウト時間を設定します。

例では『10』を設定しています。

client_body_timeout

client_body_timeoutはリクエスト本体の読み取る際のタイムアウト時間を設定します。

例では『10』を設定しています。

reset_timedout_connection

reset_timedout_connectionはタイムアウトした接続は即座にリセットされ、関連するメモリも全て開放される設定です。

例では『on』を設定しています。

send_timeout

send_timeoutはクライアントへの送信に対してのタイムアウト時間を設定します。

例では『10』を設定しています。

limit_conn_zone

limit_conn_zoneは接続に対してのゾーンを設定します。

例では『$binary_remote_addr zone=addr:5m』を設定しています。

limit_conn

limit_connは最大接続数を設定します。

設定では『100』を設定しています(最大接続数100)が、状況に応じて変更して下さい。

設定しない場合は接続数が無制限となります(リソースが許す限り接続する)。

設定完了後はNginxを再起動します。

$ sudo service nginx restart

MariaDBのチューニング

MariaDBのパフォーマンスを向上するための設定を行います。

MySQLと互換性があるため、ほとんどは既存の設定方法と同じです。

『my.cnf』を編集します。変更箇所のみ記載しています。

なお、#defはデフォルトの設定で、deleteは項目の削除です。

また、各項目の詳細はhttps://mariadb.com/kb/en/mariadb/にて掲載されています。

$ sudo vim /etc/mysql/my.cnf
my.cnf
[mysqld]
#
# * Basic Settings
#

plugin-load = handlersocket.so #def delete

#
# * Fine Tuning
#
max_connections         = 500 #def 100

thread_cache_size       = 200 #def 128
sort_buffer_size        = 16M #def 4M
bulk_insert_buffer_size = 32M #def 16M


#
# * MyISAM
#
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched. On error, make copy and try a repair.

key_buffer_size         = 256M #def 128M

table_open_cache        = 1024 #def 400


#
# * Query Cache Configuration
#
# Cache only tiny result sets, so we can fit more in the query cache.
query_cache_limit               = 256M #def 128K
query_cache_size                = 512M #def 64M

#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!

innodb_log_file_size    = 512M #def 50M
innodb_buffer_pool_size = 2000M #def 256M
innodb_log_buffer_size  = 16M #def 8M

innodb_io_capacity      = 2000 #def 200
innodb_io_capacity_max  = 2000 #def delete

skip_innodb_doublewrite #def delete
innodb_flush_neighbors = 0 #def delete
innodb_file_per_table #def delete


# Optional setting
wsrep_slave_threads=8 #def 1
innodb_flush_log_at_trx_commit=2 #def 0

次に簡単な解説を行います。

plugin-load

プラグインを導入します。

例では『handlersocket.so』を設定しています。

handlersocket.soは非SQLのMariaDBプラグインで、CPUやディスクの使用率を下げるなど、性能を向上させる効果があります。

max_connections

max_connectionsはMariaDBが受け付けるクライアントの最大接続数を設定します。

例では『500』を設定しています。

thread_cache_size

thread_cache_sizeは再利用されるスレッドの数を設定します。

例では『200』を設定しています。

sort_buffer_size

sort_buffer_sizeはソートを実行する各セッションに対して設定した数値を割り当てます。

例では『16M』を設定しています。

bulk_insert_buffer_size

bulk_insert_buffer_sizeは挿入の際に使用される各スレッドのキャッシュツリーのサイズを設定します。

例では『32M』を設定しています。

key_buffer_size

key_buffer_sizeはキーをキャッシュする際に使用されるバッファのサイズを設定します。

例では『256M』を設定しています。

table_open_cache

table_open_cacheは全てのスレッドでオープンするテーブルの数を設定します。

例では『1024』を設定しています。

query_cache_limit

query_cache_limitは設定したサイズを超えたものはキャッシュを行わないという設定です。

例では『256M』を設定しています。

query_cache_size

query_cache_sizeはクエリキャッシュに使用する最大値を設定します。

例では『512M』を設定しています。

innodb_log_file_size

innodb_log_file_sizeはInnoDBの更新ログのサイズを設定します。

例では『512M』を使用しています。

innodb_buffer_pool_size

innodb_buffer_pool_sizeはInnoDBのバッファプールサイズを設定します。

グローバルバッファなので基本的にはメモリの50%~80%程を割り当てるとパフォーマンスがアップします。

WEBを分離してDBサーバのみを構築しているのであれば、80%を割り当てても問題無いでしょう。

例では『2000M』を設定しています。

innodb_log_buffer_size

innodb_log_buffer_sizeはInnoDBの更新ログに使用するバッファサイズを設定します。

例では『16M』を設定しています。

innodb_io_capacity

innodb_io_capacityはInnoDBのバッククラウンド作業時に使用するI/Oサイズを設定します。

例では『2000』を設定しています。

innodb_io_capacity_max

innodb_io_capacity_maxはinnodb_io_capacityの最大サイズを設定します。

例では『2000』を設定しています。

skip_innodb_doublewrite

skip_innodb_doublewriteはデータファイルの二重書き込み(耐障害性のため)の有無について設定します。

例では『skip_innodb_doublewrite』を設定していますが、メリット以外にリスクも増えるので必要でない方はコメントアウトか削除して下さい。

innodb_flush_neighbors

innodb_flush_neighborsはバッファプールをクリア後、同グループのダーティ・ページ(ログ等には存在するがテーブルに存在しないデータ)もクリアするかを設定します。

例では『0(無効)』を設定しています。

innodb_file_per_table

innodb_file_per_tableはテーブルごとにテーブルスペースを作成する設定です。

例では『innodb_file_per_table』を設定しています。

wsrep_slave_threads

wsrep_slave_threadsは使用するスレッドの数を設定します。

例では『8』を設定しています。

innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commitはログバッファの書き込み制御の設定を行います。

例では『2(1秒に1回ログファイルに書き込み)』を設定しています。

設定後はMariaDBを再起動します。

$ sudo service mysql restart

OPcacheの導入

OPcache(オペコード・キャッシュ – Zend OPcache)はPHPが動作する際のコードを一部キャッシュすることによりパフォーマンスを向上させるアプリケーションの一つです。

PHP7のインストール時にパッケージも導入されているため、編集ファイルを弄るだけで簡単に使用出来ます。

php.iniを編集します。

設定は例です。

$ sudo vim /etc/php/7.0/fpm/php.ini
php.ini

[OPcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=12
opcache.max_accelerated_files=16000
opcache.revalidate_freq=2
opcache.save_comments=0
opcache.fast_shutdown=1
opcache.enable_file_override=1

次に簡単な解説を行います。

なお、OPcacheについての詳細はhttps://secure.php.net/manual/ja/opcache.configuration.phpに記載されています。

opcache.enable

opcache.enableはOPcache有効化の有無を設定します。

0』で無効、『1』で有効です。

例では『1』を設定しています。

opcache.enable_cli

opcache.enable_cliはPHPのCLI版に対してOPcacheを有効化するか否かを設定します。

例では『1』を設定しています。

opcache.memory_consumption

opcache.memory_consumptionはOPcacheが使用するメモリのサイズを設定します。

例では『256』を設定しています。

opcache.interned_strings_buffer

opcache.interned_strings_bufferはインターン された文字列を格納するために使用されるメモリのサイズを設定します。

例では『12』を設定しています。

opcache.max_accelerated_files

opcache.max_accelerated_filesはOPcacheのハッシュテーブルキーの最大数を設定します。

例では『16000』を設定しています。

opcache.revalidate_freq

opcache.revalidate_freqはスクリプトのタイムスタンプをチェックする頻度を設定します。

0』を設定するとリクエストごとに更新をチェックします。

数値が高ければ更新頻度が減るため、パフォーマンスアップに繋がりますが、その分PHPファイル編集後の反映が遅れます。

もしPHPファイルの編集を行わない場合は『60』程度でOKです。

例では『2』を設定しています。

opcache.save_comments

opcache.save_commentsはOPcacheに含まれる全てのコメントアウト等を破棄するか否かを設定します。

もし、何らかの依存がある場合は有効化(1)して下さい。

例では『0』を設定しています。

opcache.fast_shutdown

opcache.fast_shutdownはそれぞれに割り当てられたブロックを解放しない、高速シャットダウン・シーケンスの利用有無を設定します。

例では『1』を設定しています。

opcache.enable_file_override

opcache.enable_file_overrideはfile_exists()、 is_file() および is_readable() が呼ばれた際にキャッシュチェックを行うか否かを設定します。

例では『1』を設定しています。

設定後はPHPを再起動します。

$ sudo service php7.0-fpm restart

再起動後の初回起動時はキャッシュを行うために若干動作がもたつきますが、次回以降はキャッシュ効果によって高速化されています。

ブラウザでキャッシュ動作を確認する

OPcacheが動作しているかをブラウザで確認するにはhttps://gist.github.com/ck-on/4959032を使うと、とても簡単にチェックすることが可能です。

導入にはocp.phpをドメイン以下に設置し、ブラウザでパスを指定するだけで使用出来ます。

ただし誰でも見ることが出来てしまうため、IPによる制限かパスワードを設定、あるいは使用しない時にはファイルを削除するなどの対策を推奨します。

APCuの導入

APCuはOPcacheと同じくPHPに働きかけるキャッシュアプリケーションの一つです。

OPcacheが実行コードをキャッシュするのに対し、APCuはユーザーキャッシュ(アプリ指定のキャッシュ)をキャッシュすることによりパフォーマンスを向上させます。

APCuの前バージョンとしてAPCが存在していましたが、セキュリティ上の問題により現在はAPCは廃止され、APCuが後継バージョンとなっています。

APCuはOPcacheと違いPHP7のインストール直後ではパッケージが同梱されていないため、新しくインストールを行います。

まず『update』で更新をチェックします。

$ sudo apt-get update

次に下位互換を持たせるためにAPCu Backwards Compatiblity Module(APCu-bc)をインストールします。

$ sudo apt-get install -y php-apcu-bc

APCuのインストール前にpearをインストールします。

$ sudo apt-get install -y php-pear

pecl』を使って更新をチェックします。

$ sudo pecl channel-update pecl.php.net

APCuをインストールします。

インストール途中に選択肢が表示されます。

Enable full APC compatibility はyesです。

Enable internal debugging in APCu はnoです。

$ sudo pecl install APCu

php.ini』を編集します。

$ sudo vim /etc/php/7.0/fpm/php.ini
php.ini
;OPcacheの近くに記述しておくと分かりやすい。
[apcu]
extension=apcu.so
apc.enabled=1
apc.enable_cli=1
apc.shm_size=128M
apc.ttl=3600
apc.gc_ttl=3600
apc.mmap_file_mask=/tmp/apc.XXXXXX

次に簡単な解説を行います。

各項目についてはhttps://secure.php.net/manual/ja/apcu.configuration.phpに記載されています。

extension

extensionは追加する拡張ファイルを記述します。

例では『apcu.so』を記述しています。

apc.enabled

apc.enabledはAPCuの有効化の有無を設定します。

例では『1(有効)』を設定しています。

apc.enable_cli

apc.enable_cliはPHPのCLI版に対してAPCuを有効化するか否かを設定します。

例では『1』を設定しています。

apc.shm_size

apc.shm_sizeは共有メモリのセグメントサイズを設定します。

例では『128M』を設定しています。

apc.ttl

apc.ttlはキャッシュされているエントリが、他のエントリに割り当てられるまでスロットに残っていることの可能な秒数を設定します。

例では『3600』を設定しています。

apc.gc_ttl

apc.gc_ttlはキャッシュエントリがガベージコレクションのリストに残り続ける秒数を設定します。

例では『3600』を設定しています。

apc.mmap_file_mask

apc.mmap_file_maskはmktemp 形式のファイルマスクを設定します。

例では『/tmp/apc.XXXXXX』を設定しています。

設定後はPHPを再起動します。

$ sudo service php7.0-fpm restart

ブラウザでキャッシュ動作を確認する

APCuが動作しているかをブラウザで確認するにはhttps://github.com/krakjoe/apcuを使うと、とても簡単にチェックすることが可能です。

導入にはapc.phpをドメイン以下に設置し、ブラウザでパスを指定するだけで使用出来ます。

ただし誰でも見ることが出来てしまうため、IPによる制限かパスワードを設定、あるいは使用しない時にはファイルを削除するなどの対策を推奨します。

次回は導入推奨プラグインの紹介、functions.php等の設定

今回は前回以上に長い内容となっているため、読むだけでも少々時間がかかってしまうかもしれません。

解説などの長くなりそうな要素はなるべく簡素にしているので、詳細を確認したい場合は検索などで適宜チェックをして下さい。

次回の記事は『導入推奨のプラグイン』の紹介、そして『functions.php』などの設定を予定しています。

シリーズ目次

記事内でのサンプルは『さくらVPS4G・Ubuntu14.04・Nginx・PHP7・MariaDB・Wordpress・+α』となっています。

記事の執筆時、参考となった情報はここのtxtで公開しています。

暗号通貨アドレス

寄付されたコインはサイト運営やコミュニティの発展のために使用されます。

Bitcoin:1NEh5GY6GyY3NZ3bY4ZUtu1CWhRcGhErwc

NEM:NDBEQJ-7XIF6P-46AST5-2JQVLP-JIJS43-VOY5L7-LWA5

アンテナサービス運営中

当サイトでは現在アンテナサービス(プリズムアンテナ)を運営しています。

様々なジャンルのサイト(200以上)を取り扱っているので、よろしければ暇つぶしにどうぞご利用下さい。

アンテナのジャンルについては『アンテナについて』をご覧下さい。