tumblrスマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。読者です読者をやめる読者になる読者になるtumblrtumblr(タンブラー)は、メディアミックスブログサービス。ブログとミニブログ、そしてソーシャルブックマークを統合したマイクロブログサービスである。Inc.)により2007年3月1日にサービスが開始された。最近話題のnginxについに手を出したのですが、「nginx入門」みたいなブログ記事も一切見当たらず、あるのは英語のドキュメント記事くらい...という状況だったので、自分なりに訳して理解した部分を忘れないよう覚書。今node.jsもちょこちょこやっているのですが、これまた物凄い勢いで開発が進む上に、その情報のほとんどは英語なわけでやはりもうホントに英語が読めないとどうしようもないんだなぁと実感しているわけです。stackoverflowとか見ててもそこまで難しい文法使ってるわけでもないので、英語を見た瞬間に拒否反応起こしたりしなきゃなんとかなりそうですが。「毎度毎度ブログ長すぎ死ね」とはてブのコメントで話題の僕のブログ、今日も長いです。nginxってそもそもどう読むんだよ「エンジンエックス」と読みます。すごくかっこいいです。apacheとかtomcatとかnginxとか、サーバは何故こんなにもかっこいい名前をしているんでしょうか。公式ページには以下のような概要。とリバースプロキシのサーバで、メールプロキシサーバでもあります。含むロシアの多くの高負荷サイトで5年以上も動いています。人気サイトでサーバーとして、もしくはプロキシとして利用されています。http://nginx.org/ja/という感じでプロキシサーバとしての用途が多いようです。apacheがprefork形式で何もしてなくてもやたらとメモリを消費するのに比べ、nginxはnode.jsと同じくイベント駆動アーキテクチャを使用しているのでメモリ使用量が少なくて済むために、メモリ使用量の限られるVPSサーバで使われることも多いみたいです。wordpressとかapacheで動かしたらメモリ512Mじゃ足りなそうで怖いんですよね。間に位置する中間サーバです。コンテンツが取得できればそれをクライアントに返します。特別にそれ用の設定をしなければなりません。キャッシュ機能を用いることもできます。ウェブサーバのように見えます。クライアント側に特別な設定は必要ありません。リクエストを行ないます。コンテンツを返します。ファイアウォールの中にあるサーバにアクセスを与えるというものです。空間にまとめるために使うこともできます。http://httpd.apache.org/docs/2.1/ja/mod/mod_proxy.htmlプロキシサーバは2種類あって、まず1つ目がフォワードプロキシ。会社に置かれてますが、社内LANからインターネットやメールを送る際はプロキシサーバに必ずそのリクエストを送り、プロキシサーバがそのリクエストに対するレスポンスを代理(proxy)で取得してくるというようなわけです。1度取得したページをキャッシュするためにリクエストを減らすことができたり、内部からのリクエストをプロキシサーバが受けたときにフィルタリングして特定ページへのリクエストは弾くということもできます。2つ目のリバースプロキスはそのまんまフォワードの逆なのですが、アクセスを受けるアプリケーションサーバなどの前に置き、一度不特定多数の利用者からのリクエストを全て受けてから適宜APサーバへリクエストを振ります。同じ機能のAPサーバが複数台ある場合はそれらにうまいことアクセスを振り分けるロードバランサの役割を果たし、また前述のようなキャッシュサーバとして一度APサーバから取得したコンテンツを返すことも出来ます。インストールするとりあえずはHTTPサーバとしてちゃんと動いて、プロキシサーバとしても動くことを確認できるようにしてみましょう。apacheの場合、インストール後にモジュールを追加することになっても設定ファイルにそのモジュールのパスを入れて再読込とかすればうまくいくのですが、nginxの場合はモジュールを追加する場合はビルドしなおす必要があります。この記事での最終的な目的としてwebsocket(socket.io)のプロキシサーバとしても使えるようにしたいわけなんですが、現時点ではnginxはwebsocketをサポートしていないためモジュールを追加する必要があるわけです。最新安定版のsrcをダウンロードします。一応このページの下の方にはビルド済のrpmがあります。nginx-1.0.11ダウンロード〜解凍までできたらコンパイルですが、この時コンパイルオプションに必要なモジュールを指定します。nginx_tcp_proxy_module/tcp.patchここでやっとコンパイル出来ます。モジュールが必要ならばオプションが必要です。maketcpモジュール用のオプション以外にも色々と指定が出来ます。こちらのが詳しいので以下参照http://wp.serpere.info/archives/1799※ログやtmpファイルのパスを変える場合はそのディレクトリも作っておいてください。これができたらインストールです。僕はこの時点でソースインストールしたものを管理するためにpacoを使っています。http://d.hatena.ne.jp/rx7/20081011/p2全然どうでもいいですが、「paco」で検索すると全く関係ないよく分からない単語がインクリメントサーチに出てくるのでドキドキします。不敬罪で逮捕されたりしませんように。installこれでインストールが完了しました。あるので、もっとたたきやすい場所にシンボリックリンクを張って、起動してみます。いう文字が出てくるはずです。起動スクリプトが欲しい場合はhttp://shiken.infrabu.info/nginx/nginx%E3%82%92%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%EF%BC%88%EF%BC%8B%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A%EF%BC%89/を参照。僕はyumで一旦インストールして起動スクリプトなどを作らせてremoveしてからソースインストールという荒業を使いました。設定をしてみる設定をしてみます。nginxの設定ファイルはcontextと呼ばれるブロックの階層構造になっており、より大きいブロックの設定値がデフォルト値として下方のブロックに伝わります。登場するcontextは以下の3つです。httpserverlocationうえから順番に影響力が強いです。実際には以下のような構造となって設定ファイルに書かれます。}}大まかにはhttpにはnginxの全体的な設定、serverにはバーチャルホストやlistenポート、locationにはリクエストURLのパスをどう扱うかという感じのことを書きます。ネストが深くなるほど、詳細な部分を書いていく感じです。apacheと同じくディレクティブによって設定を記述します。contextによってはこのディレクティブは使えないということがあるので、どのディレクティブが使えるかはwikiを見てください。基本ほとんどのことはnginxのwikiを見れば分かります。http://blog.martinfjordvald.com/2010/07/nginx-primer/にあるサンプルを見てみましょう。/home/domain.com}バーチャルホストが2つある設定です。何か適当なサブドメインを付けてリクエストされたときにマッチします。下のブロックではwww.domain.comにマッチした場合の設定です。nginxではより詳細なマッチが優先されるので、www.domain.comでアクセスした場合は下のブロックに行きます。redirect)を行います。下のブロックのindexはapacheで言うところのdirectoryIndexに、rootはServerRootになります。いう感じで割とスッキリと設定ができるわけです。リバースプロキシの設定つぎはリバースプロキシの設定をしてみます。最初に出した例のように、localhost宛に来たリクエストを別のマシン(192.168.1.1)に送るよう設定します。}}とりあえずはこれだけの記述でリバースプロキシを設定することができます。この場合はlocalhost/に来た全てのリクエストを192.168.1.1に投げています。リバースプロキシに必要な設定は実際はこれだけではないと思います。その場合はwikiのproxyモジュールにあるディレクティブを参考に設定してください。wikiのfullexampleでは、proxy用の設定ファイルを作りそれをnginx.confのほうでincludeしています。4k;各ディレクティブの意味はwikiを参照してください。$hostなど$のつくものは組み込み変数です。上の方で書いたように、リバースプロキシはロードバランサとしての役割も果たします。wikiのfullexampleを参考にしてアクセスを振り分ける方法を見てみます。いうサーバ群に投げます。これはどこに設定されているかというと、serverブロックの上のupstreamブロックに設定されています。upstreamブロック内のserverディレクティブによって示されるIPアドレスをもつサーバにリクエストが振り分けられます。このupstreamブロック内でのserverディレクティブはロードバランス時の設定も同時に書くことが出来ます。ある回数のリクエストがあった場合、デフォルト値を1としてどのくらいの割合で各サーバにリクエストを振り分けるかを指定します。こんな感じに設定を行っていくわけです。apacheの場合、設定ファイルに最初から長ったらしいコメントがズラズラと書かれていて平気で1000行とか超えるためにもの凄く見にくいのが不満でしたが、nginxの場合は特にそのようなこともなくスッキリと書けるのが魅力的に思います。あとsocket.ioのリバプロ設定方法もいつか書きます。*1:SRPM以外でもビルドできる方法ってあるんでしょうか?詳しい方教えてください。