ローカルなWordPressを高速化する

投稿者: | 2018年3月1日

先日、NanoPi NEO(512MB版)にLAMPを導入したので、外出先(ノマド)で使っています。

WordPressを使っていて気がついたのが、異様な遅さ。
原因はCPUではなくディスクI/Oなので如何ともしがたいのが辛い。
しかも小さいながらもスワップしているし...。
NanoPi NEO にはUSBポートがあるので、USBメモリにスワップを退避させることも考えたもの、それだと本体がコンパクトであるメリットが無い。
追加出費もしたくないので、メディアを”UHS-I U3″にするつもりもありません。

ということで、ひとまず Apache の設定を見直すことにしました。

前提

設定変更詳細

対象バージョンは、Apache 2.4.18 です。

$ apache2 -v
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2017-09-18T15:09:02

対象ファイル

設定を変更するファイルは以下の2つです。
今回は設定を変更した後で、diff(差分)でご説明したいと思います。

$ sudo vi /etc/apache2/apache2.conf
$ sudo vi /etc/apache2/mods-enabled/mpm_prefork.conf 

ファイル編集

変更前にファイルはバックアップを

変更前に必ずファイルはバックアップするようにしてください。
不慮の事態になった際、だいぶ精神的な負担が和らぎます。

変更内容

対象ファイル〜その1〜

/etc/apache2/apache2.conf

対象項目
  • Timeout
    リクエスト/レスポンスの送受信やCGI(PHP等)のタイムアウトとして使われます
  • MaxKeepAliveRequests
    1つの接続で何回のリクエストに応えるのかを指定します。
    指定した数値までリクエストを受け付け、超えた分は別のTCP接続が確立されます。
    数値を大きくすると一度に処理できるリクエスト数が増える反面、他の接続が割り込むタイミングが遅れる影響が出ます。
変更内容
項目 変更前 変更後
Timeout 300 10
MaxKeepAliveRequests 100 10
$ diff -u /etc/apache2/apache2.conf_org /etc/apache2/apache2.conf
--- /etc/apache2/apache2.conf_org
+++ /etc/apache2/apache2.conf
@@ -83,7 +83,7 @@
 #
 # Timeout: The number of seconds before receives and sends time out.
 #
-Timeout 300
+Timeout 10

 #
 # KeepAlive: Whether or not to allow persistent connections (more than
@@ -96,7 +96,7 @@
 # during a persistent connection. Set to 0 to allow an unlimited amount.
 # We recommend you leave this number high, for maximum performance.
 #
-MaxKeepAliveRequests 100
+MaxKeepAliveRequests 10

 #
 # KeepAliveTimeout: Number of seconds to wait for the next request from the

対象ファイル〜その2〜

/etc/apache2/mods-enabled/mpm_prefork.conf

対象項目(Apache MPM prefork
  • ServerLimit
    子プロセス数の設定可能な上限を設定します。
    下記”MaxRequestWorkers”以上の値である必要があります。
  • MinSpareServers
    必要なアイドル状態(要求を処理しないプロセス)の子サーバプロセスの最小数を設定します。
  • MaxSpareServers
    設定以上のアイドル(要求を処理しないプロセス)がある場合、親プロセスは余分なプロセスを強制終了します。
  • MaxRequestWorkers
    同時に処理できるリクエストの上限数です。
  • MaxConnectionsPerChild
    1つの子プロセスが処理する最大のTCP接続数を指定します。
    指定した数のTCP接続を処理すると対象の子プロセスは終了します。
    なお、初期値 0 は無制限を表します。
  • MaxMemFree
    free() が呼ばれない限り、 主メモリアロケータが保持し続けられるメモリの最大量です。
変更内容
項目 変更前 変更後 旧名称(<= Apache 2.2)
ServerLimit 15 (変更なし)
MinSpareServers 5 15 (変更なし)
MaxSpareServers 10 30 (変更なし)
MaxRequestWorkers 150 10 MaxClients
MaxConnectionsPerChild 0 20 MaxRequestsPerChild
MaxMemFree 99 (変更なし)

※MaxConnectionsPerChild の初期値 0 は無制限を表します
※MaxMemFree の初期設定無しは無制限を表します

$ diff -u /etc/apache2/mods-enabled/mpm_prefork.conf_org /etc/apache2/mods-enabled/mpm_prefork.conf
--- /etc/apache2/mods-enabled/mpm_prefork.conf_org
+++ /etc/apache2/mods-enabled/mpm_prefork.conf
@@ -6,11 +6,13 @@
 # MaxConnectionsPerChild: maximum number of requests a server process serves

 <IfModule mpm_prefork_module>
+   ServerLimit              55
    StartServers             5
-   MinSpareServers       5
-   MaxSpareServers      10
-   MaxRequestWorkers   150 
-   MaxConnectionsPerChild    0
+   MinSpareServers      15
+   MaxSpareServers      30
+   MaxRequestWorkers    33 
+   MaxConnectionsPerChild   99
+   MaxMemFree             4096
 </IfModule>

 # vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Apache再起動

Apacheを再起動して設定をリロードします。

$ sudo systemctl daemon-reload
$ sudo systemctl restart apache2

※”ServerLimit”等の設定は”graceful”では反映されません(一番確実なのは、stop + start)

おまけ

diff コマンド

テキストファイルの差分を確認できるコマンドです。
Armbian 5.35(Ubuntu 16.04.3 LTS)では、バージョン3.3が導入されています。

$ diff -v
diff (GNU diffutils) 3.3

なお、diffコマンドはオプション”-u”(Unified形式)で同じファイルの文脈の中で上から順に差分を調べることができます。