bokko bokkoにしてやんよ

A infrastructure and software engineer's blog

nginx moduleをつくろう その1〜Hello, World〜

ここのところ、よくnginxのモジュールを開発してたりするので個人的なメモも兼ねてnginxの開発方法や勘所的なものを紹介していこうかと思います。

で、まずは定番のHello, Worldから。ソースコードはgithubにあります。

ngx_http_hello_world〜Hello, World with nginx〜

今回はとりあえず最初ということもあるので内部動作の解説は特にせず、単に以下のように「Hello, World!」を出力する上記のモジュールを ビルド & 動作確認する方法について解説します。ディレクティブの定義とかは次回以降に。

1
2
3
4
5
6
7
8
9
10
$ curl -l "http://127.0.0.1:80/hello_world"
<!DOCTYPE html>
<html>
<head>
<title>Hello, World with nginx!</title>
</head>
<body>
<p>Hello, World!</p></body>
</html>
$

nginxモジュールのビルド

nginxのモジュールはApacheと違って動的モジュールがサポートされていないので、nginx本体と一緒にビルドして静的に組み込む必要があります。 なのでまずはnginxnのソースコードを取ってきてアーカイブを展開しましょう。2013年1月時点の最新版(安定版)は1.2.6です。

1
2
$ wget http://nginx.org/download/nginx-1.2.6.tar.gz
$ tar zxvf nginx-1.2.6.tar.gz

次に拙作のngx_http_hello_worldモジュールをgithubから落としてきます。

1
$ git clone git://github.com/cubicdaiya/ngx_http_hello_world.git

準備ができたのでnginx本体と一緒にビルド&インストールします。組み込むモジュールはconfigure実行時に–add-moduleで指定することができます。(変数名は適宜環境に合った値を入れてください)

1
2
3
4
$ cd ${nginx_src_dir}
$ ./configure --with-pcre --add-module=${ngx_http_hello_world_dir}
$ make
$ sudo make install

ビルド & インストールができたら設定ファイルの適当な箇所に以下の設定を記述します。

1
2
3
location ~ /hello_world$ {
    hello_world;
}

これでURLのパスがhello_worldに一致した場合、hellow_worldディレクティブが有効になり、nginxが以下のようにレスポンスを返してくれます。

1
2
3
4
5
6
7
8
9
10
$ curl -l "http://127.0.0.1:80/hello_world"
<!DOCTYPE html>
<html>
<head>
<title>Hello, World with nginx!</title>
</head>
<body>
<p>Hello, World!</p></body>
</html>
$

ngx_http_hello_world自体は非常に短い単純なソースコードになっているので、Cを書いたことのある人ならとりあえず上記の実行結果の確認に加えて これを読むだけでなんとなく雰囲気はつかめるのではないかと思います。また、Apacheモジュールを書いたことのある人なら割とすんなり入れるでしょう。