さくらのVPS 1Gに合わせてWordPressと戦った記録

環境:さくらのVPS 1Gプラン Debian squeeze + Apache 2.2.16 + PHP 5.3.3

紆余曲折ありながらも,気付いたらFlickrやらSNSパーツを抜いた処理は2秒程度で済んじゃうようなサクサクWordPress環境にはなったので,そこまでの備忘録.

自分用なんで,わかる人ならわかる,程度の書き方です.ただ,万一WordPressのデータが吹っ飛んだときの再セットアップに読めないここに備忘録残すのはどうなんだ?(笑)

 

最低限動かすまで.

  1. LAMP環境揃える
  2. ftpd系とかphpMyAdminもついでに.
  3. autitude install wordpressで入れると英語仕様として設定されてwp-config.phpもややこしくなる上,権限・所有者もめんどいので,ソースからやろう
  4. 適当にApache2でVirtualHostsで最上位がWordPressになるように仕向ける
  5. 場合によっては今のうちにドメインを鯖に向けておく
  6. 引き継ぐ場合はデータベース流し込む.utf8なので楽だけど,MySQLのデフォルトがlatinな奴なので修正
  7. データベースでかいとphpの限界で弾かれるので一時的にphp.iniのpost_max_sizeとupload_max_filesize引き上げ.
  8. 値戻すついでにphp.iniのmemory_limit = 32Mに引き下げ(そうするとSuhoshinがアラート吐き続けるので気になるならここ参考)
  9. プラグイン入れる(中身は後述)

プラグイン周り

通常機能系

キャッシュ系

  • DB Cache Reloaded Fix
  • Head Cleaner
  • WP Super Cache
  • WP Widget Cache

 

キャッシュ系設定メモ

  • WP Widget Cacheはウィジェット設定でキャッシュ時間指定してやって初めて稼働
  • Head Cleanerの設定は適当でおk.全部jsをフッターに回しても今のところ問題なさそう.ただ,はてなスターが動かなくなるのでこちら頼みで回避策.末尾に実コード掲載.
  • WP SuperCacheはreadme.txt通りに.ひとまずプリロードの感覚は1440分で様子見.

 

テーマのファイルへ埋め込み分

はてなスター呼び出しをfunction.phpへ追加
function my_hatena_star_code()
{ ?>
<script type=“text/javascript” src=“http://s.hatena.ne.jp/js/HatenaStar.js”></script>
<script type=“text/javascript”>
Hatena.Star.EntryLoader.headerTagAndClassName = [‘h1’,‘entry-title’];
Hatena.Star.Token = ‘はてなスタートークン’;
</script>
<?php }
add_action(‘wp_head’, ‘my_hatena_star_code’);

header.phpの適当なところへ以下を挿入

<?php my_hatena_star_code(); ?>

 

WP Social Bookmapking Lightの実装がアレだったので,ソーシャルボタン自前埋め込み.これ参考にちまちま弄った.

以下をfunction.phpへ追加.

function SocialButton()
{ ?>
    <ul>
        <li class=“tweetButton”><a href=“https://twitter.com/share” class=“twitter-share-button” data-count=“horizontal” data-url=“<?php the_permalink(); ?>” data-text=“<?php the_title(); ?>” data-via=“” data-lang=“ja" >ツイート</a></li>
        <li class="likeButton”><div class=“fb-like” data-href=“<?php the_permalink(); ?>” data-send=“false” data-layout=“button_count” data-width=“72” data-show-faces=“false”></div></li>
        <li class=“hatebuButton”><a href=“http://b.hatena.ne.jp/entry/<?php the_permalink(); ?>” class=“hatena-bookmark-button” data-hatena-bookmark-title=“<?php the_title(); ?>” data-hatena-bookmark-layout=“standard” title=“このエントリーをはてなブックマークに追加”><img src=“http://b.st-hatena.com/images/entry-button/button-only.gif” alt=“このエントリーをはてなブックマークに追加” width=“20” height=“20” style=“border: none;” /></a></li>
    </ul>
<?php }

次にfooter.phpへ以下を追加.

<!– Twitter –>
<script type=“text/javascript” src=“http://platform.twitter.com/widgets.js”></script>
<!– Facebook –>
<div id=“fb-root”></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = “//connect.facebook.net/ja_JP/all.js#xfbml=1&appId=自分でとったAppID”;
  fjs.parentNode.insertBefore(js, fjs);
}(document, ‘script’, ‘facebook-jssdk’));</script>
<!– はてなブックマーク –>
<script type=“text/javascript” src=“http://b.st-hatena.com/js/bookmark_button.js” charset=“utf-8” async=“async”></script>

呼び出し位置はHTML構造見ながら適当に.
基本的にcontent.phpおよびcontent-single.phpが記事部.
その中の<div class=“entry-content”>前後が今差し込んでいる周辺なので,お好きに.

<div class=“sbver”>
    <?php SocialButton(); ?>
</div>

これのCSSはstyle.css

div.sbver ul    {margin: 0;
        padding: 0;
    height: 10px
    }
 
div.sbver li.hatebuButton   {list-style-type: none;
        float: right;
        margin-right: 5px;
    width: 120x;
    height: 23px;
    vertical-align:text-bottom}
div.sbver li.tweetButton   {list-style-type: none;
        float: right;
        margin-right: 5px;;
    width: 100px;
    height: 23px;
    vertical-align: text-bottom }
div.sbver li.likeButton   {list-style-type: none;
        float: right;
        margin-right: 5px;
    width: 100px;
    height: 23px;
    vertical-align:text-bottom }

上下方向の配置のガタガタ直すためにvertical-align:text-bottom入れたけど,インライン要素だからか効いてない?

 

apc周り

aptitude install php-apc後,/etc/php5/conf.d/apc.iniを以下に.

extension = apc.so
apc.filters = wp-cache
apc.include_once_override = 0
apc.shm_size = 48

apcへの細かいメモリ割り当てサイズはapc.phpと相談しつつ.

基本的にWP SuperCacheと相性悪そう.これ信じてapc.ini書いたけどダメだった.そんなわけで次善回避策.こっちを参考に/wp-content/plugins/wp-super-cache/wp-cache-base.phpを修正.

 

apache2.conf

これ見つつ極力モジュール削る.
そして,topとps眺めて子プロセスの消費メモリ概算.

現状だと(RSS - SHR) * MaxClients <= OSメモリ容量で,RSSSHRで20MB前後だと思われるので,Max Clientsは40にしてみた.

以下,apache2.confで適宜変更.

KeepAlive Off

<IfModule mpm_prefork_module>
    StartServers          10
    MinSpareServers       10
    MaxSpareServers      15
    MaxClients          40
    ServerLimit        256
    MaxRequestsPerChild   500
    MaxMemFree 2048
</IfModule>

 

絶対何か抜けてる自信がある(笑)