wordpressをec2/microでなるべくチューンしてホストする

2014-06-12

概要

wordpress運用するのに月5,000円は高い気がしてmicroでがんばってます。
以下の通り、microだとメモリ少ないのですが
10,000PV/dayを7秒以内に読み込み完了させる事が目標です。
7秒というのはNewRelicのApdexを参考にしてます。

Screen Shot 2014-06-11 at 17.33.02.png

インストールバージョンは次の通り。

Apache/2.4.9 (Amazon)
Mysql 5.5.37 ※ Mysql 5.6をmicroにインストールしようと努力したのですがinno_DBのbuffer_size不足で起動しませんでした。

以下やったこと。

wordpressにquick cacheを導入

王道そうなのでさくっと入れました。
とりあえずページキャッシュを導入。

http://ex-cloud.jp/techblog/?p=442

apacheのpreforkのプロセス数を制御

apacheの平均消費メモリは、、

$ ps aux | grep [h]ttpd | grep [a]pache | awk 'BEGIN{x=0}{x+=$6}END{ print x/NR }'
26594

26Mだったので630Mの物理メモリと照らし合わせて計算。

<IfModule mpm_prefork_module>
StartServers          1
MinSpareServers       2
MaxSpareServers       4
ServerLimit           10
MaxClients            10
MaxRequestsPerChild   100
</IfModule>

ざっとこれくらいにしてます。

mysqlのクエリキャッシュ有効化

デフォルトでは無効なのでもちろん有効化します。

thread_cache=450
table_cache=450
query_cache_limit=1M
query_cache_min_res_unit=4k
query_cache_size=16M
query_cache_type=1

ここもクエリキャッシュを大き過ぎるとコネクションできなくのでこの辺に設定してます。

apacheとリバプロを導入

こちらも王道で効果抜群。

nginxの下にapacheをプロキシで動かして、プロキシキャッシュをかましてあげます。
自動でキャッシュが削除されないらしいので30日を期限にしてます。

apacheを8080で動かして

httpd.conf
Listen 127.0.0.1:8080

nginxでルーティング&cache

nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events { worker_connections 4096; }

http { include /etc/nginx/mime.types; default_type appplicaion/octet-stream;

proxycachepath /var/cache/nginx levels=1:2 keyszone=czone:4m maxsize=50m inactive=120m; proxytemppath /var/tmp/nginx; proxysetheader Host $host; proxysetheader X-Real-IP $remoteaddr; proxysetheader X-Forwarded-Host $host; proxysetheader X-Forwarded-Server $host; proxysetheader X-Forwarded-For $proxyaddxforwarded_for;

# Apache server { listen 80; server_name hogehoge.com;

<span class="c1">#/wp-admin 以下はcacheしない</span>
<span class="kn">location</span> <span class="n">/wp-admin</span> <span class="p">{</span>
    <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:8080</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1"># .php ファイルもcacheしない</span>
<span class="kn">location</span> <span class="p">~</span> <span class="sr">.*\.php</span> <span class="p">{</span>
    <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:8080</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1"># apache</span>
<span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
    <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:8080</span><span class="p">;</span>
<span class="p">}</span>

<span class="kn">location</span> <span class="p">~</span> <span class="sr">.*\.(txt|xml|html?|js|css|gz|ico|jpe?g|gif|png|wmv|flv|swf|mpg)</span> <span class="p">{</span>
    <span class="kn">access_log</span>  <span class="no">off</span><span class="p">;</span>
    <span class="kn">expires</span> <span class="s">30d</span><span class="p">;</span>
    <span class="kn">break</span><span class="p">;</span>
<span class="p">}</span>
    <span class="kn">proxy_cache_key</span> <span class="nv">$scheme$proxy_host$uri$is_args$args</span><span class="p">;</span>


 <span class="c1"># .ht(xxx) ファイルはアクセス禁止</span>
    <span class="kn">location</span> <span class="p">~</span> <span class="sr">/\.ht</span> <span class="p">{</span>
        <span class="kn">deny</span>  <span class="s">all</span><span class="p">;</span>
    <span class="p">}</span>

<span class="p">}</span>

}

いまとこGoogleAnalyticsで見る限り平均6秒台で完了できています。

参考サイト;
http://bren.jp/blog/%E3%81%95%E3%81%8F%E3%82%89vps%EF%BC%9Anginx-apache-%E6%A7%8B%E6%88%90%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95/ http://ex-cloud.jp/techblog/?p=442

#WordPress  #MySQL  #nginx  #Apache  #EC2