2026年8月10日
2026年8月10日
NginxでBasic認証を設定する方法|htpasswdの作成・ディレクトリ保護・WordPressのログイン画面
Basic認証は、ページを開く前にブラウザーのダイアログでユーザー名とパスワードを求める仕組みです。Nginx では標準の ngx_http_auth_basic_module で設定でき、開発中のサイトや管理画面への入口を手軽に絞り込めます。
この記事の設定とコマンドは、nginx.org の公式ドキュメント(ngx_http_auth_basic_module)で2026年10月時点の内容を確認し、nginx 1.30 の検証環境で動作を確かめています。
Basic認証の仕組みと注意点
- ブラウザーは、ユーザー名とパスワードを Base64 で符号化して
Authorizationヘッダーで送ります。Base64 は暗号化ではないため、HTTPS と組み合わせて使ってください。HTTP のままだと通信経路で読み取られます。 - ログアウトの機能はありません。ブラウザーを閉じるまで認証情報が保持されるのが一般的です。
- 不特定多数のユーザー管理には向きません。少人数で入口を絞る用途に使います。
手順1: htpasswd コマンドを用意する
パスワードファイルは Apache の htpasswd コマンドで作るのが一般的です。Nginx だけの環境ではコマンドが入っていないことがあるので、パッケージを追加します。
# Debian / Ubuntu
sudo apt update
sudo apt install apache2-utils
# RHEL / AlmaLinux / Rocky Linux
sudo dnf install httpd-tools
htpasswd を入れたくない場合は、openssl passwd でも Nginx が読める形式(apr1)のハッシュを作れます(手順2の後半)。
手順2: パスワードファイルを作る
# 新しくファイルを作り、ユーザー alice を登録する(パスワードは対話で入力)
sudo htpasswd -c /etc/nginx/.htpasswd alice
# 2人目以降は -c を付けない(-c はファイルを作り直すので既存の登録が消える)
sudo htpasswd /etc/nginx/.htpasswd bob
# ユーザーを削除する
sudo htpasswd -D /etc/nginx/.htpasswd bob
htpasswd のほかのオプションはhtpasswdでApacheのBasic認証パスワードを作成する方法でも説明しています。ファイルは ユーザー名:パスワードのハッシュ が1行ずつ並ぶ形式です。htpasswd の既定のハッシュは Apache 版の MD5 方式(apr1)で、Nginx はこの形式と crypt() 形式などを読めます。
openssl で作る場合は次のようにします。
# パスワードを対話で入力し、apr1 形式で1行追記する
printf 'alice:%s\n' "$(openssl passwd -apr1)" | sudo tee -a /etc/nginx/.htpasswd
ファイルは Nginx のワーカープロセス(Debian / Ubuntu では www-data、公式パッケージや RHEL 系では nginx)が読める必要があります。ほかのユーザーからは読めないようにしておきます。
# Debian / Ubuntu の場合
sudo chown root:www-data /etc/nginx/.htpasswd
sudo chmod 640 /etc/nginx/.htpasswd
パスワードファイルは公開ディレクトリ(root で指定した場所)の外に置いてください。
手順3: Nginx の設定に auth_basic を追加する
保護したい範囲の location に、2つのディレクティブを書きます。
server {
listen 443 ssl;
server_name example.com;
root /var/www/example.com;
# /admin-area/ 以下にBasic認証をかける
location /admin-area/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
| ディレクティブ | 内容 |
|---|---|
auth_basic |
認証を有効にし、文字列を realm(認証領域の名前)として送る。off で上位の設定から引き継いだ認証を解除する |
auth_basic_user_file |
パスワードファイルのパス |
どちらも http・server・location・limit_except に書けます。server に書くとサイト全体が対象になります。
一部のパスだけ認証を外す
サイト全体に認証をかけ、特定の場所だけ外したいときは auth_basic off; を使います。
server {
# サイト全体に認証をかける
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
# /public/ 以下は認証なしで開ける
location /public/ {
auth_basic off;
}
}
手順4: 設定を確認して反映する
# 構文を確認する
sudo nginx -t
# 問題がなければ再読み込みする
sudo systemctl reload nginx
nginx -t でエラーが出た場合は、表示されたファイル名と行番号を直してから再読み込みします。
手順5: 動作を確かめる
ブラウザーで保護したURLを開き、ダイアログが表示されることを確認します。curl を使うと応答コードで確かめられます。
# 認証情報なし → 401 が返る
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/admin-area/
# 正しいユーザー名とパスワード → 200 が返る
curl -s -o /dev/null -w '%{http_code}\n' -u alice https://example.com/admin-area/
-u alice とするとパスワードを対話で聞かれます。ログインできないときはエラーログを見ます。
sudo tail -n 50 /var/log/nginx/error.log
| エラーログの内容 | 主な原因 |
|---|---|
user "…" was not found in "…" |
パスワードファイルにそのユーザーが無い |
user "…": password mismatch |
パスワードが違う |
open() "…" failed (13: Permission denied) |
Nginx のワーカーがパスワードファイルを読めない |
open() "…" failed (2: No such file or directory) |
auth_basic_user_file のパスが違う |
IPアドレス制限と組み合わせる
社内のIPアドレスからは認証なしで開け、それ以外からはパスワードを求める、という設定は satisfy any で書けます。
location /admin-area/ {
satisfy any;
allow 192.0.2.10; # このIPアドレスからは認証なしで許可
deny all;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
satisfy any はどちらかの条件を満たせば許可、satisfy all(既定値)は両方を満たす必要があります。詳しくはNginxでBasic認証とIPアドレス制限を組み合わせる方法で説明しています。
WordPress のログイン画面を保護するときの注意
WordPress の wp-login.php に Basic認証をかける場合、location = /wp-login.php のように個別の location を作ると、その中に PHP を実行する設定も書く必要があります。認証の設定だけを書くと、PHP が実行されずにファイルがそのままダウンロードされたり、404 になったりします。
location = /wp-login.php {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
# PHP-FPM に渡す設定(Debian / Ubuntu の nginx パッケージと PHP 8.3 の例)
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
fastcgi_pass のソケットのパスは、サーバーで使っている PHP-FPM の設定に合わせてください。/wp-admin/ 全体を保護すると、/wp-admin/admin-ajax.php を使うプラグインやテーマが訪問者側で動かなくなることがあります。/wp-admin/ を対象にする場合は、admin-ajax.php を認証の対象から外すか、ログイン画面だけを保護するかを検討してください。
まとめ
htpasswd -cでパスワードファイルを作り、2人目以降は-cを付けずに追加する。- 保護したい範囲に
auth_basicとauth_basic_user_fileを書き、nginx -tで確認してから再読み込みする。 - 一部だけ外すときは
auth_basic off;、IPアドレス制限と組み合わせるときはsatisfy anyを使う。 - Basic認証のパスワードは暗号化されずに送られるため、HTTPS と組み合わせる。