FAT47の底辺インフラ議事録

学んだことのメモ帳です

nginxでLDAP認証いれたらめっちゃ遅くなった話

静的コンテンツ配信の為だけのサーバでnginxを利用。
公開前のサーバだったのでLDAPの認証をかけて確認したところ、

cssとかjsとか画像ファイルとかの静的ファイルの応答時間が10秒かかって、
HTTPステータスコード000になるという状態になった。

/var/log/nginx/access.log

24**:****: - hoge_fuga [30/Jul/2014:13:53:48 +0900] "GET /pc/ HTTP/1.1" 200 2244 "http://[24**:****:]/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko Firefox/28.0" "-" 0.005
24**:****: - hoge_fuga [30/Jul/2014:13:53:50 +0900] "GET /img/header.png HTTP/1.1" 000 0 "http://[24**:****:]/pc/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko Firefox/28.0" "-" 10.002

nginxでLDAP認証いれた設定
/etc/nginx/nginx.conf

http { の中に
    ldap_server nd {
    url ldap://hogehoge-ldap.jp/ou=nd,dc=fugafuga,dc=co,dc=jp?uid?sub;
    require valid_user;
    }

server { の中に
    auth_ldap "LDAP";
    auth_ldap_servers nd;

LDAP認証を外したり、.httpasswdファイルを置いたBasic認証だと上記の状況にはならなかった。

nginx-auth-ldapソースコードには10000ms(10秒)のタイムアウト指定されていた
ngx_http_auth_ldap_module.c

ログ上の10秒後に応答帰ってくるのはこれが原因ぽい。

そしてこちらを見ると以下の様な設定がnginxで必要。
Module does no result-caching... slows down all web requests?


これがないとすべてのリクエストにLDAPの認証が毎回走ってしまうようだ。

auth_ldap_cache_enabled on;
auth_ldap_cache_expiration_time 10000;
auth_ldap_cache_size 1000;

auth_ldap_cache_expiration_timeとauth_ldap_cache_sizeに関しては、デフォルト値の設定があるようなので指定しなくても動作しそう。

なので、設定ファイルのhttp部に追加する。
/etc/nginx/nginx.conf

http {
.
.
.
    auth_ldap_cache_enabled on;

ログ確認

24**:****: - hoge_fuga [30/Jul/2014:13:55:45 +0900] "GET /pc/ HTTP/1.1" 200 2244 "http://[24**:****:]/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko Firefox/28.0" "-" 0.001
24**:****: - hoge_fuga [30/Jul/2014:13:55:45 +0900] "GET /img/header.png HTTP/1.1" 200 229015 "http://[24**:****:]/pc/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko Firefox/28.0" "-" 0.003

やったぜ速いぜ!

今までApache+LDAPでこの問題に遭遇したことなかったけど、
確認してみるとApacheではデフォルトでLDAPのキャッシュ有効になっていたようだ。
http://httpd.apache.org/docs/2.4/mod/mod_ldap.html#ldapopcacheentries


Apache大好き。