Nginxで同一IPからのコネクションを制限する

limit_conn_zone ディレクティブと limit_conn ディレクティブを使う。
ここのページが参考になった。

 cf. http://wiki.nginx.org/HttpLimitConnModuleJa

まずはゾーンの設定。これは制限の対象を何にするかの定義みたい。/etc/nginx/nginx.conf の http セクションの中で定義する。こんな感じ。

limit_conn_zone $binary_remote_addr zone=addr:2m;

$binary_remote_addr という変数は Nginx に標準で定義されている変数で、アクセスして来たクライアントのIPアドレス(バイナリ)が入っている。これをキーにしている、つまり制限の対象にしているわけだ。で、その設定に、addr という名前をつけている。2m と書いてあるのは、キーを保存するためのメモリーを確保しているみたい。

さて、次は実際に制限を設定するほう。例えば、vhost.example.com というバーチャルホストに対するアクセスを制限したければ、/etc/nginx/sites-enabled/vhost.exmaple.com の
server セクションに次のように設定する。

limit_conn addr 1;

これで、同一IPからのコネクションを同時に1つだけに制限できる。

なんか情報が少なくて自信がないけど、EC2 で動かしてるサーバーで試してみたら、ちゃんと制限されて2つ目のコネクションには 503 が帰ってきたので、多分あってる。