nginx + passengerでBasic認証

nginx + passengerで、/admin以下のみBasic認証しようとnginx.confに以下の記述をしましたが、/admin以下にアクセスすると全てNot Foundになってしまいました。

    server {
        listen       80;
        server_name  example.com;
        root         /var/www/example.com/rails/public;
        passenger_enabled on;

        location /admin/ {
            auth_basic "Staff Only";
            auth_basic_user_file "/var/www/example.com/htpasswd";
        }
   }

nginxデフォルトの404画面が表示されるので、リクエストがpassengerに渡されていないと推測されます。そこで location /admin/ に passenger_enabled on を設定すれば動くのでは?と思って試したところ上手くいきました。

    server {
        listen       80;
        server_name  example.com;
        root         /var/www/example.com/rails/public;

        location / {
            passenger_enabled on;
        }

        location /admin/ {
            passenger_enabled on;
            auth_basic "Staff Only";
            auth_basic_user_file "/var/www/example.com/htpasswd";
        }
   }

Basic認証よりDigest認証が良いのですが、残念ながらnginxはまだDigest認証に対応していません。

nginxのBasic認証のパスワードファイルはApache互換で、htpasswdコマンドで作成することができます。Ubuntuではapache2-utilsパッケージに入っており、Apache本体をインストールする必要はありません。