1. Qiita
  2. 投稿
  3. nginx

[Nginx] Nginx + ngx_mruby で BASIC 認証の On/Off を即座に切り替える

  • 3
    いいね
  • 0
    コメント

Nginx でメンテナンスページの On/Off をファイルの有無によって切り替える方法としては、以下の URL で紹介されているような方法などがあります。
Nginxでメンテナンスページに編集なしで即時切り替える方法

ただ、上記の方法だと IP 制限でしか制限できないため確認者の IP アドレスが制限できない場合にちと困ります。
IP 制限の所を BASIC 認証に置き換えたくても if ($maintenance = true) { auth_basic ... } のように if の中に auth_basic ディレクティブを書こうとすると、無情にも nginx: [emerg] "auth_basic" directive is not allowed here とかって怒られてしまいます。

そんな時のために僕らには ngx_mruby があるのですよ。

以下のように satisfy any と組み合わせることで /etc/nginx/.htpasswd ってファイルがある時は、BASIC 認証を有効にし、ファイルが無い時は BASIC 認証を無効にすることが可能です。

    satisfy any;
    mruby_access_handler_code '
        if ( !File.exist?("/etc/nginx/.htpasswd") ) then
            Nginx.return Nginx::OK
        else
            Nginx.return Nginx::HTTP_FORBIDDEN
        end';
    auth_basic "basic authentication";
    auth_basic_user_file /etc/nginx/.htpasswd;

もちろん mruby_access_handlert_code ディレクティブの中で File.exist で存在確認するファイルを .htpasswd ではなく、/var/tmp/do_maintenace とかのファイルしてもいいでしょう。

[PR]
AMIMOTO だと、簡単に ngx_mruby モジュールを追加できますよ。
AMIMOTO AMI の nginx がダイナミックモジュール版 ngx_mruby に対応しました | 超高速 WordPress AMI AMIMOTO