<?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>さくらたんどっとびーず</title>
	<atom:link href="http://sakuratan.biz/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>Twit Delayのドメインが期限切れになっておりましたが復旧しております</title>
		<link>http://sakuratan.biz/archives/5282</link>
		<comments>http://sakuratan.biz/archives/5282#comments</comments>
		<pubDate>Sat, 19 Sep 2015 11:51:27 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=5282</guid>
		<description><![CDATA[またドメインの更新を忘れておりまして、Twit Delayが2日ほど利用できない状態になっておりました。（前忘れていたのはsakuratan.bizですが） 本日の夕方ごろ更新しまして、先ほどアクセスできるようになったのを確認しております。 持ってるドメインの期限が切れる日を全部Google Calendarに入れましたので、次からは大丈夫だと思います。どうもすみませんでした。 ご連絡頂いた皆様、... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/5282">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>またドメインの更新を忘れておりまして、Twit Delayが2日ほど利用できない状態になっておりました。（前忘れていたのはsakuratan.bizですが）<br />
本日の夕方ごろ更新しまして、先ほどアクセスできるようになったのを確認しております。<br />
持ってるドメインの期限が切れる日を全部Google Calendarに入れましたので、次からは大丈夫だと思います。どうもすみませんでした。<br />
ご連絡頂いた皆様、誠にありがとうございます。またすぐに対応できず申し訳ありませんでした。</p>
<p>追記<br />
9/20 1:24現在、DNSサーバによってはまだ更新されていないようです。<br />
Softbankの4Gネットワークだともう直ってるのですが、家のWiFiではNGでした。<br />
明日には直ってると思います。どうもすみません。</p>
<p>追記2<br />
9/20 13:18現在、DNSの更新を確認しております。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/5282/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Twit Delayの投稿遅延について</title>
		<link>http://sakuratan.biz/archives/5255</link>
		<comments>http://sakuratan.biz/archives/5255#comments</comments>
		<pubDate>Sat, 27 Apr 2013 14:19:22 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=5255</guid>
		<description><![CDATA[えーと、ブログではお久しぶりでございます。とりあえず生きてますw 先日からTwit Delayの投稿遅延が発生しているようで、Twitter経由で何件かお問い合わせを頂きました。まずはお詫び申し上げます。 原因ですが、140字以上のツイートを投稿した際にエラーが発生し、そのエラーを再投稿しようとしたものが溜まっていたためでした。Twit Delayを作ってからもうだいぶ経ちますのでだいぶうろ覚えな... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/5255">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>えーと、ブログではお久しぶりでございます。とりあえず生きてますw</p>
<p>先日からTwit Delayの投稿遅延が発生しているようで、Twitter経由で何件かお問い合わせを頂きました。まずはお詫び申し上げます。</p>
<p>原因ですが、140字以上のツイートを投稿した際にエラーが発生し、そのエラーを再投稿しようとしたものが溜まっていたためでした。Twit Delayを作ってからもうだいぶ経ちますのでだいぶうろ覚えなのですが、Twitter API 1.0のころは問題無かったように思いますので何か仕様が変わったような気もします（がうろ覚えなのでなんともw）。</p>
<p>対応としまして、とりあえずTwitterから140字以上で投稿失敗した旨のエラーが返ってきた際はリトライ日時を2099/12/31に変更するようにしています。メイン画面でリトライ日時が2099年になっているのがあれば文字数を減らして再投稿もしくは削除願います。</p>
<p>現在溜まっているツイートを投稿している最中ですので、すぐに全てのツイート予約の滞留が解消される訳ではないのですが、じきに正常に戻ると思います。</p>
<p>なお、GAEがPython2.7になるらしく、今年中にシステムを載せ変えないといけないみたいなのでまたTwit Delay関係のご連絡があると思います。</p>
<p>P.S.<br />
書くの忘れてました。<br />
凍結ユーザーの予約ツイートエラーも少し溜まっていたようですが、こちらは消すように変えてます。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/5255/feed</wfw:commentRss>
		<slash:comments>577</slash:comments>
		</item>
		<item>
		<title>PostfixとDovecotでさくらVPS上にバーチャルメールボックスが利用できるメールサーバを作る</title>
		<link>http://sakuratan.biz/archives/5182</link>
		<comments>http://sakuratan.biz/archives/5182#comments</comments>
		<pubDate>Sat, 24 Dec 2011 09:17:35 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[メールサーバ]]></category>
		<category><![CDATA[Dovecot]]></category>
		<category><![CDATA[Postfix]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=5182</guid>
		<description><![CDATA[Postfix と Dovecot でさくらVPS上にメールサーバを動かしてみましたので設定例を置いときます。 Postfix は SMTP サーバでメールを送る部分の担当、Dovecot は POP3/IMAP サーバでクライアントからメールを見る部分の担当です。完結したメールサーバとして動かすには両方必要になります。 設定方針は以下の3点です。 バーチャルメールボックスの設定を行い Unix ... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/5182">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>Postfix と Dovecot でさくらVPS上にメールサーバを動かしてみましたので設定例を置いときます。</p>
<p>Postfix は SMTP サーバでメールを送る部分の担当、Dovecot は POP3/IMAP サーバでクライアントからメールを見る部分の担当です。完結したメールサーバとして動かすには両方必要になります。</p>
<p>設定方針は以下の3点です。</p>
<ol>
<li>バーチャルメールボックスの設定を行い Unix ユーザーを作らなくてもメールを受信できるように設定します。</li>
<li>なるたけセキュリティ的に硬めにしたかったので、自サーバ宛のメールの配送と、サブミッションポート経由で SSL + SMTP AUTH で認証されたクライアントからの外部へのリレーのみを許可します。</li>
<li>バーチャルメールボックスのパスワード管理は Dovecot で一元管理します。（Postfix での SMTP AUTH の認証時のアカウント管理に Dovecot を使うという意味です。Postfix と Dovecot で別々にパスワード管理する方法もありますがぶっちゃけ面倒くさいので。）</li>
</ol>
<p>さくらVPSっつーか CentOS 上で Postfix と Dovecot を設定する例はググったら沢山でてきますので、違う方法の設定が必要な場合は適当にお調べください。つーことで本題に突入。</p>
<h3>パッケージのインストール</h3>
<p>yum から postfix と dovecot をインスコします。cyrus-sasl-md5 は SMTP 認証等で CRAM-MD5 による認証を有効にする場合に必要です。</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: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">yum install</span> postfix dovecot cyrus-sasl-md5</div></div>
<p>sendmail とか他のメールサーバを外向けの設定で運用していない場合はいきなり postfix を有効にして問題ありませんので、その前提で話を進めます。</p>
<p>CentOS をインストールした状態では sendmail が動いていますので落とします。以下のように chkconfig で確認して on になっていたら、</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">$ chkconfig <span style="color: #660033;">--list</span> <span style="color: #c20cb9; font-weight: bold;">sendmail</span><br />
<span style="color: #c20cb9; font-weight: bold;">sendmail</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">0</span>:off &nbsp; <span style="color: #000000;">1</span>:off &nbsp; <span style="color: #000000;">2</span>:on &nbsp; &nbsp;<span style="color: #000000;">3</span>:on &nbsp; &nbsp;<span style="color: #000000;">4</span>:on &nbsp; &nbsp;<span style="color: #000000;">5</span>:on &nbsp; &nbsp;<span style="color: #000000;">6</span>:off</div></div>
<p>sendmail を止めてから postfix を起動します。ついでに chkconfig でサーバリブート時に postfix が起動するようにします。</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><span style="color: #c20cb9; font-weight: bold;">sendmail</span> stop<br />
$ <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>postfix reload<br />
$ chkconfig <span style="color: #c20cb9; font-weight: bold;">sendmail</span> off<br />
$ chkconfig postfix on</div></div>
<hr class="linebreak">
<p>続けて alternatives で（サーバからのメール送信に使われる） sendmail コマンドを postfix に変更します。</p>
<p>現代的な Unix 系のシステムでは sendmail というメールサーバと sendmail というコマンドは別物として扱われており（元々は sendmail メールサーバに sendmail コマンドが付いていたのですが、sendmail コマンドを呼び出しているアプリケーションプログラムが多々存在するためメールサーバを変更する際に都合が悪いので、コマンドを分けた形です）。</p>
<p>CentOS ではメールを送信するために使う sendmail コマンドは alternatives で指定されたコマンドへのシンボリックリンクとなっています。</p>
<p>以下のように alternatives を実行すると、sendmail コマンドを実行した際に sendmail.postfix （Postfix の sendmail コマンド）が実行されるようになります。</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">$ alternatives <span style="color: #660033;">--config</span> mta<br />
<br />
There are <span style="color: #000000;">2</span> programs <span style="color: #c20cb9; font-weight: bold;">which</span> provide <span style="color: #ff0000;">'mta'</span>.<br />
<br />
&nbsp; Selection &nbsp; &nbsp;Command<br />
<span style="color: #660033;">-----------------------------------------------</span><br />
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">1</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>sendmail.sendmail<br />
&nbsp; &nbsp;<span style="color: #000000;">2</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>sendmail.postfix<br />
<br />
Enter to keep the current selection<span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span>, or <span style="color: #7a0874; font-weight: bold;">type</span> selection number: <span style="color: #000000;">2</span></div></div>
<hr class="linebreak">
<p>以上が終わったらローカル配送できてるかテストしてみます。（別にしなくても良いですけど早めに問題見つけといた方が楽ですし…）</p>
<p>てことで適当なユーザー（以下の例では root）でログインして適当なユーザーにメールを送ってみます。（シェルから sendmail コマンドを実行すればメールを送れます。sendmail コマンドを実行する際、&#8221;.&#8221; だけの行を入力するとメールが送信されます。）</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;">sendmail</span> root<br />
From: root<br />
To: root<br />
Subject: <span style="color: #7a0874; font-weight: bold;">test</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">test</span><br />
.</div></div>
<p>送ったメールは（宛先のユーザーでログインして）mail コマンドで見れます。</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">$ mail<br />
Mail version <span style="color: #000000;">8.1</span> <span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">93</span>. &nbsp;Type ? <span style="color: #000000; font-weight: bold;">for</span> help.<br />
<span style="color: #ff0000;">&quot;/var/spool/mail/root&quot;</span>: <span style="color: #000000;">1</span> message <span style="color: #000000;">1</span> new<br />
<span style="color: #000000; font-weight: bold;">&gt;</span>N &nbsp;<span style="color: #000000;">1</span> root<span style="color: #000000; font-weight: bold;">@</span>www9999u.sakur &nbsp;Fri Dec <span style="color: #000000;">16</span> 00:<span style="color: #000000;">33</span> &nbsp;<span style="color: #000000;">14</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">466</span> &nbsp; <span style="color: #ff0000;">&quot;test&quot;</span><br />
<span style="color: #000000; font-weight: bold;">&amp;</span> <br />
Message <span style="color: #000000;">1</span>:<br />
From root<span style="color: #000000; font-weight: bold;">@</span>www9999u.sakura.ne.jp &nbsp;Fri Dec <span style="color: #000000;">16</span> 00:<span style="color: #000000;">33</span>:<span style="color: #000000;">13</span> <span style="color: #000000;">2011</span><br />
X-Original-To: root<br />
Delivered-To: root<span style="color: #000000; font-weight: bold;">@</span>www9999u.sakura.ne.jp<br />
From: root<span style="color: #000000; font-weight: bold;">@</span>www9999u.sakura.ne.jp<br />
To: root<span style="color: #000000; font-weight: bold;">@</span>www9999u.sakura.ne.jp<br />
Subject: <span style="color: #7a0874; font-weight: bold;">test</span><br />
Date: Fri, <span style="color: #000000;">16</span> Dec <span style="color: #000000;">2011</span> 00:<span style="color: #000000;">33</span>:00 +0900 <span style="color: #7a0874; font-weight: bold;">&#40;</span>JST<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">test</span><br />
<br />
<span style="color: #000000; font-weight: bold;">&amp;</span> q<br />
Saved <span style="color: #000000;">1</span> message <span style="color: #000000; font-weight: bold;">in</span> mbox</div></div>
<p>メールが届いてなかったら /var/log/maillog を見て問題を探してください。（上記の設定内容でローカル配送のメールが届くのが遅れたりすることは基本的にありませんので「届いてなかった＝問題がある」と判断してもらって結構です。）</p>
<h3>Postfix と Dovecot の設定</h3>
<p>パスワード管理を共有する関係上、両方とも動いてから動作確認する方が速いと思いますので、一気に Postfix と Dovecot の設定を行います。</p>
<p>例示のため、バーチャルメールボックスに使用するドメインを example.com、バーチャルメールボックスに追加するメールアドレスを test@example.com として記述しています。実際の環境に合わせて読み替えてください。</p>
<h4>バーチャルメールボックス管理ユーザーの作成</h4>
<p>最初にバーチャルメールボックスを読み書きするための Unix ユーザーを作ります。（以下の例では vmail ユーザーを使います。）</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">$ groupadd <span style="color: #660033;">-g</span> <span style="color: #000000;">10000</span> vmail<br />
$ useradd <span style="color: #660033;">-u</span> <span style="color: #000000;">10000</span> <span style="color: #660033;">-g</span> <span style="color: #000000;">10000</span> <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>spool<span style="color: #000000; font-weight: bold;">/</span>vmail <span style="color: #660033;">-r</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>nologin vmail<br />
$ <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>spool<span style="color: #000000; font-weight: bold;">/</span>vmail<br />
$ <span style="color: #c20cb9; font-weight: bold;">chown</span> vmail:vmail <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>spool<span style="color: #000000; font-weight: bold;">/</span>vmail<br />
$ <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">700</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>spool<span style="color: #000000; font-weight: bold;">/</span>vmail</div></div>
<p>UID/GID は 10000 以外でも構いませんが、Postfix/Dovecot を設定する際に ID を指定する必要があるので UID/GID の番号を覚えておいてください。</p>
<h4>SSL 自己証明書と秘密鍵の作成</h4>
<p>Postfix/Dovecot ともに SSL を有効にするため、自己証明書と秘密鍵を作成します。（Dovecot に example.com の自己証明書と秘密鍵が付いてるのですが一応自サーバ用に作ります。）</p>
<p>/etc/pki/tls/certs ディレクトリの Makefile で秘密鍵を含む自己証明書を簡単に作れるのですが、後述する DER 形式ファイルを作成するため openssl コマンドを直接実行して作成します。</p>
<p>コマンドを実行すると証明書のパラメータを質問されますが、Common Name に VPS サーバのサーバ名（以下の例では www9999u.sakura.ne.jp）を入力し、それ以外の項目はデフォルトで構いません（ちゃんと入力しても良いですけど）。</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>etc<span style="color: #000000; font-weight: bold;">/</span>pki<span style="color: #000000; font-weight: bold;">/</span>tls<span style="color: #000000; font-weight: bold;">/</span>certs<br />
$ openssl req <span style="color: #660033;">-new</span> <span style="color: #660033;">-x509</span> <span style="color: #660033;">-nodes</span> <span style="color: #660033;">-days</span> <span style="color: #000000;">365</span> <span style="color: #660033;">-out</span> mail.crt <span style="color: #660033;">-keyout</span> mail.key<br />
Generating a <span style="color: #000000;">1024</span> bit RSA private key<br />
....++++++<br />
.......................................................++++++<br />
writing new private key to <span style="color: #ff0000;">'mail.key'</span><br />
<span style="color: #660033;">-----</span><br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter <span style="color: #ff0000;">'.'</span>, the field will be left blank.<br />
<span style="color: #660033;">-----</span><br />
Country Name <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span> letter code<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>GB<span style="color: #7a0874; font-weight: bold;">&#93;</span>:<br />
State or Province Name <span style="color: #7a0874; font-weight: bold;">&#40;</span>full name<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>Berkshire<span style="color: #7a0874; font-weight: bold;">&#93;</span>:<br />
Locality Name <span style="color: #7a0874; font-weight: bold;">&#40;</span>eg, city<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>Newbury<span style="color: #7a0874; font-weight: bold;">&#93;</span>:<br />
Organization Name <span style="color: #7a0874; font-weight: bold;">&#40;</span>eg, company<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>My Company Ltd<span style="color: #7a0874; font-weight: bold;">&#93;</span>:<br />
Organizational Unit Name <span style="color: #7a0874; font-weight: bold;">&#40;</span>eg, section<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>:<br />
Common Name <span style="color: #7a0874; font-weight: bold;">&#40;</span>eg, your name or your server<span style="color: #ff0000;">'s hostname) []:www9999u.sakura.ne.jp<br />
Email Address []:<br />
$chmod 600 mail.key</span></div></div>
<p>mail.crt が証明書ファイル、mail.key が秘密鍵ファイルです。証明書の有効期限は365日となっています。もっと長くしたい場合は -days オプションで増やしてください。</p>
<p>Outlook Express や Entourage、AppleMail などのクライアントを使っている場合、証明書をクライアントにインストールしないと警告が表示されるらしいので、インストール用の DER 形式の証明書を作成します。以下のコマンドで作成される mail.der をインストールしたら良いらしいです。（が、この辺は試してないのでうまくいかなかったら<a href="http://vine-linux.ddo.jp/linux/mail/inport.php">証明書のインポート &#8211; メール(Postfix) &#8211; 自宅サーバーの構築 &#8211; 自宅サーバーでやってみよう！！</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: #666666;">$ </span>openssl x509 <span style="color: #660033;">-inform</span> pem <span style="color: #660033;">-in</span> mail.crt <span style="color: #660033;">-outform</span> der <span style="color: #660033;">-out</span> mail.der</div></div>
<h4>Dovecot の設定</h4>
<p>Dovecot 側でパスワードを一元管理する関係上、こちらの設定を先に行います。Dovecot の設定ファイル /etc/dovecot.conf を編集し、アカウント管理用の /etc/dovecot-passwd ファイルを作成します。</p>
<p>まず Dovecot の設定ファイル /etc/dovecot.conf を編集します。ssl_cert_file と ssl_key_file は先ほど作った自己証明書と秘密鍵ファイルです。その他の設定は auth default セクション中に足します。</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: #000099;">ssl_cert_file</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /etc/pki/tls/certs/mail.crt</span><br />
<span style="color: #000099;">ssl_key_file</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /etc/pki/tls/certs/mail.key</span><br />
<br />
auth default <span style="">&#123;</span><br />
&nbsp; <span style="color: #000099;">mechanisms</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> cram-md5 digest-md5 plain login</span><br />
&nbsp; passdb passwd-file <span style="">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000099;">args</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /etc/dovecot-passwd</span><br />
&nbsp; <span style="">&#125;</span><br />
&nbsp; socket listen <span style="">&#123;</span><br />
&nbsp; &nbsp; client <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000099;">path</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /var/spool/postfix/private/auth</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000099;">mode</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> 0660</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000099;">user</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> postfix</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000099;">group</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> postfix</span><br />
&nbsp; &nbsp; <span style="">&#125;</span><br />
&nbsp; <span style="">&#125;</span><br />
&nbsp; userdb static <span style="">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000099;">args</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> uid=10000 gid=10000 home=/var/spool/vmail/%d/%n</span><br />
&nbsp; <span style="">&#125;</span><br />
<span style="">&#125;</span></div></div>
<p>実際の dovecot.conf にはコメントが大量に入ってて修正箇所を探すのが面倒かもしれませんが、ssl_cert_file、ssl_key_file、mechanisms は元からありますので書き換え、その他は auth default セクションの最後の方に足してもらうのが速いと思います。</p>
<p>設定ファイルの詳細については <a href="http://wiki.dovecot.org/FrontPage">Dovecot Wiki</a> をご覧ください。</p>
<hr class="linebreak">
<p>dovecot.conf の編集が終わったら /etc/dovecot-passwd ファイルを作成します。Dovecot をインストールした状態ではこのファイルは存在しませんので新規作成します。</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">test@example.com:<span style="">&#123;</span>HMAC-MD5<span style="">&#125;</span>dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3<br />
test2@example.com:<span style="">&#123;</span>HMAC-MD5<span style="">&#125;</span>dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3</div></div>
<p>dovecot-passwd ファイルには、ユーザー名と暗号化されたパスワードを &#8220;:&#8221; で区切って記述します。「ユーザー名＝メールアドレス」にした方がメールクライアントの設定が楽なのでそうしてますが、ユーザー名部分はメールアドレスでないとダメって訳ではありません。</p>
<p>暗号化されたパスワードは dovecotpw コマンドで取得できますのでコピペします。</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">$ dovecotpw <br />
Enter new password: <br />
Retype new password: <br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span>HMAC-MD5<span style="color: #7a0874; font-weight: bold;">&#125;</span>dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3</div></div>
<p>dovecot-passwd ファイルにはユーザーIDやホームディレクトリなど passwd ファイルと似たような項目を指定することもできるのですが、Postfix と連携するだけなら userdb static で指定した方が速いと思いますので省略します。詳しくは <a href="http://wiki.dovecot.org/AuthDatabase/PasswdFile">AuthDatabase/PasswdFile &#8211; Dovecot Wiki</a> をご覧ください。</p>
<hr class="linebreak">
<p>設定が終わったら dovecot サーバを起動します。ついでに chkconfig でサーバリブート時に dovecot が起動するように設定しておきます。</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>dovecot start<br />
$ chkconfig dovecot on</div></div>
<h4>Postfix の設定</h4>
<p>Postfix の設定では、Postfix 全体の設定ファイル /etc/postfix/main.cf とサブプロセス別の設定ファイル /etc/postfix/master.cf を編集し、バーチャルメールボックス管理用ファイル /etc/postfix/vmailbox を作成します。</p>
<p>まず /etc/postfix/main.cf を修正します。</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: #000099;">inet_interfaces</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> all</span><br />
<br />
# SASL<br />
#smtpd_sasl_auth_enable <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> yes</span><br />
<span style="color: #000099;">smtpd_recipient_restrictions</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> permit_mynetworks, reject_unauth_destination</span><br />
#broken_sasl_auth_clients <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> yes</span><br />
<br />
<span style="color: #000099;">smtpd_sasl_type</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> dovecot</span><br />
<span style="color: #000099;">smtpd_sasl_path</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> private/auth</span><br />
<span style="color: #000099;">smtpd_sasl_security_options</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> noanonymous</span><br />
<br />
# TLS<br />
<span style="color: #000099;">smtpd_use_tls</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> yes</span><br />
<span style="color: #000099;">smtpd_tls_key_file</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /etc/pki/tls/certs/mail.key</span><br />
<span style="color: #000099;">smtpd_tls_cert_file</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /etc/pki/tls/certs/mail.csr</span><br />
<br />
# Virtual<br />
<span style="color: #000099;">virtual_mailbox_domains</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> example.com</span><br />
<span style="color: #000099;">virtual_mailbox_base</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /var/spool/vmail</span><br />
<span style="color: #000099;">virtual_mailbox_maps</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> hash:/etc/postfix/vmailbox</span><br />
<span style="color: #000099;">virtual_minimum_uid</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> 100</span><br />
<span style="color: #000099;">virtual_uid_maps</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> static:10000</span><br />
<span style="color: #000099;">virtual_gid_maps</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> static:10000</span><br />
<span style="color: #000099;">virtual_alias_maps</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> hash:/etc/postfix/virtual</span></div></div>
<p>inet_interfaces は main.cf に元から設定が存在するので書き換えてください。他の項目は存在しないと思いますので、適当な場所に追加してください。</p>
<p>#smtpd_sasl_auth_enable = yes の行はコメントアウトしたままにしておいてください。後ほど master.cf を編集する際に、サブミッションポートからの接続時のみ smtpd_sasl_auth_enable = yes になるように設定します。設定ファイルを見たとき分かりにくいと思いますので、あえてコメントアウトで残しておいてもらった方が良いと思います。（まあコメントアウトせずに何も書かなくても結構ですけど。）</p>
<p>古い Outlook を使っている場合は、broken_sasl_auth_clients = yes を有効にする必要があります。SMTP AUTH に関するバグがあるそうです。うちでは Outlook は使ってないのでコメントアウトしてます。</p>
<p>バーチャルメールボックスのメールアドレスに使用するドメインは virtual_mailbox_domains に指定します。上の例では example.com になっていますので、実際に使用するドメインを記述してください。カンマ区切りで複数指定することもできます。</p>
<p>virtual_mailbox_domains に指定するドメインは mydestination と重複しないようにしてください。デフォルトで mydestination は $myhostname, localhost.$mydomain, localhost になっており、さくら VPS の場合 myhostname は www9999u.sakura.ne.jp とかになります。</p>
<p>myhostname を example.com にして mydestination を空にすることもできますが、cron 等システム内部からのメールはバーチャルメールボックスではなくローカル配送にした方が良いと思いますので、mydestination や myhostname はデフォルトのままの方が良いと思います。それとメールサーバの DNS の逆引き設定を行っていないと受信を拒否するサーバもあり、sakura.ne.jp のホストは逆引き可能ですので、その辺のトラブルを避けるためにもこの設定の方が楽だと思います。まあこの辺に色々うんちくのある方はご自由にどうぞ、っつーかそういう人はこんなブログ見ながら設定してはいけませんw</p>
<p>virtual_mailbox_base を別の場所に変えてもオッケーですが、あらかじめディレクトリが存在している必要があり、virtual_uid_maps で指定されるユーザーから制御可能である必要があります。この辺の設定は先ほど vmail ユーザーを作った際に行っていますが、変更する際は Postfix の要求を満たすよう適宜設定を行ってください。</p>
<p>smtpd_tls_key_file と smtpd_tls_cert_file には先ほど作った自己証明書と秘密鍵ファイルを指定します。</p>
<hr class="linebreak">
<p>main.cf の設定が終わったら /etc/postfix/master.cf を編集します。</p>
<p>以下の submission ポートの設定がコメントアウトされてると思いますので、有効にします。</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">submission inet n &nbsp; &nbsp; &nbsp; - &nbsp; &nbsp; &nbsp; n &nbsp; &nbsp; &nbsp; - &nbsp; &nbsp; &nbsp; - &nbsp; &nbsp; &nbsp; smtpd<br />
&nbsp; -o smtpd_enforce_tls<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">yes</span><br />
&nbsp; -o smtpd_sasl_auth_enable<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">yes</span><br />
&nbsp; -o smtpd_client_restrictions<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">permit_sasl_authenticated,reject</span><br />
-o smtpd_recipient_restrictions<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">permit_sasl_authenticated,reject_unauth_destination</span></div></div>
<hr class="linebreak">
<p>最後に /etc/postfix/vmailbox を編集して Postfix の設定は終わりです。Postfix をインストールした状態ではこのファイルは存在しませんので新規作成します。</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">test@example.com &nbsp; &nbsp; &nbsp; &nbsp;example.com/test/Maildir/<br />
test2@example.com &nbsp; &nbsp; &nbsp; example.com/test2/Maildir/</div></div>
<p>vmailbox ファイルにはバーチャルメールボックスのメールアドレスとメールボックスのパスを空白（タブ）区切りで記述していきます。</p>
<p>メールボックスのパスは virtual_mailbox_base からの相対パスを指定します。上の例ですと、test@example.com 宛てのメールは /var/spool/vmail/example.com/test/Maildir/ に Maildir 形式で保存されます。</p>
<p>Postfix はメールボックスのパスの末尾を / で終えると Maildir 形式、/ 無しで終えると mbox 形式で保存します。何言ってるか分からない人はとりあえず Maildir 形式でえーと思います。</p>
<p>編集が終わったら postmap コマンドでデータベースに変換します。これを実行しないと Postfix が起動しません。virtual ファイルは転送設定用のファイルで、こちらもデータベースが必要ですので一緒に postmap します。</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">$ postmap <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>postfix<span style="color: #000000; font-weight: bold;">/</span>vmailbox<br />
$ postmap <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>postfix<span style="color: #000000; font-weight: bold;">/</span>virtual</div></div>
<hr class="linebreak">
<p>設定が終わったら postfix をリブートします。</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: #666666;">$ </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>postfix reload</div></div>
<h3>DNS</h3>
<p>メールサーバを運用する際は、DNS に MX レコードを用意しておいた方が良いです。</p>
<p>A レコードだけでも運用できますが、DNS の二度引きが発生したりするので、バーチャルメールアドレスでの送受信に使用する MX レコードを作成します。</p>
<p>ドメインの登録を Value Domain で行っている場合は、以下のように設定してください。ドメインが example.com、サーバの IP アドレスが 192.0.2.1、メール送信用のホストが mail.example.com、の場合の設定例です。mail.example.com ではなく example.com を MX に指定しても良いのですが、メールサーバだけ移転とかする際にこの方が楽なので別ホスト扱いにしておいた方が良いと思います。</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">a @ 192.0.2.1<br />
a mail 192.0.2.1<br />
mx mail.example.com. <span style="">10</span></div></div>
<p>なお、新規にメールサーバを立てる（誰にもメールアドレスを教えていない状態の）場合は、メールサーバの設定より先に DNS の設定を行っておいても構いません。</p>
<h3>クライアントからの送信</h3>
<p>以上でメールサーバの設定は完了です。あとはクライアントの設定をして終わりです。</p>
<p>クライアントの設定ですが、以下のような感じになります。（メールサーバを mail.example.com、メールアドレスを test@example.com にした場合。）</p>
<dl>
<dt><b>SMTP</b></dt>
<dd>
<table>
<tr>
<th>ホスト</th>
<td>mail.example.com</td>
</tr>
<tr>
<th>ポート</th>
<td>587</td>
</tr>
<tr>
<th>SMTP AUTH ユーザー</th>
<td>test@example.com</td>
</tr>
<tr>
<th>SMTP AUTH パスワード</th>
<td>dovecot-passwd のパスワード</td>
</tr>
<tr>
<th>その他</th>
<td>STARTLS を使用して SSL を有効にする必要あり</td>
</tr>
</table>
</dd>
<dt><b>POP3</b></dt>
<dd>
<table>
<tr>
<th>ホスト</th>
<td>mail.example.com</td>
</tr>
<tr>
<th>ポート</th>
<td>110 （POP3S を使用する場合は 995）</td>
</tr>
<tr>
<th>ユーザー</th>
<td>test@example.com</td>
</tr>
<tr>
<th>パスワード</th>
<td>dovecot-passwd のパスワード</td>
</tr>
</table>
</dd>
<dt><b>IMAP</b></dt>
<dd>
<table>
<tr>
<th>ホスト</th>
<td>mail.example.com</td>
</tr>
<tr>
<th>ポート</th>
<td>143 （IMAPS を使用する場合は 993）</td>
</tr>
<tr>
<th>ユーザー</th>
<td>test@example.com</td>
</tr>
<tr>
<th>パスワード</th>
<td>dovecot-passwd のパスワード</td>
</tr>
</table>
</dd>
</dl>
<p>クライアント別の設定例はちょっと書ききれませんので、<a href="http://www.atmarkit.co.jp/fwin2k/win2ktips/798submssn/submssn.html">サブミッション・ポートを利用してメールを送信する － ＠IT</a> や <a href="http://www.atmarkit.co.jp/fwin2k/win2ktips/1100mailssl/mailssl.html">メールの送受信でSSLを利用して暗号化する－ ＠IT</a> を参考にお試しください。</p>
<h3>実運用に際して</h3>
<p>ほったらかしの運用だとじきにクラックされる可能性もありますので、実際に運用する際はログ監視ぐらいは最低限行っておいた方が良いと思います。</p>
<p>今日のネタはメールサーバの設定っつーことですのでログ監視ツールの使い方は説明しませんが、<a href="http://sourceforge.net/projects/swatch/">swatch</a> とか使ったら良いと思います。</p>
<p>んでわ</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/5182/feed</wfw:commentRss>
		<slash:comments>424</slash:comments>
		</item>
		<item>
		<title>Pythonのターミナルに出力する際に文字コード関係のエラーを抑制する</title>
		<link>http://sakuratan.biz/archives/5140</link>
		<comments>http://sakuratan.biz/archives/5140#comments</comments>
		<pubDate>Mon, 14 Nov 2011 10:06:55 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[UnicodeEncodeError]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=5140</guid>
		<description><![CDATA[Python 使ってると、日本語を表示する際に処理系が勝手に文字コードを変換しようとしてエラーが出て困ったりします。 こんな感じ↓のやつです。 &#62;&#62;&#62; print u'\uffff' Traceback &#40;most recent call last&#41;: &#160; File &#34;&#60;stdin&#62;&#34;, line 1, in &#60;mo... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/5140">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>Python 使ってると、日本語を表示する際に処理系が勝手に文字コードを変換しようとしてエラーが出て困ったりします。<br />
こんな感じ↓のやつです。</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\u</span>ffff'</span><br />
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:<br />
&nbsp; File <span style="color: #483d8b;">&quot;&lt;stdin&gt;&quot;</span><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span><br />
<span style="color: #008000;">UnicodeEncodeError</span>: <span style="color: #483d8b;">'euc_jp'</span> codec can<span style="color: #483d8b;">'t encode character u'</span>\uffff<span style="color: #483d8b;">' in position 0:<br />
illegal multibyte sequence</span></div></div>
<hr class="linebreak">
<p>普段は放置してるのですがちょっと真剣に対応してみることにしました。<br />
（この手の情報欲しい人はある程度 Python 詳しい人だと思いますし）グダグダ説明するような話でも無いので細かい説明は抜きで解決方法だけ書こうと思います。</p>
<ol>
<li>以下のファイルを safe_terminal.py に保存。
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">codecs</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> find_encoding<span style="color: black;">&#40;</span>fh<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> fh.<span style="color: black;">encoding</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> fh.<span style="color: black;">encoding</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'utf-8'</span><br />
<br />
<span style="color: #808080; font-style: italic;">#error = 'ignore'</span><br />
error <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'backslashreplace'</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">codecs</span>.<span style="color: black;">getwriter</span><span style="color: black;">&#40;</span>find_encoding<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">codecs</span>.<span style="color: black;">getwriter</span><span style="color: black;">&#40;</span>find_encoding<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span></div></div>
</li>
<li>print 等を使うプログラムで safe_terminal.py を import する。
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> safe_terminal<br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\u</span>ffff'</span><br />
\uffff</div></div>
</li>
</ol>
<p>こんな感じで stdout / stderr に対する print や write 時に変換できない文字をバックスラッシュでエスケープするのが便利かと思います。Python に含まれるライブラリ自体を書き換える方法もありますが、サーバ何台も扱ってると面倒なのでパスって感じです。</p>
<p>変換できない文字を非表示にしたい場合は error = &#8216;ignore&#8217; に変えてください。</p>
<h3>参考にしたページ</h3>
<p><a href="http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html">PythonのUnicodeEncodeErrorを知る &#8211; HDEラボ</a><br />
<a href="http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html">Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法</a></p>
<p>あじゃじゃしたーw</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/5140/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>クロスブラウザでdocument.createElement(&#8216;iframe&#8217;)した要素のonloadを呼び出す方法</title>
		<link>http://sakuratan.biz/archives/5044</link>
		<comments>http://sakuratan.biz/archives/5044#comments</comments>
		<pubDate>Tue, 11 Oct 2011 15:38:57 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[DOM]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=5044</guid>
		<description><![CDATA[&#8230;&#8230;.φ（．．）ﾒﾓﾒﾓです。 document.createElement(&#8216;iframe&#8217;) で作った DOM 要素に onload をセットする場合以下のようなコードを使います。 var iframe = document.createElement&#40;'iframe'&#41;; var onload_func = function&#... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/5044">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>&#8230;&#8230;.φ（．．）ﾒﾓﾒﾓです。</p>
<p>document.createElement(&#8216;iframe&#8217;) で作った DOM 要素に onload をセットする場合以下のようなコードを使います。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> iframe <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'iframe'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> onload_func <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// onload で実行する処理</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">all</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>window.<span style="color: #660066;">opera</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// IE の場合 onreadystatechange が必要</span><br />
&nbsp; &nbsp; iframe.<span style="color: #660066;">onreadystatechange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>iframe.<span style="color: #660066;">readyState</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;complete&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onload_func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// IE 以外なら onload で良い</span><br />
&nbsp; &nbsp; iframe.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; onload_func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> &nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
iframe.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'...'</span><span style="color: #339933;">;</span><br />
parentNode.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>iframe<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>コメントにも書いてますが、IE8 以下の場合 onreadystatechange を使う必要があります。</p>
<h3>参考サイト</h3>
<ul>
<li><a href="http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/">Iframes, onload, and document.domain | NCZOnline</a></li>
</ul>
<h3>あまり参考にならなかったサイト</h3>
<ul>
<li><a href="http://support.microsoft.com/kb/239638/ja">PRB: OnReadyStateChange および IFrame を起動しない OnLoad イベント &#8211; support.microsoft.com</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/5044/feed</wfw:commentRss>
		<slash:comments>528</slash:comments>
		</item>
		<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>196</slash:comments>
		</item>
		<item>
		<title>mysqlのibdataが原因でディスクフルになったときに復旧方法</title>
		<link>http://sakuratan.biz/archives/4536</link>
		<comments>http://sakuratan.biz/archives/4536#comments</comments>
		<pubDate>Sat, 27 Aug 2011 08:32:11 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[開発環境]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4536</guid>
		<description><![CDATA[さっきまで落ちてたsakuratan.bizです。どーもすみません。 原因は MySQL の InnoDB が使用する ibdata ファイルがディスクを食いつぶしてディスクフルになってたためでした。 ibdata はテーブルスペースを保存するファイルで、CentOS ですとデフォルトで /var/lib/mysql/ibdata1 に作成されます。MySQL のデフォルトでは ibdata が自... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4536">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>さっきまで落ちてたsakuratan.bizです。どーもすみません。</p>
<p>原因は MySQL の InnoDB が使用する ibdata ファイルがディスクを食いつぶしてディスクフルになってたためでした。</p>
<p>ibdata はテーブルスペースを保存するファイルで、CentOS ですとデフォルトで /var/lib/mysql/ibdata1 に作成されます。MySQL のデフォルトでは ibdata が自動で拡張されていく設定になっていますので、放っておくとどんどんファイルサイズがでかくなって、さくらの VPS とかですと結構あっさりディスクフルになりました。</p>
<p>とりあえず復旧できたんで手順とか残しときます。同じようにトラブった方は参考程度にどうぞ。</p>
<p style="margin-top:3em">まず ibdata1 がディスクを食いつぶしているので、復旧するにはこれを消すとかファイルを小さく必要があります。</p>
<p> ファイルサイズを小さくする方法は調べたらいっぱいでてきますので（<a href="http://dev.mysql.com/doc/refman/5.1/ja/adding-and-removing.html">13.5.7 InnoDB データとログ ファイルの追加と削除</a> とか <a href="http://bitwalker.dtiblog.com/blog-entry-162.html">ibdata1 のサイズを減らす手順</a> とか <a href="http://d.hatena.ne.jp/masayuki14/20100308/1268039336">ibdata1のサイズを減らす方法</a>とか）、概要だけ引用しますと、</p>
<blockquote>
<ol>
<li>全ての InnoDB テーブルをダンプする為に mysqldump を利用してください。</li>
<li>サーバを停止してください。</li>
<li>全ての存在するテーブルスペース ファイルを削除してください。</li>
<li>新しいテーブルスペースを設定してください。</li>
<li>サーバを再起動してください。</li>
<li>ダンプ ファイルをインポートしてください。</li>
</ol>
<p><cite><a href="http://dev.mysql.com/doc/refman/5.1/ja/adding-and-removing.html">MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.5.7 InnoDB データとログ ファイルの追加と削除</a></cite>
</ol>
</blockquote>
<p>という感じだったりします。要はバックアップ取ってテーブルスペースを作り直せということのようです。</p>
<p>ただまあディスクフルしてるんでサーバ上に mysqldump のダンプファイルなんか置けないので、ssh 経由で mysqldump を実行することにしました。↓のように ssh を起動することで、ネットワーク越しにコマンドを実行して mysqldump の出力をローカルに直接保存できます。</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;">ssh</span> <span style="color: #c20cb9; font-weight: bold;">who</span><span style="color: #000000; font-weight: bold;">@</span>domain \<br />
mysqldump <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> DBUSER \<br />
<span style="color: #660033;">--default-character-set</span>=binary <span style="color: #660033;">-p</span> DBNAME \<br />
TABLE1 TABLE2 ... &nbsp;<span style="color: #000000; font-weight: bold;">|</span> \<br />
<span style="color: #c20cb9; font-weight: bold;">gzip</span> <span style="color: #000000; font-weight: bold;">&gt;</span> mysql.dump</div></div>
<p>それとコマンドを実行する前にサーバ上のサービスをできるだけ止めてある程度作業用のメモリの確保して、ついでに不要なファイルをできるだけ削除しておいた方が良いと思います。メモリかスワップか何が原因か調べてる暇も無かったので詳細は不明ですが、リソースが足らないと mysqldump がテーブル構造を読み込む際にエラーを出します。</p>
<p>今回はリストアする必要が無いテーブルが何個かありましたのでダンプする対象をテーブル単位で指定していますが、全部リストアする場合はデータベース単位で指定してもらえばよろしいかと思います。運用形態によっては mysqldump に &#8211;single-transaction オプションを指定してもらった方が良いかもしれません（とりあえずウチんとこでは不要だったので指定してませんが）。</p>
<p style="margin-top:2em">ダンプできたら mysql を止めてから ibdata1 と ib_logfile0 と ib_logfile1 を消します。他のサイトだとリネームした方が良いとか書いてますがそんな余裕無いのでいきなりマジ削除しました。最悪データ全部豚でもいーや、の覚悟でどうぞw</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>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> ibdata1 ib_logfile<span style="color: #7a0874; font-weight: bold;">&#91;</span>01<span style="color: #7a0874; font-weight: bold;">&#93;</span></div></div>
<p>/etc/my.cnf に ibdata1 のサイズ制限と innodb_file_per_table を加えてからmysqld を再起動して回復しましたよ、という感じです。</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">innodb_data_file_path<span style="color: #66cc66;">=</span>ibdata1:10M:autoextend:<span style="color: #993333; font-weight: bold;">MAX</span>:100M<br />
innodb_file_per_table</div></div>
<p>innodb_file_per_table を指定すると、各テーブルの中身は共有テーブルスペースでは無く個別のファイルに保存されるようになるのですが、こっちのファイルも放置しておくと大きくなっていきますので、定期的に ALTER TABLE を実行してデフラグする必要があります。（詳しくは <a href="http://dev.mysql.com/doc/refman/5.1/ja/innodb-file-defragmenting.html">13.5.14.3 テーブルのデフラグメント化</a> とか <a href="http://cl.pocari.org/2006-07-07-2.html">拡張され続ける InnoDB のデータファイルのサイズを小さくする方法</a> とかをご覧ください。）</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;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> table1 ENGINE<span style="color: #66cc66;">=</span>InnoDB;</div></div>
<p style="margin-top:3em">個別に ALTER TABLE 実行するのも面倒なので、全ての InnoDB テーブルに対して ALTER TABLE を実行するスクリプトも書いてみました。よろしければどうぞ。</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> MySQLdb<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; conn <span style="color: #66cc66;">=</span> MySQLdb.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">'root'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; cur <span style="color: #66cc66;">=</span> conn.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; cur.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SHOW DATABASES'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; databases <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span>database <span style="color: #ff7700;font-weight:bold;">for</span> database<span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">in</span> cur <span style="color: #ff7700;font-weight:bold;">if</span> database <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'mysql'</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; cur.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; conn.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> database <span style="color: #ff7700;font-weight:bold;">in</span> databases:<br />
&nbsp; &nbsp; &nbsp; &nbsp; conn <span style="color: #66cc66;">=</span> MySQLdb.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">'root'</span><span style="color: #66cc66;">,</span> db<span style="color: #66cc66;">=</span>database<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cur1 <span style="color: #66cc66;">=</span> conn.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cur1.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SHOW TABLE STATUS'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> t <span style="color: #ff7700;font-weight:bold;">in</span> cur1:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tablename <span style="color: #66cc66;">=</span> t<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; engine <span style="color: #66cc66;">=</span> t<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> engine <span style="color: #ff7700;font-weight:bold;">and</span> engine.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'innodb'</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Defrag %s.%s'</span> % <span style="color: black;">&#40;</span>database<span style="color: #66cc66;">,</span> tablename<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur2 <span style="color: #66cc66;">=</span> conn.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ALTER TABLE %s ENGINE=INNODB'</span> % tablename<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur2.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cur1.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; conn.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'__main__'</span>:<br />
&nbsp; &nbsp; main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>MySQL にパスワード無しで root ログインできる前提でスクリプト書いてますので、その辺の設定変えている方は適当に改造して使ってください。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4536/feed</wfw:commentRss>
		<slash:comments>202</slash:comments>
		</item>
		<item>
		<title>HTML5が巨人の川相なら、data-属性はHTML5の川相</title>
		<link>http://sakuratan.biz/archives/4479</link>
		<comments>http://sakuratan.biz/archives/4479#comments</comments>
		<pubDate>Thu, 25 Aug 2011 06:31:02 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4479</guid>
		<description><![CDATA[意味不明なタイトルですんません。増田にインスパイアされました。 さて HTML5 界隈が騒がしい今日このごろですが、data- 属性というものを皆さんご存知でしょうか？ Twitter のツイートボタン作成ページで作った HTML に入ってる data-via とかのことです。最近色んなところでよく目にしますが、これを使うと任意の DOM 要素に任意の値をセットできるみたいです。 で、この dat... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4479">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>意味不明なタイトルですんません。<a href="http://anond.hatelabo.jp/20110823194555">増田</a>にインスパイアされました。</p>
<p>さて HTML5 界隈が騒がしい今日このごろですが、data- 属性というものを皆さんご存知でしょうか？</p>
<p>Twitter の<a href="https://twitter.com/about/resources/tweetbutton">ツイートボタン作成ページ</a>で作った HTML に入ってる data-via とかのことです。最近色んなところでよく目にしますが、これを使うと任意の DOM 要素に任意の値をセットできるみたいです。</p>
<p>で、この data- 属性なんですが <b>HTML5 の仕様の一部</b>だったみたいです。恥ずかしながらちゃんとした仕様だということを最近知ったのですが、個人的には canvas とか video とかをブッちぎって一番重要な HTML4 からの変更点じゃないかと思います。</p>
<p>てことで本日は、努力家だけど恥ずかしがり屋さんの data- 属性さん(46歳)が実は<a href="http://www.google.com/search?q=%E3%81%84%E3%81%B6%E3%81%97%E9%8A%80&#038;ie=utf-8&#038;oe=utf-8">いぶし銀</a>のスーパースターだということをプロバガンダをしようと思います。</p>
<h3>data- 属性は HTML5 の規格の一部</h3>
<p>まず超基本的なことですが、data- 属性は HTML5 の規格の一部です。</p>
<p>W3C の HTML5 draft の <a href="http://dev.w3.org/html5/spec/elements.html#embedding-custom-non-visible-data-with-the-data-attributes">3.2.3.8 Embedding custom non-visible data with the data-* attributes</a> に定義されています。</p>
<blockquote><p>
Custom data attributes are intended to store custom data private to the page or application, for which there are no more appropriate attributes or elements.<br />
<cite><a href="http://dev.w3.org/html5/spec/elements.html#embedding-custom-non-visible-data-with-the-data-attributes">3.2.3.8 Embedding custom non-visible data with the data-* attributes</a></cite>
</p></blockquote>
<p>W3C では data- 属性のことを Custom data attributes と呼んでいるようです。日本語では独自データ属性と表記しているサイトが多いと思います（<a href="http://www.html5.jp/tag/attributes/data.html">独自データ属性 &#8211; グローバル属性 &#8211; HTML5 タグリファレンス &#8211; HTML5.JP</a> とか）。</p>
<p style="margin-top:2em">重要なのは↓の部分。（英語の仕様を貼っててもアレなんで HTML5.JP さんから引用）</p>
<blockquote><p>
すべての HTML 要素に対して、独自データ属性をいくつでも、どんな値でも指定することができます。<br />
<a href="http://www.html5.jp/tag/attributes/data.html">独自データ属性 &#8211; グローバル属性 &#8211; HTML5 タグリファレンス &#8211; HTML5.JP</a>
</p></blockquote>
<p>どの要素に何個でも付けれるらしいです(´・ω・`)便利だねー</p>
<p>てことで HTML5 の独自データ属性を使うと、meta タグとか（Twitter がやってた）、type=&#8221;hidden&#8221; の input タグとか（form の下位要素じゃないと HTML 的にまずいような）、display:none にした span とか div とか（なんだかねーって感じ）、id や class 属性とか（属性値に制限あり）に、無理やりセットしてたデータをスマートにコーディングできるようになります。</p>
<h3>使い方</h3>
<p>まず HTML は以下のように書きます。data- に続けてアルファベットと &#8211; で任意のキー名を指定します。</p>
<div class="codecolorer-container html4strict dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;spaceship&quot;</span> data-ship-<span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;92432&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; data-weapons<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;laser 2&quot;</span> data-shields<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;50%&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; data-x<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;30&quot;</span> data-y<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span> data-z<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;90&quot;</span>&gt;</span>宇宙船ちきう号<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></div></div>
<p>DOM を使って JavaScript から値を参照する場合は以下のようにコーディングします。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> spaceship <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'spaceship'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">dataset</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">dataset</span>.<span style="color: #660066;">weapons</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">dataset</span>.<span style="color: #660066;">shipId</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;data-weapons&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;data-ship-id&quot;</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>上のコードでは dataset プロパティが存在するかチェックして dataset に対応していないブラウザをフォールバックしています。手元の Firefox4 が dataset プロパティに対応していないようでしたので、実際にコーディングする際は getAttribute だけで良いような気もします。</p>
<p>dataset プロパティを使用する場合は、キーに &#8211; が含まれている場合は Camel にします。（data-ship-id → dataset.shipId）</p>
<p>値をセットする場合は dataset プロパティに代入するか setAttribute を使います。jQuery を使った方が便利ですのでこの辺の例は省略、ってことで興味ある方はご自分でお調べください。</p>
<h4>jQuery の場合</h4>
<p>jQuery には <a href="http://api.jquery.com/jQuery.data/">$.data()</a> と <a href="http://api.jquery.com/data">.data()</a> という似たような名前の関数がありまして、HTML5 の独自データ属性と対応するのは <a href="http://api.jquery.com/data">.data()</a> の方なのでご注意ください。$.data() も .data() もプレースホルダを提供する関数なのですが、$.data() の方は完全に jQuery 独自の実装となっています。</p>
<p>で、.data() の方は大方の読者の予想の通り↓のようにコーディングできます。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'weapons'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ship-id'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>値をセットする場合はこんな感じ。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'weapons'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Gatling gun'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'weapons'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>ちなみに、.data() で値をセットしても data- 属性には書き込まず $.cache に値がセットされます。data- 属性に書き込みたい場合は <a href="http://api.jquery.com/attr/">.attr()</a> を使ってください。なんかややこい挙動ですが、なんか理由があってこーなってる気がします。（jQuery のサイトでなんで HTML5 の data- に書き込まないの？って感じの<a href="http://api.jquery.com/data">コメント</a>してる人がいますが華麗にスルーされてますし。）</p>
<p>また、.data() の引数を省略するとデータをオブジェクトで返します。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">weapons</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>値にはオブジェクトも指定できます。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'body'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> myType<span style="color: #339933;">:</span> <span style="color: #3366CC;">'test'</span><span style="color: #339933;">,</span> count<span style="color: #339933;">:</span> <span style="color: #CC0000;">40</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'body'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'bar'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">myType</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>ぶっちゃけ大して難しいところは無いと思いますので説明はこの辺で。</p>
<p style="margin-top:3em">ということで、いぶし銀 JavaScripter を目指す皆様におかれましては data- 属性で千本バント練習に打ち込むのがよろしいかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4479/feed</wfw:commentRss>
		<slash:comments>183</slash:comments>
		</item>
		<item>
		<title>Unixのターミナルからビープ音を鳴らす方法</title>
		<link>http://sakuratan.biz/archives/4013</link>
		<comments>http://sakuratan.biz/archives/4013#comments</comments>
		<pubDate>Thu, 14 Apr 2011 06:29:09 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[開発環境]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[ターミナル]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4013</guid>
		<description><![CDATA[先日30分ぐらいかかるスクリプトを実行していたのですが、終わったらビープ音で通知してくれると便利かなーと思って調べてみました。 ビープ音の文字コードは 0&#215;7 まず基本的なこととして、ASCII コードの 0&#215;7 は BEL となっており、（デバイス的に）適当なベル音を鳴らす文字コードとなっています。 つまり 0&#215;7 を出力したらビープ音が鳴るってことです。 シェルか... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4013">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>先日30分ぐらいかかるスクリプトを実行していたのですが、終わったらビープ音で通知してくれると便利かなーと思って調べてみました。</p>
<h3>ビープ音の文字コードは 0&#215;7</h3>
<p>まず基本的なこととして、ASCII コードの 0&#215;7 は BEL となっており、（デバイス的に）適当なベル音を鳴らす文字コードとなっています。</p>
<p>つまり 0&#215;7 を出力したらビープ音が鳴るってことです。</p>
<h3>シェルから鳴らす</h3>
<p>シェルから鳴らす場合、echo コマンドを使います。コマンドラインから 0&#215;7 を指定するにはコントロールシーケンス ^G を入力します。</p>
<p>一般的なターミナルでは [CTRL]+v [CTRL]+g を連続して入力するとコントロールシーケンス ^G が入力できます。文字列 &#8220;^G&#8221; を入力しても鳴りませんので注意してください。</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: #666666;">$ </span><span style="color: #7a0874; font-weight: bold;">echo</span> ^G</div></div>
<p>printf コマンドがインストールされている環境では、以下のようにビープ音を鳴らすこともできます。</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;">printf</span> <span style="color: #ff0000;">'\007'</span></div></div>
<h3>プログラミング言語から鳴らす</h3>
<p>0&#215;07 が出力できれば良いので、基本的にどのプログラミング言語からでもビープ音を鳴らすことができます。</p>
<p>代表的な LL 言語で鳴らす方法は以下のようになります。</p>
<div class="codecolorer-container perl dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># perl</span><br />
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>07&quot;</span><span style="color: #339933;">;</span></div></div>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># python</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>07&quot;</span></div></div>
<div class="codecolorer-container ruby dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># ruby</span><br />
<span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;<span style="color:#000099;">\0</span>07&quot;</span></div></div>
<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><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\007</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>全部いっしょとか言わないのw</p>
<p>んでわ。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4013/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
