nginx で Basic認証を一部のディレクトリにかける

WordPress を運用していると一部のディレクトリに Basic認証(Basic Authentication)をかけたいときがある
例えば hoge.com/wp-login.phphoge.com/wp-admin/~ などそういった時のメモ

1. /etc/nginx に移動

$ cd /etc/nginx

2. 出力先のディレクトリオーナーが root になっているのでteeコマンドを使ってリダイレクトする

$ printf "USER:$(openssl passwd -crypt PASSWORD)\n" | sudo tee .htpasswd

USER がユーザー名, PASSWORD がパスワード

3. .confファイルに .htpasswd へのパスを指定

例えば hoge.com/wp-login.phphoge.com/wp-admin/~ の場合は /PATH/ のところを /admin/ にしておけばできる

$ sudo vim /etc/nginx/sites-available/hoge.com.conf
server {
    listen       80;
    server_name  hoge.com;
    root /var/www/hoge.com/root/htdocs/;
    index index.html index.php;
    access_log      /var/log/nginx/hoge.com.access.log;
    error_log       /var/log/nginx/hoge.com.error.log;

    location / {
            index  index.php index.html index.htm;
            try_files $uri $uri/ /index.php?$uri&$args;
    }

    location ~ \.php$ {
            fastcgi_pass  unix:/var/run/php5-fpm.sock;
            fastcgi_index   index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
    }

    location /PATH/ {
      auth_basic "admin only";
      auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

4. nginx を再起動して設定を反映させる

sudo service nginx restart

終わり