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大好き。