<?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://neta.megumi-champloo.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://neta.megumi-champloo.net</link>
	<description>NginxやWordPressの小ネタなど...</description>
	<lastBuildDate>Wed, 05 Oct 2011 05:36:36 +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>WordPressのテーマやプラグインでtimthumb.phpをお使いの方は脆弱性が見つかったのでご注意！</title>
		<link>http://neta.megumi-champloo.net/2011/08/03/vulnerability-found-in-timthumb/</link>
		<comments>http://neta.megumi-champloo.net/2011/08/03/vulnerability-found-in-timthumb/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 08:51:23 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=325</guid>
		<description><![CDATA[WordPressのテーマやプラグインで多く使われているTimThumbという画像リサイズライブラリーに脆弱性が見つかったのでご注意を！という記事がありましたのでざっと訳します。 引用元: Vulnerability F &#8230; <a href="http://neta.megumi-champloo.net/2011/08/03/vulnerability-found-in-timthumb/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>WordPressのテーマやプラグインで多く使われている<a href="http://code.google.com/p/timthumb/">TimThumb</a>という画像リサイズライブラリーに脆弱性が見つかったのでご注意を！という記事がありましたのでざっと訳します。</p>
<blockquote><p>引用元: <a href="http://blog.vaultpress.com/2011/08/02/vulnerability-found-in-timthumb/">Vulnerability Found in timthumb.php | VaultPress Blog</a></p>
<p>この脆弱性により、第三者が任意のPHPコードをTimThumbキャッシュディレクトリにアップロードでき、そのコードを実行されてしまいます。</p>
<p>timthumb.php もしくは thumb.php が無くても動作するならこのファイルをサイトから削除するようおすすめします。もし使っていないテーマやプラグインの中にこのファイルがあったら、そのテーマやプラグインのディレクトリごと削除したほうがいいでしょう。</p></blockquote>
<p>どうしてもこのライブラリを使いたい方は<a href="http://blog.vaultpress.com/2011/08/02/vulnerability-found-in-timthumb/">同ページ</a>に修正方法が載ってますので参照してください。</p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/08/03/vulnerability-found-in-timthumb/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: nginx/Windows の利用法</title>
		<link>http://neta.megumi-champloo.net/2011/07/12/nginxwindows-usage/</link>
		<comments>http://neta.megumi-champloo.net/2011/07/12/nginxwindows-usage/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 09:24:49 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=303</guid>
		<description><![CDATA[こんどこそ最後の nginx（Wikipediaの説明）のドキュメント訳の８回目の「nginx/Windows usage（nginx/Windows の利用法）」です。 nginx.org 上のドキュメントは（たぶんほ &#8230; <a href="http://neta.megumi-champloo.net/2011/07/12/nginxwindows-usage/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>こんどこそ最後の <a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>訳の８回目の「<a href="http://nginx.org/en/docs/windows.html">nginx/Windows usage</a>（nginx/Windows の利用法）」です。</p>
<p>nginx.org 上のドキュメントは（たぶんほんとに）これだけです。あとは <a href="http://wiki.nginx.org/Main">wiki (http://wiki.nginx.org/Main)</a> で目についたところを訳していきます。</p>
<hr />
<p>nginx/Windows の利用法<br />
原文: <a href="http://nginx.org/en/docs/windows.html">nginx/Windows usage</a><a href="http://nginx.org/en/docs/debugging_log.html"></a></p>
<p><a href="#known_issues">既知の問題</a><br />
<a href="#possible_future_enhancements">予定している将来的な拡張</a></p>
<p>nginx/Windows はネイティブ Win32 API（Cygwin エミュレータレイヤーではなく）を利用しています。いまのところ通知メソッドとしては <em>select</em> メソッドのみが使われていますので、高い性能やスケーラビリティは期待しないでください。このことといくつかの既知の問題のため nginx/Windows はベータバージョンとみなしてください。Unix のバージョンと比べると、XSLT フィルター、画像フィルター、GeoIP モジュール、埋め込み Perl 言語以外でほぼフル機能を備えています。</p>
<p>nginx/Windows をインストールするには、最新の 1.0.4 開発版の zip ファイルを<a href="http://nginx.org/en/download.html">ダウンロード</a>しします。開発ブランチには特に Windows 関連のすべての既知の修正が含まれています。次にファイルを展開し、nginx-1.0.4 ディレクトリに行って nginx を起動します。次はドライブ C: ルートディレクトリでの例です:</p>
<pre>cd c:\
unzip nginx-1.0.4.zip
cd nginx-1.0.4
start nginx</pre>
<p>“<code>tasklist</code>” コマンドラインユーティリティを起動すると nginx のプロセスが見れます:</p>
<pre>C:\nginx-1.0.4&gt;tasklist /fi "imagename eq nginx.exe"

Image Name           PID Session Name     Session#    Mem Usage
=============== ======== ============== ========== ============
nginx.exe            652 Console                 0      2 780 K
nginx.exe           1332 Console                 0      3 112 K</pre>
<p>プロセスの一つはマスタープロセスで、もうひとつはワーカープロセスです。もし nginx が起動していなければ “<code>logs\error.log</code>” ファイルを調べて原因を見つけてください。もしログファイルが生成されていなかったら、Windows イベントログに原因が記録されているはずです。期待していたページではなくエラーページが表示された場合もやはり “<code>logs\error.log</code>” を調べてエラーの原因を見つけてください。</p>
<p>nginx/Windows は、設定内での相対パス用に nginx/Windows が起動しているディレクトリをプリフィックスディレクトリとして使用します。例えば上の例では、“<code>C:\nginx-1.0.4\</code>” がプリフィックスディレクトリです。設定内でのパスはフォワードスラッシュを使用して Unix スタイルで設定します:</p>
<pre>access_log   logs/site.log;
root         C:/web/html;</pre>
<p>nginx/Windows はサービスとしてではなく標準的なコンソールアプリケーションとして動作していて、次のコマンドを利用して管理できます:</p>
<blockquote>
<table width="100%">
<tbody>
<tr>
<td width="20%">nginx -s stop</td>
<td>即時終了</td>
</tr>
<tr>
<td>nginx -s quit</td>
<td>正常な終了</td>
</tr>
<tr>
<td>nginx -s reload</td>
<td>設定を変更し、新しいワーカーを起動し、古いワーカーを正常終了させる</td>
</tr>
<tr>
<td>nginx -s reopen</td>
<td>ログファイルの再オープン</td>
</tr>
</tbody>
</table>
</blockquote>
<p><a name="known_issues"></a></p>
<h4>既知の問題</h4>
<ul>
<li>複数のワーカーを走らせることはできますが、実際はそのうち一つしか動作しません。</li>
<li>ひとつのワーカーが扱える同時接続は 1024 までです。</li>
<li>共有メモリーのサポートが必要なキャッシュやその他のモジュールは Windows Vista 以降では動作しません。こうした Windows のバージョンではアドレス空間レイアウトのランダム化が有効になっているからです。</li>
</ul>
<p><a name="possible_future_enhancements"></a></p>
<h4>予定している将来的な拡張</h4>
<ul>
<li>サービスとしての起動</li>
<li>通知メソッドとして I/O 完了ポートの利用</li>
<li>ひとつのワーカープロセス内での複数のワーカースレッドの利用</li>
</ul>
<p style="text-align: right;">文書作成: Igor Sysoev<br />
編集: Brian Mercer<br />
翻訳: <a href="http://www.digitalcube.jp/">DigitalCube Co. Ltd.</a><br />
監訳:</p>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/07/12/nginxwindows-usage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: nginx</title>
		<link>http://neta.megumi-champloo.net/2011/07/12/nginx/</link>
		<comments>http://neta.megumi-champloo.net/2011/07/12/nginx/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 09:20:50 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=308</guid>
		<description><![CDATA[「nginx faq（nginx FAQ）」で終わりかと思ったらまだあったｗ。nginx（Wikipediaの説明）のドキュメント訳の７回目は一番上の紹介のページ（http://nginx.org/en/）です。 基本的 &#8230; <a href="http://neta.megumi-champloo.net/2011/07/12/nginx/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>「<a href="http://nginx.org/en/docs/faq.html">nginx faq</a>（nginx FAQ）」で終わりかと思ったらまだあったｗ。<a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>訳の７回目は<a href="http://nginx.org/en/">一番上の紹介のページ（http://nginx.org/en/）</a>です。</p>
<hr />
<p><a href="#basic_http_features">基本的な HTTP 機能</a><br />
<a href="#other_http_features">他の HTTP 機能</a><br />
<a href="#mail_proxy_server_features">メールプロキシサーバ機能</a><br />
<a href="#architecture_and_scalability">アーキテクチャとスケーラビリティ</a><br />
<a href="#tested_os_and_platforms">テスト済み OS とプラットフォーム</a></p>
<p>nginx [えんじんえっくす] は <a href="http://sysoev.ru/en/">Igor Sysoev</a> によって作られた HTTP とリバースプロキシのサーバで、メールプロキシサーバでもあります。<a href="http://www.rambler.ru/">Rambler</a> (<a href="http://ramblermedia.com/">RamblerMedia.com</a>) を含むロシアの多くの高負荷サイトで５年以上も動いています。Netcraft によると、nginx は <a href="http://news.netcraft.com/archives/2010/04/15/april_2010_web_server_survey.html">2010 年 4 月時点で 4.70% の人気サイト</a>でサーバーとしてもしくはプロキシとして利用されています。そうした成功例としては<a href="http://blog.fastmail.fm/2007/01/04/webimappop-frontend-proxies-changed-to-nginx/">FastMail.FM</a> や <a href="http://barry.wordpress.com/2008/04/28/load-balancer-update/">WordPress.com</a> があります。</p>
<p>ソースコードは <a href="http://nginx.org/LICENSE">BSD 風の 2 箇条ライセンス</a>でライセンスされています。</p>
<p><a name="basic_http_features"></a></p>
<h4>基本的な HTTP 機能</h4>
<ul>
<li> スタティックなインデックスファイルの提供、ファイルディスクリプタキャッシュをオープンする自動インデクシング</li>
<li> キャッシングで高速化されたリバースプロキシ、シンプルなロードバランシング、フォールトトレランス</li>
<li> リモートの FastCGI サーバのキャッシングによる高速化サポート、シンプルなロードバランシング、フォールトトレランス</li>
<li> モジュールアーキテクチャ。フィルタにはgzip、バイトレンジ、チャンク化されたレスポンス、XSLT、SSI、画像リサイズフィルタが含まれます。FastCGI もしくはプロキシ化されたサーバなら、単一ページ内への複数 SSI 封入が並列で処理可能。</li>
<li> SSL と TLS SNI サポート。</li>
</ul>
<p><a name="other_http_features"></a></p>
<h4>他の HTTP 機能</h4>
<ul>
<li> 名前ベースと IP ベースの仮想サーバ</li>
<li> キープアライブとパイプライン接続のサポート</li>
<li> 柔軟な設定</li>
<li>クライアント処理を中断させること無く再設定、オンラインアップグレード</li>
<li>アクセスログフォーマット、バッファされたログ書き込み、素早いログローテーション</li>
<li> 3xx-5xx エラーコードのリダイレクト</li>
<li> rewrite モジュール</li>
<li>クライアントの IP アドレスをベースにしたアクセスコントロールと HTTP ベーシック認証</li>
<li>PUT、DELETE、MKCOL、COPY、MOVE メソッド</li>
<li> FLV ストリーミング</li>
<li>速度制限</li>
<li>同一アドレスからの同時接続もしくは同時リクエストの制限</li>
<li>埋め込み perl</li>
</ul>
<p><a name="mail_proxy_server_features"></a></p>
<h4>メールプロキシサーバ機能</h4>
<ul>
<li>外部の HTTP 認証サーバを利用した IMAP/POP3 バックエンドへのユーザリダイレクト</li>
<li>外部の HTTP 認証サーバと内部 SMTP バックエンドへの接続リダイレクトを利用したユーザ認証</li>
<li> 認証メソッド:
<ul>
<li> POP3: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5;</li>
<li> IMAP: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5;</li>
<li> SMTP: AUTH LOGIN/PLAIN/CRAM-MD5;</li>
</ul>
</li>
<li> SSL サポート</li>
<li> STARTTLS と STLS のサポート</li>
</ul>
<p><a name="architecture_and_scalability"></a></p>
<h4>アーキテクチャとスケーラビリティ</h4>
<ul>
<li>一つのマスタープロセスと複数のワーカープロセス。ワーカーは非特権ユーザとして動く</li>
<li>通知メソッド: kqueue (FreeBSD 4.1+)、epoll (Linux 2.6+)、rt シグナルs (Linux 2.2.19+)、/dev/poll (Solaris 7 11/99+)、イベントポート (Solaris 10)、select、poll</li>
<li>EV_CLEAR, EV_DISABLE (イベントを一時的に無効にする)、 NOTE_LOWAT, EV_EOF、利用可能なデータの数、エラーコードを含む様々な kqueue 機能のサポート</li>
<li>sendfile (FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5)、sendfile64 (Linux 2.4.21+)、sendfilev (Solaris 8 7/01+) のサポート</li>
<li> ファイル AIO (FreeBSD 4.3+, Linux 2.6.22+)</li>
<li> Accept-filters (FreeBSD 4.1+) と TCP_DEFER_ACCEPT (Linux 2.4+) のサポート</li>
<li>1 万の使われていない HTTP キープアライブ接続は約 2.5M のメモリーを使用</li>
<li> データコピーの実施は最小に保たれる</li>
</ul>
<p><a name="tested_os_and_platforms"></a></p>
<h4>テスト済み OS とプラットフォーム</h4>
<ul>
<li> FreeBSD 3  —  8 / i386; FreeBSD 5  —  8 / amd64;</li>
<li> Linux 2.2  —  2.6 / i386; Linux 2.6 / amd64;</li>
<li> Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;</li>
<li> MacOS X / ppc, i386;</li>
<li> Windows XP, Windows Server 2003.</li>
</ul>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/07/12/nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: nginx FAQ</title>
		<link>http://neta.megumi-champloo.net/2011/07/11/nginx-faq/</link>
		<comments>http://neta.megumi-champloo.net/2011/07/11/nginx-faq/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 07:23:47 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=264</guid>
		<description><![CDATA[nginx（Wikipediaの説明）のドキュメント訳の６回目は「nginx faq（nginx FAQ）」です、、、といってもひとつだけですが、原文がそうなんでして。。。 nginx.org 上のドキュメントはこれだけ &#8230; <a href="http://neta.megumi-champloo.net/2011/07/11/nginx-faq/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>訳の６回目は「<a href="http://nginx.org/en/docs/faq.html">nginx faq</a>（nginx FAQ）」です、、、といってもひとつだけですが、原文がそうなんでして。。。</p>
<p>nginx.org 上のドキュメントはこれだけです。あとは <a href="http://wiki.nginx.org/Main">wiki (http://wiki.nginx.org/Main)</a> で目についたところを訳していきます。</p>
<hr />
<p>メッセージ “‘sys_errlist’ は非推奨です。代わりに ‘strerror’ もしくは ‘strerror_r’ を使ってください”<br />
原文: <a href="http://nginx.org/en/docs/sys_errlist.html">A message  “ ‘sys_errlist’                 is deprecated;                 use  ‘strerror’ or ‘strerror_r’                 instead ”</a></p>
<p>nginx のバージョン 0.7.66、0.8.35、もしくはそれ以上を Linux でビルド中、次の警告メッセージが出ます:</p>
<pre>warning: `sys_errlist' is deprecated;
    use `strerror' or `strerror_r' instead
warning: `sys_nerr' is deprecated;
    use `strerror' or `strerror_r' instead</pre>
<p>これは正常です。strerror() と strerror_r() 関数が非同期シグナルセーフではないので、nginx はシングルハンドラの中で非推奨の sys_errlist[] と sys_nerr を使う必要があります。</p>
<p style="text-align: right;">文書作成: Igor Sysoev<br />
編集: Brian Mercer<br />
翻訳: <a href="http://www.digitalcube.jp/">DigitalCube Co. Ltd.</a><br />
監訳:</p>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/07/11/nginx-faq/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: nginx ハウツー &#8211; デバッギングログ</title>
		<link>http://neta.megumi-champloo.net/2011/07/11/nginx-howto-a-debugging-log/</link>
		<comments>http://neta.megumi-champloo.net/2011/07/11/nginx-howto-a-debugging-log/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 06:46:39 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=248</guid>
		<description><![CDATA[nginx（Wikipediaの説明）のドキュメント訳の４回目は「nginx howto（nginx ハウツー）」の「A debugging log（デバッギングログ）」です。 デバッギングログ 原文: A debugg &#8230; <a href="http://neta.megumi-champloo.net/2011/07/11/nginx-howto-a-debugging-log/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>訳の４回目は「<a href="http://nginx.org/en/docs/howto.html">nginx howto</a>（nginx ハウツー）」の「<a href="http://nginx.org/en/docs/debugging_log.html">A debugging log</a>（デバッギングログ）」です。</p>
<hr />
<p>デバッギングログ<br />
原文: <a href="http://nginx.org/en/docs/debugging_log.html">A debugging log</a></p>
<p>デバッギングログを有効にするには、nginx をデバッグオプションを付けて設定する必要があります:</p>
<pre>./configure --with-debug ...</pre>
<p>次に “error_log” の “debug” レベルをセットします:</p>
<pre>error_log  /path/to/log  debug;</pre>
<p>nginx の Windows バイナリバージョンでは常にデバッグログモードがサポートされてビルドされているので、“debug” レベルをセットするだけです。</p>
<p>別のレベル、例えば <em>server</em> レベルでログを定義するとそのサーバでのデバッギングログが無効になりますので注意してください：</p>
<pre>error_log  /path/to/log  debug;

http {
    server {
        error_log  /path/to/log;
        ...</pre>
<p>このサーバログをコメントアウトするか “debug” フラグを追加してください:</p>
<pre>error_log  /path/to/log  debug;

http {
    server {
        error_log  /path/to/log  debug;
        ...</pre>
<p>また、特定のアドレスだけデバッギングログを有効にすることもできます:</p>
<pre>error_log  /path/to/log;

events {
    debug_connection   192.168.1.1;
    debug_connection   192.168.10.0/24;
}</pre>
<p style="text-align: right;">文書作成: Igor Sysoev<br />
編集: Brian Mercer<br />
翻訳: <a href="http://www.digitalcube.jp/">DigitalCube Co. Ltd.</a><br />
監訳:</p>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/07/11/nginx-howto-a-debugging-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: nginx ハウツー &#8211; rewrite ルールのコンバート</title>
		<link>http://neta.megumi-champloo.net/2011/07/11/nginx-howto-converting-rewrite-rules-rewrite/</link>
		<comments>http://neta.megumi-champloo.net/2011/07/11/nginx-howto-converting-rewrite-rules-rewrite/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 06:22:20 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=261</guid>
		<description><![CDATA[nginx（Wikipediaの説明）のドキュメント訳の５回目は「nginx howto（nginx ハウツー）」のConverting rewrite rules（rewrite ルールのコンバート）」です。 rewr &#8230; <a href="http://neta.megumi-champloo.net/2011/07/11/nginx-howto-converting-rewrite-rules-rewrite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>訳の５回目は「<a href="http://nginx.org/en/docs/howto.html">nginx howto</a>（nginx ハウツー）」の<a href="http://nginx.org/en/docs/http/converting_rewrite_rules.html">Converting rewrite rules</a>（rewrite ルールのコンバート）」です。</p>
<hr />
<p>rewrite ルールのコンバート<br />
原文: <a href="http://nginx.org/en/docs/http/converting_rewrite_rules.html">Converting rewrite rules</a></p>
<ul>
<li><a href="#a_redirect_to_a_main_site">メインサイトへのリダイレクト</a></li>
<li><a href="#converting_mongrel_rules">Mongrel ルールのコンバート</a></li>
</ul>
<p><a name="a_redirect_to_a_main_site"></a></p>
<h4>メインサイトへのリダイレクト</h4>
<p>共有のホスティングで Apache の .htaccess ファイルで<em>すべて</em>を設定してきたのなら、次のようにルールをコンバートします:</p>
<pre>RewriteCond  %{HTTP_HOST}  nginx.org
RewriteRule  (.*)          http://www.nginx.org$1</pre>
<p>上記は下記のようになります:</p>
<pre>server {
    listen       80;
    server_name  www.nginx.org  nginx.org;
    if ($http_host = nginx.org) {
        rewrite  (.*)  http://www.nginx.org$1;
    }
    ...
}</pre>
<p>これは間違っていて面倒で非効率的な方法です。正しい方法は <em>nginx.org </em>用に別のサーバを定義します:</p>
<pre>server {
    listen       80;
    server_name  nginx.org;
    rewrite   ^  http://www.nginx.org$request_uri?;
}

server {
    listen       80;
    server_name  www.nginx.org;
    ...
}</pre>
<p>別の例として、後方ロジックの代わり、<em>nginx.com</em> 以外と <em>www.nginx.com</em> 以外のすべて<em> </em>です:</p>
<pre>RewriteCond  %{HTTP_HOST}  !nginx.com
RewriteCond  %{HTTP_HOST}  !www.nginx.com
RewriteRule  (.*)          http://www.nginx.com$1</pre>
<p>この場合、単に <em>nginx.com</em>、<em>www.nginx.com</em>、そしてそれ以外を定義します:</p>
<pre>server {
    listen       80;
    server_name  nginx.com  www.nginx.com;
    ...
}

server {
    listen       80 default_server;
    server_name  _;
    rewrite   ^  http://nginx.com$request_uri?;
}</pre>
<p><a name="converting_mongrel_rules"></a></p>
<h4>Mongrelルールのコンバート</h4>
<p>典型的な Mongrel のルール:</p>
<pre>DocumentRoot /var/www/myapp.com/current/public

RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [QSA,L]

RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]</pre>
<p>上記は次のようにコンバートされます</p>
<pre>location / {
    root       /var/www/myapp.com/current/public;

    try_files  /system/maintenance.html
               $uri  $uri/index.html $uri.html
               @mongrel;
}

location @mongrel {
    proxy_pass  http://mongrel;
}</pre>
<p style="text-align: right;">文書作成: Igor Sysoev<br />
編集: Brian Mercer<br />
翻訳: <a href="http://www.digitalcube.jp/">DigitalCube Co. Ltd.</a><br />
監訳:</p>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/07/11/nginx-howto-converting-rewrite-rules-rewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: HTTPS サーバの設定</title>
		<link>http://neta.megumi-champloo.net/2011/07/01/introduction-to-nginx-configuring-https-servers/</link>
		<comments>http://neta.megumi-champloo.net/2011/07/01/introduction-to-nginx-configuring-https-servers/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 10:40:51 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=200</guid>
		<description><![CDATA[じゃじゃーん！この nginx ドキュメント訳をwokamotoさんが監訳してくれることになりました！（監訳作業はこれからです。なのでより正確な文書が読みたい場合はまた後ほどお寄りください） オープンソース系の文書の訳っ &#8230; <a href="http://neta.megumi-champloo.net/2011/07/01/introduction-to-nginx-configuring-https-servers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>じゃじゃーん！この nginx ドキュメント訳を<a href="http://dogmap.jp/">wokamoto</a>さんが監訳してくれることになりました！（監訳作業はこれからです。なのでより正確な文書が読みたい場合はまた後ほどお寄りください）</p>
<p>オープンソース系の文書の訳って監訳してもらえることがあんまり無いんでこれは個人的にかなり嬉しいです。快く引き受けてくださった<a href="http://dogmap.jp/">wokamoto</a>さんに多謝！</p>
<p>で、で、<a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>訳の３回目は「<a href="http://nginx.org/en/docs/introduction.html">Introduction to nginx</a>（nginx 入門）」の「<a href="http://nginx.org/en/docs/http/configuring_https_servers.html">Configuring HTTPS servers</a>（HTTPS サーバの設定）」です。</p>
<hr />
<p>HTTPS サーバの設定<br />
原文: <a href="http://nginx.org/en/docs/http/configuring_https_servers.html">Configuring HTTPS servers</a></p>
<ul>
<li><a href="#optimization">HTTPS サーバの最適化</a></li>
<li><a href="#chains">SSL 連鎖証明書</a></li>
<li><a href="#single_http_https_server">単一の HTTP/HTTPS サーバ</a></li>
<li><a href="#name_based_https_servers">名前ベースの HTTPS サーバ</a></li>
<li><a href="#certificate_with_several_names">複数名の SSL 証明</a></li>
<li><a href="#sni">サーバ名指示（SNI）</a></li>
<li><a href="#compatibility">互換性</a></li>
</ul>
<p>HTTPS サーバを設定するには server ブロックで SSL プロトコルを有効にして、サーバ証明書ファイルと秘密鍵ファイルの場所を指定する必要があります:</p>
<pre>server {
    listen               443;
    server_name          www.nginx.com;
    ssl                  on;
    ssl_certificate      www.nginx.com.crt;
    ssl_certificate_key  www.nginx.com.key;
    ssl_protocols        SSLv3 TLSv1;
    ssl_ciphers          HIGH:!ADH:!MD5;
    ...
}</pre>
<p>サーバ証明書とはドメインの所有者情報や、送信情報の暗号化に必要な公開鍵を含む電子証明書です。そのサーバに接続するすべてのクライアントに送られます。秘密鍵はサーバ証明書に含まれる公開鍵で暗号化された情報を復号するために必要な鍵で、秘匿する必要が有ります。アクセスを制限したファイルに保存するようにしてください。ただし、nginx のマスタープロセスからは読めるようにする必要があります。もうひとつの方法として、秘密鍵は証明書と同じファイルに保存することもできます。</p>
<pre>    ssl_certificate      www.nginx.com.cert;
    ssl_certificate_key  www.nginx.com.cert;</pre>
<p>この場合もファイルのアクセス権は制限するようにします。証明書と秘密鍵がひとつのファイルに保存されていても、証明書だけがクライアントに送られます。</p>
<p>SSL プロトコルの強力なバージョンと暗号に接続を制限するには、ディレクティブ “ssl_protocols” と “ssl_ciphers” を使用します。バージョン 0.8.20 以降、nginx は “ssl_protocols SSLv3 TLSv1” と “ssl_ciphers HIGH:!ADH:!MD5” をデフォルトとして使用しているので、これより古い nginx のバージョンでのみ設定してください。</p>
<p><a name="optimization"></a></p>
<p><strong>HTTPS サーバの最適化</strong></p>
<p>SSL の工程は CPU リソースを余計に消費します。マルチプロセッサシステムでは（利用できる CPU コアの数よりも大きい数の）複数のワーカープロセスを走らせるといいでしょう。最も CPU に負荷がかかる工程は SSL ハンドシェイクです。クライアント毎のこの工程数を最小化するには２つの方法があります。最初の方法はキープアライブ接続を有効にして、ひとつの接続経由で複数のリクエストを送るようにする方法です。二つ目の方法は SSL セッションパラメータを再利用して、並行かつ順次接続のための SSL ハンドシェイクを避ける方法です。セッションはワーカー間で共有される SSL セッションキャッシュに保持され、“ssl_session_cache” ディレクティブで設定されています。１メガバイトのキャッシュには約４０００のセッションが含まれます。キャッシュのデフォルトタイムアウトは５分です。この値は “ssl_session_timeout” ディレクティブを使用して増やすことができます。次の例は１０Mの共有セッションキャッシュをもったクアッドコアシステムに最適化された設定例です:</p>
<pre><strong>worker_processes  4</strong>;

http {
    <strong>ssl_session_cache    shared:SSL:10m</strong>;
    <strong>ssl_session_timeout  10m</strong>;

    server {
        listen               443;
        server_name          www.nginx.com;
        <strong>keepalive_timeout    70</strong>;

        ssl                  on;
        ssl_certificate      www.nginx.com.crt;
        ssl_certificate_key  www.nginx.com.key;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          HIGH:!ADH:!MD5;
        ...</pre>
<p><a name="chains"></a></p>
<p><strong>SSL </strong><strong>連鎖</strong><strong>証明書</strong></p>
<p>ブラウザによっては有名な認証局によって署名された証明書にエラーをだすことがあります。その一方でその証明書を他のブラウザでは問題なく受け入れることもあります。これは発行している認証局が、有名で信用されている認証局の認証基盤には含まれない特定のブラウザで配布されている中間証明書を使ったサーバ証明書に署名しているからです。このケースでは、認証局は署名されたサーバ証明書に連結されているはずの連鎖証明書のバンドルを提供しています。サーバ証明書は、かならず結合されたファイル内の連鎖証明書に存在している必要があります:</p>
<pre>$ cat www.nginx.com.crt bundle.crt &gt; www.nginx.com.chained.crt</pre>
<p>この結合されたファイルを “ssl_certificate” ディレクティブで使われるようにします:</p>
<pre>server {
    listen               443;
    server_name          www.nginx.com;
    ssl                  on;
    ssl_certificate      www.nginx.com.chained.crt;
    ssl_certificate_key  www.nginx.com.key;
    ...
}</pre>
<p>サーバ証明書とバンドルされたものが間違った順序で連結されていた場合、nginx は起動に失敗して次のエラーメッセージを表示します:</p>
<pre>SSL_CTX_use_PrivateKey_file(" ... /www.nginx.com.key") failed
   (SSL: error:0B080074:x509 certificate routines:
    X509_check_private_key:key values mismatch)</pre>
<p>これは、nginx がサーバ証明書ではなくバンドルされた最初の証明書で秘密鍵を使おうとするからです。</p>
<p>ブラウザは通常、信頼されている認証局によって署名されている受信した中間証明書を保存します。したがって、よく使われているブラウザは要求された中間証明書をすでに保持しているかもしれませんし、連鎖バンドルなしで送られた証明書にエラーを出すかもしれません。サーバに完全な連鎖証明書を送信させるには “<code>openssl</code>” コマンドラインユーティリティを使うといいでしょう。例えば:</p>
<pre>$ openssl s_client -connect www.godaddy.com:443
...
Certificate chain
 0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US
     /1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc
     /OU=MIS Department/<strong>CN=www.GoDaddy.com</strong>
     /serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
     /OU=http://certificates.godaddy.com/repository
     /CN=Go Daddy Secure Certification Authority
     /serialNumber=07969287
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
     /OU=http://certificates.godaddy.com/repository
     /CN=Go Daddy Secure Certification Authority
     /serialNumber=07969287
   i:/C=US/O=The Go Daddy Group, Inc.
     /OU=Go Daddy Class 2 Certification Authority
 2 s:/C=US/O=The Go Daddy Group, Inc.
     /OU=Go Daddy Class 2 Certification Authority
   i:/L=ValiCert Validation Network/O=<strong>ValiCert, Inc.</strong>
     /OU=ValiCert Class 2 Policy Validation Authority
     /CN=http://www.valicert.com//emailAddress=info@valicert.com
...</pre>
<p>この例では、<em>www.GoDaddy.com</em> サーバ証明書 #0 の対象 (“<em>s</em>”) はそれ自身が証明書 #1 の対象である発行者 (“<em>i</em>”) によって署名されています。そして、証明書 #1はそれ自身が証明書 #2 の対象である発行者によって署名され、証明書 #2 は有名な発行者である<em> ValiCert, Inc.</em> によって署名されていて、<em>ValiCert, Inc.</em> の証明書はブラウザに組み込まれている証明書ベースに保持されています（こうして連鎖します）。</p>
<p>もし証明書バンドルを追加していなければ、サーバ証明書 #0 しか見れません。</p>
<p><a name="single_http_https_server"></a></p>
<p><strong>単一の HTTP/HTTPS サーバ</strong></p>
<p>最初の段階から HTTP と HTTPS プロトコル用にサーバを分けて設定するのは優れた実践です。現時点では両者の機能性としては等しいかもしれませんが、将来的に大きな変更があるかもしれず、統合されたサーバの使用が問題になるかもしれません。とはいえ、HTTP と HTTPS のサーバが等しく、将来のことを考えたくないのなら、ディレクティブ “ssl on” を削除して *:443 ポートに “ssl” パラメータを追加することによって HTTP と HTTPS リクエストの両者を扱う単一のサーバを設定することができます:</p>
<pre>server {
    listen               80;
    listen               443  ssl;
    server_name          www.nginx.com;
    ssl_certificate      www.nginx.com.crt;
    ssl_certificate_key  www.nginx.com.key;
    ...
}</pre>
<blockquote><p>0.8.21 以前では、nginx は “default” パラメータで待ち受けているソケットに “ssl” パラメータをセットすることしかできませんでした:</p></blockquote>
<pre>listen  443  default  ssl;</pre>
<p><a name="name_based_https_servers"></a></p>
<p><strong>名前ベースの HTTPS サーバ</strong></p>
<p>単一の IP アドレスを２つ以上の HTTPS サーバで待ち受けるように設定するとよく発生する問題があります:</p>
<pre>server {
    listen           443;
    server_name      www.nginx.com;
    ssl              on;
    ssl_certificate  www.nginx.com.crt;
    ...
}

server {
    listen           443;
    server_name      www.nginx.org;
    ssl              on;
    ssl_certificate  www.nginx.org.crt;
    ...
}</pre>
<p>この設定では、ブラウザはリクエストされたサーバ名に関わらずデフォルトサーバ、すなわちここでは <em>www.nginx.com </em>の証明書を受信します。これは SSL プロトコルの作用によるものです。この SSL 接続はブラウザが HTTP リクエストを送る前に確立されるので、nginx にはリクエストされたサーバ名は分かりません。したがって、デフォルトサーバの証明書を送ることしかできません。</p>
<p>この問題を解決するもっとも古くてもっとも堅実な方法は、各 HTTPS サーバに別個の IP アドレスを割り当てることです:</p>
<pre>server {
    listen           192.168.1.1:443;
    server_name      www.nginx.com;
    ssl              on;
    ssl_certificate  www.nginx.com.crt;
    ...
}

server {
    listen           192.168.1.2:443;
    server_name      www.nginx.org;
    ssl              on;
    ssl_certificate  www.nginx.org.crt;
    ...
}</pre>
<p><a name="certificate_with_several_names"></a></p>
<p><strong>複数サーバ名をもつ SSL 証明書</strong></p>
<p>単一の IP アドレスを複数の HTTPS サーバ間で共有する方法は他にもありますが、どれも欠点があります。ひとつは、SubjectAltName フィールドに複数サーバ名（例えば、<em>www.nginx.com</em> と <em>www.nginx.org</em>）をもつ単一の証明書を使用する方法です。しかし、SubjectAltName の長さには制限があります。</p>
<p>もうひとつの方法は、例えば<em> *.nginx.org</em> のようにワイルドカード名を持った証明書を使用する方法です。この証明書は <em>www.nginx.org</em> にマッチしますが <em>nginx.org</em> や <em>www.sub.nginx.org</em> にはマッチしません。以上の二つの方法は組み合わせることもできます。証明書には、例えば <em>nginx.org</em> と <em>*.nginx.org</em> のように SubjectAltName フィールドに完全一致名とワイルドカード名を含ませることができます。</p>
<p>すべてのサーバでひとつのメモリーコピーを継承するためには、複数サーバ名を持つ証明書ファイルとその秘密鍵ファイルを設定の http レベルに置くとよいでしょう:</p>
<pre>ssl_certificate      common.crt;
ssl_certificate_key  common.key;

server {
    listen           443;
    server_name      www.nginx.com;
    ssl              on;
    ...
}

server {
    listen           443;
    server_name      www.nginx.org;
    ssl              on;
    ...
}</pre>
<p><a name="sni"></a></p>
<p><strong>サーバ名指示（</strong><strong>Server Name Indication &#8211; </strong><strong>SNI）</strong></p>
<p>単一の IP アドレス上で複数の HTTPS サーバを動かすときのさらに包括的な解決方法として <a href="http://en.wikipedia.org/wiki/Server_Name_Indication">TLSv1.1 Server Name Indication extension（サーバ名指示拡張）</a> (SNI, RFC3546) があります。これは、ブラウザが SSL ハンドシェイクの間にリクエストされたサーバ名を渡せるようにするもので、それによりサーバはその接続でどの証明書を使用するべきかが分かります。しかし、SNI は限られたブラウザしかサポートしていません。現時点では次のブラウザのバージョン以降のものがサポートされています。</p>
<ul>
<li> Opera 8.0</li>
<li> MSIE 7.0 (Windows Vista 以降のみ)</li>
<li> Firefox 2.0 および Mozilla Platform rv:1.8.1 を使用している他のブラウザ</li>
<li> Safari 3.2.1 (Windows バージョンでは Vista 以降)</li>
<li> Chrome (Windows バージョンでは Vista 以降)</li>
</ul>
<p>nginx で SNI を使用するためには、nginx バイナリがビルドされたときの OpenSSL ライブラリとランタイムで動的にリンクされるライブラリの両方でサポートされていることが必要です。OpenSSL は設定オプション “&#8211;enable-tlsext” でビルドされていれば、バージョン 0.9.8f 以降で SNI をサポートしています。OpenSSL 0.9.8j 以降ではこのオプションはデフォルトで有効になっています。nginx が SNI サポート付きでビルドされていれば、 “-V” スイッチとともに起動すると nginx が次のように表示します:</p>
<pre>$ nginx -V
...
TLS SNI support enabled
...</pre>
<p>しかし、SNI が有効になっている nginx が SNI サポート無しの OpenSSL ライブラリに動的にリンクされている場合、nginx は次の警告を表示します:</p>
<pre>nginx was built with SNI support, however, now it is linked
dynamically to an OpenSSL library which has no tlsext support,
therefore SNI is not available</pre>
<p><a name="compatibility"></a></p>
<p><strong>互換性</strong></p>
<ul>
<li>“-V” スイッチでの SNI サポートステータス表示は 0.8.21 以降と 0.7.62 でサポートされています。</li>
<li>“listen” ディレクティブの “ssl” パラメータは 0.7.14 以降からサポートされています。</li>
<li>SNI は 0.5.32 以降からサポートされています。</li>
<li>共有 SSL セッションキャッシュは 0.5.6 以降からサポートされています。</li>
</ul>
<ul>
<li>バージョン 0.7.65 と 0.8.19 以降のデフォルトの SSL プロトコルは SSLv3 とTLSv1 です。</li>
<li>バージョン 0.7.64 と 0.8.18 以前のデフォルトの SSL プロトコルは SSLv2、SSLv3、TLSv1 です。</li>
</ul>
<ul>
<li>バージョン 0.7.65 と 0.8.20 以降のデフォルトの SSL 暗号は “HIGH:!ADH:!MD5” です。</li>
<li>バージョン  0.8.19 のデフォルトの SSL 暗号は “ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM” です。</li>
<li>バージョン 0.7.64 と 0.8.18 以前のデフォルトの SSL 暗号は “ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP” です。</li>
</ul>
<p style="text-align: right;">文書作成: Igor Sysoev<br />
編集: Brian Mercer<br />
翻訳: <a href="http://www.digitalcube.jp/">DigitalCube Co. Ltd.</a><br />
監訳: <a href="http://dogmap.jp/">wokamoto</a></p>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス:Ninjax<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/07/01/introduction-to-nginx-configuring-https-servers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: サーバ名</title>
		<link>http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-server-names/</link>
		<comments>http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-server-names/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 10:21:30 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=182</guid>
		<description><![CDATA[nginx（Wikipediaの説明）のドキュメントの訳の２回目です。 今回は「Introduction to nginx（nginx 入門）」の「Server names（サーバ名）」です。 **** サーバ名 原文: &#8230; <a href="http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-server-names/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>の訳の２回目です。</p>
<p>今回は「<a href="http://nginx.org/en/docs/introduction.html">Introduction to nginx</a>（nginx 入門）」の「<a href="http://nginx.org/en/docs/http/server_names.html">Server names</a>（サーバ名）」です。</p>
<p>****</p>
<p><a href="http://nginx.org/en/docs/http/server_names.html">サーバ名</a><br />
原文: <a href="http://nginx.org/en/docs/http/server_names.html">Server names</a></p>
<ul>
<li><a href="#Wildcard">ワイルドカード名</a></li>
<li><a href="#Regular">正規表現名</a></li>
<li><a href="#Miscellaneous">その他のサーバ名</a></li>
<li><a href="#Optimization">最適化</a></li>
<li><a href="#Compatibility">互換性</a></li>
</ul>
<p>サーバ名は “server_name” ディレクティブを使用して定義され、リクエストに対してどのサーバブロックが使われるかを決定します。「How nginx processes a request（<a title="nginx ドキュメント訳: nginx はどのようにリクエストを処理するか" href="http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-how-nginx-processes-a-request/">nginx はどのようにリクエストを処理するか</a>）」もお読みください。これらは完全一致名、ワイルドカード名、正規表現で定義されます:</p>
<pre>server {
    listen       80;
    server_name  nginx.org  www.nginx.org;
    ...
}

server {
    listen       80;
    server_name  *.nginx.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

server {
    listen       80;
    server_name  ~^(?&lt;user&gt;.+)\.nginx\.net$;
    ...
}</pre>
<p>サーバ名は次の順序で考査されます:</p>
<ol>
<li>完全一致名;</li>
<li>アスタリスクで始まるワイルドカード名: <em>*.nginx.org</em>;</li>
<li>アスタリスクで終わるワイルドカード名: <em>mail.*</em>;</li>
<li>設定ファイル内の順序での正規表現</li>
</ol>
<p>最初にマッチしたところで検索は終了します。</p>
<p><strong id="Wildcard">ワイルドカード名</strong></p>
<p>ワイルドカード名にはそのサーバ名の最初か最後のみ、そしてドットに隣接したところのみにアスタリスクが含まれます。サーバ名 “www.*.nginx.org” や “w*.nginx.org” は無効です。しかし、これらのサーバ名は正規表現を使用して、例えば  “~^www\..+\.nginx\.org$” や “~^w.*\.nginx\.org$” として指定することができます。アスタリスクは複数部分にマッチさせることができます。“*.nginx.org” は www.nginx.org だけでなく www.sub.nginx.org にもマッチします。</p>
<p>特別なワイルドカードの形式 “.nginx.org” は、完全一致名 “nginx.org” とワイルドカード名 “*.nginx.org” の両方にマッチさせるように利用できます。</p>
<p><strong id="Regular">正規表現名</strong></p>
<p>nginx で使用される正規表現は Perl プログラミング言語（PCRE）で使用されているものと互換性があります。正規表現を使用するには、サーバ名を必ずチルダで始めます:</p>
<pre>server_name  ~^www\d+\.nginx\.net$;</pre>
<p>チルダで始まっていないと完全一致名として、またはその正規表現にアスタリスクが含まれている場合はワイルドカード名として（そしてたいていの場合は無効なものとして）扱われてしまいます。“^” と “$” アンカーをセットし忘れないようにしてください。これらは構文的には必須ではありませんが論理的に必須です。また、ドメイン名のドットはバックスラッシュで必ずエスケープしてください。“{” と “}” 文字を含む正規表現は必ずダブルクォーテーション(&#8220;)で囲ってください:</p>
<pre>server_name  "~^(?&lt;name&gt;\w\d<strong>{</strong>1,3<strong>}</strong>+)\.nginx\.net$";</pre>
<p>さもないと、nginx は起動に失敗し次のエラーメッセージを表示します:</p>
<pre>directive "server_name" is not terminated by ";" in ...</pre>
<p>正規表現の名前付きキャプチャは変数としてその後で使用されます:</p>
<pre>server {
    server_name   ~^(www\.)?(<strong>?&lt;domain&gt;</strong>.+)$;

    location / {
        root   /sites/<strong>$domain</strong>;
    }
}</pre>
<p>PCRE ライブラリは次の構文を使用した名前付きキャプチャをサポートしています:</p>
<table width="100%">
<tbody>
<tr>
<td><code>?&lt;<em>name</em>&gt;</code></td>
<td>Perl 5.10 互換構文、PCRE-7.0 よりサポート</td>
</tr>
<tr>
<td><code>?'<em>name</em>'</code></td>
<td>Perl 5.10 互換構文、PCRE-7.0よりサポート</td>
</tr>
<tr>
<td><code>?P&lt;<em>name</em>&gt;</code></td>
<td>Python 互換構文、PCRE-4.0よりサポート</td>
</tr>
</tbody>
</table>
<p>nginx が起動に失敗すると次のエラーメッセージを表示します:</p>
<pre>pcre_compile() failed: unrecognized character after (?&lt; in ...</pre>
<p>これは PCRE ライブラリが古いので “?P” 構文を試すように、という意味です。このキャプチャは数字形式でも使用できます:</p>
<pre>server {
    server_name   ~^(www\.)?(.+)$;

    location / {
        root   /sites/<strong>$2</strong>;
    }
}</pre>
<p>とはいえ、数字形式は簡単に上書きすることができるため、このような使用法は（上記のような）単純なケースに限るべきです。</p>
<p><strong id="Miscellaneous">その他のサーバ名</strong></p>
<p>デフォルトではないサーバブロックで “Host” ヘッダ無しのリクエストを処理させたい場合は、空のサーバ名を指定します:</p>
<pre>server {
    listen       80;
    server_name  nginx.org  www.nginx.org  "";
    ...
}</pre>
<p>“server_name” がサーバブロックで定義されていない場合は、nginx はサーバ名として空の名前を使用します。</p>
<p>nginx のバージョン 0.8.48 までは、このような場合はサーバ名としてホスト名を使用していました。</p>
<p>サーバ名ではなく IP アドレスを使用したリクエストが送られてきた場合、そのリクエストの “Host” ヘッダには IP アドレスが含まれているので、その IP アドレスをサーバ名として利用してそのリクエストを処理できます:</p>
<pre>server {
    listen       80;
    server_name  nginx.org
                 www.nginx.org
                 ""
                 <strong>192.168.1.1</strong>
                 ;
    ...
}</pre>
<p>In catch-all server examples you may see the strange name “_”:</p>
<p>すべてのサーバに適合させる例では奇妙なサーバ名 “_” を目にするかもしれません:</p>
<pre>server {
    listen       80  default_server;
    server_name  _;
    return       444;
}</pre>
<p>このサーバ名に特別なところはありません。単にどのサーバ名とも決してマッチしない無数の無効なドメイン名のひとつです。したがって、 “&#8211;”、“!@#” なども同様な結果を得られます。</p>
<p>nginx バージョン 0.6.25 までは特別なサーバ名 “*” をサポートしていて、これは誤ってすべてのサーバ名と一致するもの（キャッチオール名）として解釈されていました。この特別なサーバ名 “*” はキャッチオールまたはワイルドカードとして機能したことはありませんでした。代わりに、今は “server_name_in_redirect” ディレクティブによって提供されている機能の役を果たしていました。特別なサーバ名 “*” は今後廃止予定ですので、“server_name_in_redirect” ディレクティブを使うようにしてください。キャッチオール名を指定したり “server_name” ディレクティブを使用したデフォルトサーバを指定したりする方法はないことに注意してください。これは “listen” ディレクティブのプロパティであり、“server_name” ディレクティブのプロパティではありません。“<a href="http://nginx.org/en/docs/http/request_processing.html">How nginx processes a request</a>（<a href="http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-how-nginx-processes-a-request/">日本語訳</a>）” も参照してください。</p>
<p>ポート *:80 と *:8080 で待ち受けているサーバを定義し、ひとつをポート *:8080 のデフォルトサーバへ、もうひとつをポート *:80 のデフォルトサーバへ振り向けることができます。</p>
<pre>server {
    listen       80;
    listen       8080  default_server;
    server_name  nginx.net;
    ...
}

server {
    listen       80  default_server;
    listen       8080;
    server_name  nginx.org;
    ...
}</pre>
<p><strong id="Optimization">最適化</strong></p>
<p>完全一致名とワイルドカード名はハッシュで保存されます。このハッシュは待ち受けポートに結び付けられ、各待ち受けポートは、完全一致名のハッシュ、アスタリスクで始まるワイルドカード名のハッシュ、アスタリスクで終わるワイルドカード名のハッシュの３つまでのハッシュを持つことができます。ハッシュのサイズは構成フェーズで最適化されるので、CPU キャッシュのミスは最低でもサーバ名を見つけることができます。最初に完全一致名のハッシュが検索されます。完全一致名のハッシュを使って見つからなければ、次にアスタリスクで始まるワイルドカード名のハッシュが検索されます。さらにまだ見つからなければ、アスタリスクで終わるワイルドカード名のハッシュが検索されます。ワイルドカード名のハッシュの検索は完全一致名のハッシュの検索よりも遅くなります。これはサーバ名の検索がドメイン部分によって検索されるからです。特別なワイルドカード形式の “.nginx.org” は完全一致名のハッシュではなくワイルドカード名のハッシュで保存されます。正規表現は順番に考査されるので、これがもっとも遅い方式ですし、非スケーラブルでもあります。</p>
<p>これらの理由から、可能な場合は完全一致名を利用するのがよいでしょう。例えば、もっとも頻繁にリクエストされるサーバ名が <em>nginx.org</em> と <em>www.nginx.org</em> だとすると、これらを明示的に定義するとより効率的です:</p>
<pre>server {
    listen       80;
    server_name  nginx.org  www.nginx.org  *.nginx.org;
    ...
}</pre>
<p>上記は次の単純化された形式を使用するよりも効率的です:</p>
<pre>server {
    listen       80;
    server_name  .nginx.org;
    ...
}</pre>
<p>たくさんの数のサーバ名を定義したり非常に長いサーバ名を定義したりする場合は、<em>http</em> レベルの “server_names_hash_max_size” と “server_names_hash_bucket_size” ディレクティブを調整する必要があるかもしれません。“server_names_hash_bucket_size” のデフォルト値は 32、もしくは 64、あるいはお使いの CPU キャッシュラインのサイズによってはその他の値になっているかもしれません。もしデフォルト値が 32 でサーバ名として“too.long.server.name.nginx.org” のような非常に長いサーバ名を定義している場合、nginx は起動に失敗し、次のエラーメッセージを表示させます:</p>
<pre>could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32</pre>
<p>この場合、このディレクティブの値を次の 2 の累乗にセットします:</p>
<pre>http {
    server_names_hash_bucket_size  64;
    ...</pre>
<p>非常にたくさんの数のサーバ名を定義した場合は次のエラーメッセージが表示されます:</p>
<pre>could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32</pre>
<p>まず最初に “server_names_hash_max_size” の値を、定義するサーバ名の数に近い数に設定して試します。この設定がうまくいかない時だけ、もしくは nginx の起動時間が許容できないほど長い場合だけ “server_names_hash_bucket_size” の値を増やしてみます。</p>
<p>待ち受けているポートがひとつだけでサーバもひとつだけの場合、nginx はサーバ名を考査しません（また、待ち受けポート用のハッシュも生成しません）。しかし一つ例外があります。“server_name” がキャプチャを伴った正規表現の場合、nginx はキャプチャを取得するためにこの正規表現を実行します。</p>
<p><strong id="Compatibility">互換性</strong></p>
<ul>
<li>0.8.48 以降、デフォルトのサーバ名の値は空の名前 “” です。</li>
<li>正規表現サーバ名の名前付きキャプチャのサポートは 0.8.25 からです。</li>
<li>正規表現サーバ名のキャプチャのサポートは 0.7.40 からです。</li>
<li>空のサーバ名 “” のサポートは 0.7.12 からです。</li>
<li>ワイルドカードサーバ名と正規表現の最初のサーバ名としての使用は0.6.25 からサポートされています。</li>
<li>正規表現サーバ名のサポートは 0.6.7 からです。</li>
<li>ワイルドカードの形式 nginx.* のサポートは 0.6.0 からです。</li>
<li>特別な形式 .nginx.org のサポートは 0.3.18 からです。</li>
<li>ワイルドカードの形式 *.nginx.org のサポートは 0.1.13 からです。</li>
</ul>
<p style="text-align: right;">文書作成: Igor Sysoev<br />
編集: Brian Mercer<br />
翻訳: <a href="http://www.digitalcube.jp/">DigitalCube Co. Ltd.</a><br />
監訳: <a href="http://dogmap.jp/">wokamoto</a></p>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-server-names/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nginx ドキュメント訳: nginx はどのようにリクエストを処理するか</title>
		<link>http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-how-nginx-processes-a-request/</link>
		<comments>http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-how-nginx-processes-a-request/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 08:57:30 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=174</guid>
		<description><![CDATA[nginx（Wikipediaの説明）のドキュメントの訳を始めました。ライセンスが不明なのですがオープン系と仮定してとりあえずここで公開し、ある程度量がまとまったら nginx の中の方に連絡をとって nginx サイト &#8230; <a href="http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-how-nginx-processes-a-request/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://nginx.org/">nginx</a>（<a href="http://ja.wikipedia.org/wiki/Nginx">Wikipediaの説明</a>）の<a href="http://nginx.org/en/docs/">ドキュメント</a>の訳を始めました。ライセンスが不明なのですがオープン系と仮定してとりあえずここで公開し、ある程度量がまとまったら nginx の中の方に連絡をとって nginx サイトに入れてもらいたいと考えてます。</p>
<p>あと、nginx のドキュメントは <a href="http://wiki.nginx.org/NginxJa">wiki</a> もありますが、表側はだいぶん訳されているようなのでこの<a href="http://nginx.org/en/docs/">ドキュメント</a>をまず訳してから、<a href="http://wiki.nginx.org/NginxJa">wiki</a>を訳していこうと思います。</p>
<p>で、今回は「<a href="http://nginx.org/en/docs/introduction.html">Introduction to nginx</a>（nginx 入門）」の「<a href="http://nginx.org/en/docs/http/request_processing.html">How nginx processes a request</a>（nginx はリクエストをどのように処理するか）」を訳しました。</p>
<p>***</p>
<p>nginx はどのようにリクエストを処理するか<br />
原文: <a href="http://nginx.org/en/docs/http/request_processing.html#simple_php_site_configuration">How nginx processes a request</a></p>
<ul>
<li><a href="#Name-based">名前ベースの仮想サーバ</a></li>
<li><a href="#prevent">サーバー名未定義のリクエストの処理を防ぐ</a></li>
<li><a href="#Mixed">名前ベースとIPベースをミックスした仮想サーバ</a></li>
<li><a href="#simple">単純な PHP サイトの設定</a></li>
</ul>
<p><strong id="Name-based">名前ベースの仮想サーバ</strong></p>
<p>nginx はまず最初にどの<em>サーバ</em>がそのリクエストを処理すべきなのかを決定します。手はじめに、３つすべての仮想サーバが port *:80 で待ち受けている単純な設定から見てみましょう:</p>
<pre>server {
    listen       80;
    server_name  nginx.org  www.nginx.org;
    ...
}

server {
    listen       80;
    server_name  nginx.net  www.nginx.net;
    ...
}

server {
    listen       80;
    server_name  nginx.com  www.nginx.com;
    ...
}</pre>
<p>この設定では nginx は、（ブラウザからの）HTTP リクエストの &#8220;Host&#8221; ヘッダだけを考査して、そのリクエストをどのサーバに振り向けるべきかを決定します。もし “Host” ヘッダがどのサーバ名ともマッチしない場合、またはリクエストにこのフィールドがまったく含まれていない場合は、nginxはこのリクエストをデフォルトサーバに振り向けます。上記の設定ではデフォルトサーバは最初のもので、これは nginx の標準的なデフォルトの挙動です。設定内の最初のサーバをデフォルトサーバにしたくない場合は、“listen” ディレクティブに “default_server” パラメータを使って明示的に設定することができます:</p>
<pre>server {
    listen       80  <strong>default_server</strong>;
    server_name  nginx.net  www.nginx.net;
    ...
}</pre>
<p>この “default_server” パラメータはバージョン 0.8.21 以上で利用できます。それ以前のバージョンでは代わりに “default” パラメータを使用してください。<br />
このデフォルトサーバは &#8220;listen&#8221; ディレクティブのプロパティで、&#8221;server_name&#8221; ディレクティブのプロパティではないことに注意してください。詳細は後述します。</p>
<p><strong id="prevent">サーバー名未定義のリクエストの処理を防ぐ</strong></p>
<p>“Host” ヘッダが未定義のリクエストを処理させたくない場合は、リクエストを単にドロップさせるデフォルトサーバを設定できます:</p>
<pre>server {
    listen       80  default_server;
    server_name  _;
    return       444;
}</pre>
<p>ここでは存在しないドメイン名 “_” をサーバ名として選択し、接続を閉じる nginx の特別な標準外コード 444 を返します。このサーバ用にサーバ名を設定しなければならないことに注意してください。さもなければ nginx はホスト名を使用します。</p>
<p><strong id="Mixed">名前ベースとIPベースをミックスした仮想サーバ</strong></p>
<p>異なるアドレスで待ち受けている仮想サーバのより複雑な設定をみてみましょう:</p>
<pre>server {
    listen       192.168.1.1:80;
    server_name  nginx.org  www.nginx.org;
    ...
}

server {
    listen       192.168.1.1:80;
    server_name  nginx.net  www.nginx.net;
    ...
}

server {
    listen       192.168.1.2:80;
    server_name  nginx.com  www.nginx.com;
    ...
}</pre>
<p>この設定では、nginx はまず最初に “server” ブロックの “listen” ディレクティブに対してリクエストの IP アドレスとポートを考査します。次に、その IP アドレスとポートにマッチする “server” ブロックの “server_name” ディレクティブに対して、その HTTP リクエストの “Host” ヘッダを考査します。もしサーバ名が見つからなければ、そのリクエストはデフォルトサーバによって処理されます。例えば、 192.168.1.1:80 ポートで受信された <em>www.nginx.com</em> へのリクエストは 192.168.1.1:80 ポートのデフォルトサーバ、つまり最初のサーバで処理されます。これはこのポートでは <em>www.nginx.com</em> は定義されていないからです。</p>
<p>すでに述べたように、デフォルトサーバは &#8220;listen&#8221; ディレクティブのプロパティで、&#8221;listen&#8221; ディレクティブには別のデフォルトサーバが定義されています。</p>
<pre>server {
    listen        192.168.1.1:80;
    server_name   nginx.org  www.nginx.org;
    ...
}

server {
    listen        192.168.1.1:80  default_server;
    server_name   nginx.net  www.nginx.net;
    ...
}

server {
    listen        192.168.1.2:80  default_server;
    server_name   nginx.com  www.nginx.com;
    ...
}</pre>
<p><strong id="simple">単純な PHP サイトの設定</strong></p>
<p>では、典型的で単純な PHP サイトで nginx がどのようにロケーション（location）を選択してリクエストを処理するのかを見てみましょう:</p>
<pre>server {
    listen        80;
    server_name   nginx.org  www.nginx.org;
    root          /data/www;

    location / {
        index     index.html  index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires   30d;
    }

    location ~ \.php$ {
        fastcgi_pass   localhost:9000;
        fastcgi_param  SCRIPT_FILENAME
                       $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}</pre>
<p>nginx はまず最初に、リストの順序には関係なくリテラルな文字列によって指定されているもっとも限定されたロケーションを検索します。上記の設定では唯一のリテラルなロケーションは “/” であり、したがってどのリクエストでもマッチして最終的にこのロケーションが使われます。次に nginx は、設定ファイルにリストされている順番で正規表現によって指定されているロケーションをチェックします。最初にマッチした正規表現で検索はストップし、 nginx そのロケーションを使用します。もしどの正規表現もリクエストにマッチしない場合は、nginx はその前に見つかったもっとも限定されたリテラルなロケーションを使用します。</p>
<p>すべてのタイプのロケーションはクエリー部分を除いたリクエスト URI 部分のみを考査することに注意してください。これはクエリー文字列の引数がいろいろな方法で渡されることがあるためです。例えば:</p>
<pre>/index.php?user=john&amp;page=1
/index.php?page=1&amp;user=john</pre>
<p>さらに、クエリー文字列ではどのようなリクエストでも可能だからです:</p>
<pre>/index.php?page=1&amp;something+else&amp;user=john</pre>
<p>では、上記の設定ではどのようにリクエストが処理されるのかを見てみましょう:</p>
<ul>
<li>リクエスト “/logo.gif” はリテラルなロケーション “/” に最初にマッチし、次に正規表現 “\.(gif|jpg|png)$” にマッチするので、後者のロケーションによって処理されます。 このリクエストは “root /data/www” ディレクティブを使用してファイル “/data/www/logo.gif” にマップされ、このファイルがクライアントに送られます。</li>
<li>リクエスト “/index.php” もまたリテラルなロケーション “/” に最初にマッチし、次に正規表現 “\.(php)$” にマッチします。したがって、このリクエストは後者のロケーションによって処理され、localhost:9000 で待ち受けている FastCGI サーバに渡されます。“fastcgi_param” ディレクティブは FastCGI のパラメータ SCRIPT_FILENAME を “/data/www/index.php” にセットし、この FastCGI サーバがこのファイルを実行します。変数 $document_root は “root” ディレクティブの値と同等で、変数 $fastcgi_script_name はリクエスト URI、例えば “/index.php” と同等です。</li>
<li>リクエスト “/about.html” はリテラルなロケーション “/” のみにマッチします。したがってこのロケーションで処理されます。このリクエストは &#8220;root&#8221; ディレクティブのパラメータ &#8220;/data/www&#8221; を使い、ファイル &#8220;/data/www/about.html&#8221; にマップされ、クライアントに送られます。</li>
<li>リクエスト “/” の処理はより複雑です。これはリテラルなロケーション “/” のみにマッチし、このロケーションで処理されます。ついで &#8220;index&#8221; ディレクティブがパラメータと &#8220;root&#8221; ディレクティブのパラメータ &#8220;/data/www&#8221; にしたがって index ファイルが存在するかどうかを考査します。もし “/data/www/index.php” ファイル存在すればこのディレクティブは “/index.php” への内部リダイレクトを実行し、nginx はまるでこのリクエストがクライアントに送られたかのようにこのロケーションを再び検索します。先に見たように、リダイレクトされたリクエストは最終的に FastCGI サーバで処理されます。</li>
</ul>
<p style="text-align: right;">文書作成: Igor Sysoev<br />
編集: Brian Mercer<br />
翻訳: <a href="http://www.digitalcube.jp/">DigitalCube Co. Ltd.</a><br />
監訳: <a href="http://dogmap.jp/">wokamoto</a></p>
<hr />
Nginx のインストール/パフォーマンスチューニングサービス<br />
Link: <a href="http://ja.ninjax.cc/" title="Eginx Enterprise Support" target="_blank">http://ja.ninjax.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-how-nginx-processes-a-request/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git を使った WordPress の開発</title>
		<link>http://neta.megumi-champloo.net/2011/06/27/developing-on-wordpress-using-git/</link>
		<comments>http://neta.megumi-champloo.net/2011/06/27/developing-on-wordpress-using-git/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 10:05:23 +0000</pubDate>
		<dc:creator>mahnmut</dc:creator>
				<category><![CDATA[小ネタ]]></category>

		<guid isPermaLink="false">http://neta.megumi-champloo.net/?p=133</guid>
		<description><![CDATA[WordPress コアの主要開発者のひとりの Mark Jaquith の書いた「Developing on WordPress using Git」の抄訳です。Git は私もほとんど使ったことないので、変なとこがあっ &#8230; <a href="http://neta.megumi-champloo.net/2011/06/27/developing-on-wordpress-using-git/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>WordPress コアの主要開発者のひとりの <a href="http://markjaquith.com/">Mark Jaquith</a> の書いた「<a href="http://markjaquith.wordpress.com/2011/05/26/developing-on-wordpress-using-git/">Developing on WordPress using Git</a>」の抄訳です。Git は私もほとんど使ったことないので、変なとこがあったら教えてください。</p>
<p>&nbsp;</p>
<blockquote><p>まず最初はツールです。もちろん Git は必要です。また、Subversion 互換 diff を生成する Bash スクリプトの git-svn-diff も必要になります。</p>
<ul>
<li><a href="http://git-scm.com/">Git</a></li>
<li><a href="https://gist.github.com/833214">git-svn-diff</a></li>
</ul>
<p>次のように、git-svn-diff をダウンロードしてパスの通っている任意の場所に置き、実行可能にします:</p>
<pre>
curl -L http://rkj.me/a1 &gt; /usr/local/bin/git-svn-diff
sudo chmod +x /usr/local/bin/git-svn-diff
</pre>
<p>次に、<code>git-svn-diff</code> ではなく<code>git svn-diff</code> を使えるようにするため、<code>~/.gitconfig</code> を編集して次を追加します:</p>
<pre>
[alias]
svn-diff = !git-svn-diff
</pre>
<p>次のステップは少し時間がかかります（ひと晩くらいかかるかも）。WordPress の SVN 履歴を Git の SVN サポートを利用してプルダウンします。</p>
<pre>
git svn clone -t tags -b branches -T trunk http://core.svn.wordpress.org/
</pre>
<p>終了したら、Git マスターブランチに入ります。これは WordPress SVN の trunk に対応します。WordPress のブランチは<code>remotes/{name}</code>に有ります。</p>
<p>SVN からの最新の変更をプルするには <code>git svn rebase</code> を使います。重要なルール: SVN ブランチ（<code>remotes/{name}</code>）は決して修正しないこと。代わりに新しいトピックブランチを作成します。</p>
<p>例えば、trunk 向けのあるチケットの作業をするとします。次のように<code>remotes/trunk</code> から新しいブランチを作ります:</p>
<pre>
git checkout -b ticket-12345 remotes/trunk
</pre>
<p>こうすると、SVN の trunk をベースにした <code>ticket-12345</code> という名称の新しいローカルの Git ブランチが作成されますので、それをチェックアウト（言い換えれば、それにスウィッチ）します。</p>
<p>WordPress SVN ブランチで作業する場合は次のようになります:</p>
<pre>
git checkout -b ticket-12345 remotes/3.1
</pre>
<p>作成したブランチで作業します。必要なら、複数のローカル Git コミットを作成できます。こうすれば、自分にとって意味のあるより小さな「かたまり」に作業を分けることができます。</p>
<p>パッチを送る準備ができたら、git-svn-diff を使ってパッチを生成します。</p>
<pre>
git svn-diff &gt; ~/12345.diff
</pre>
<p>もしコミットアクセス権があるのなら、このトピックブランチから Subversion にコミットできます。とはいえ、気をつけてください！最初に <code>git svn rebase</code> を実行して自分のパッチを最新にしてください。次に、自分のローカルの git コミットを潰しておいてください。さもないとすべての各コミットが SVN に個別にコミットされてしまうからです。次のようにして、自分の複数のコミットを一つのコミットに rebase してください:</p>
<pre>
git rebase -i remotes/trunk
</pre>
<p>最初のコミットには “reword” を使用します。それに続くコミットには “fixup” を使用します。こうすると複数のコミットを一つにまとめることができます。そして、統合したコミット用に修正したコミットメッセージを入力するよう指示されます。</p>
<p>準備できましたか？これで次のように SVN にコミットできます:</p>
<pre>
git svn dcommit
</pre>
<p>Git には、そのトピックブランチがいつチェックアウトされたのかによって、そのコミットがどの SVN ブランチから来たのかが分かります。そのコミットがどれにアタッチされているのかを確認するには次のようにします:</p>
<pre>
git svn info
</pre>
<p>いくつかヒント:</p>
<p><code>.gitignore</code> ファイルを作成してください。ここには Git に無視させたいファイルやディレクトリをリストアップします。まず最初に、<code>.gitignore</code> ファイル自身を無視させます！次に、ローカルの <code>wp-config.php</code> を無視させます。最後に、追加のプラグイン、必ず使用するプラグイン、テーマ、アップロードファイルなどなど。<code>git status</code> を実行し、WordPress や 自分のパッチにコミットしたくないものをすべて追加します。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://neta.megumi-champloo.net/2011/06/27/developing-on-wordpress-using-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

