nginx 環境で WordPress を運用していると、避けて通れないのが /wp-login.php への総当たり攻撃(ブルートフォースアタック) です。
セキュリティ向上のためにログイン URL を変更しようとした際、以下のような壁にぶつかったことはないでしょうか?
- 「SiteGuard WP Plugin」などの定番プラグインを入れても、ログイン URL の変更が反映されない。
- ネットの情報を真似て nginx の設定をいじったら、ログアウト時に「404 Not Found」エラーが出るようになってしまった。
実は、多くのセキュリティプラグインは Apache の .htaccess を前提としているため、nginx 環境では正常に動作しないケースが多々あります。
この記事では、Ubuntu Server 24.04 + nginx 環境において、プラグインに頼らず設定ファイル(conf)を編集して、安全かつ確実にログイン URL を変更・隠蔽する方法を解説します。 nginx 特有のハマりポイントである「ログアウト時の 404 エラー」も回避する、検証済みの設定コードを紹介します。
※なお、この記事の内容は、筆者の環境で検証していますが、環境が異なると挙動が異なることはよくありますので、この記事の内容を筆者が保証するものではないことをあらかじめご承知おきください。
なぜプラグインではなく nginx 側で設定するのか
多くのセキュリティプラグインは、Apache の .htaccess を書き換えることで URL を制御します。しかし、nginx は .htaccess を読み込みません。
そのため、Web サーバーである nginx 側で「どの URL が来た時にどのファイルを動かすか」を直接指示するのが、最も確実でパフォーマンスの高い方法となります。
今回の設定では、以下の3つの挙動を実現します。
- 新URL(例:/my-new-login):ここからのみログイン画面を表示する。
- 旧URL(/wp-login.php):直接アクセスすると「404 Not Found」を返して隠蔽する。
- ログアウト時:エラーにならず、自動的に新URLのログイン画面に戻る。
事前のバックアップと設定ファイルの特定
万が一、設定ミスでサイトが表示されなくなった場合に備え、必ず現在の設定ファイルをバックアップしておきましょう。
設定ファイルの場所を確認する
通常、/etc/nginx/sites-enabled/ 内に有効な設定ファイルへのリンクがあります。
ls -l /etc/nginx/sites-enabled/
バックアップを実行する
(例として、設定ファイル名を example とします。ご自身の環境に合わせて読み替えてください)
sudo cp -a /etc/nginx/sites-available/example /etc/nginx/sites-available/example.bak.$(date +%F_%H%M%S)
nginx 設定ファイルの編集(完全版)
設定ファイルをエディタで開き、ログイン URL を制御するコードを追加します。
sudo nano /etc/nginx/sites-available/example
追記する設定コード
HTTPS(443 ポート)側の server {} ブロック内に記述します。 他の location ~ \.php$ の設定よりも 上 に書くことで、優先的に適用させます。
※コード内の /my-new-login は、お好きな「秘密のURL」に書き換えてください。
# --- Custom login URL for WordPress (nginx) ---
# 1) 新ログインURL:自分専用の入り口(例:/my-new-login)
# 「/my-new-login」の部分は、推測されにくい好きな文字列に変更してください
location = /my-new-login {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
# 内部的に wp-login.php を実行させる記述です
# ※ /var/www/example の部分は、実際のWordPress設置パスに合わせて修正してください
fastcgi_param SCRIPT_FILENAME /var/www/example/wp-login.php;
fastcgi_param SCRIPT_NAME /wp-login.php;
}
# 2) 旧URL (wp-login.php) へのアクセス制限
location = /wp-login.php {
# -----------------------------------------------------------
# A. ログアウト完了後のリダイレクト
# -----------------------------------------------------------
# ログアウト直後は「?loggedout=true」が付くため、これを検知して
# 新しいログインURLへ転送します(これがないと404エラーになります)
# ※ここも自分の決めた新URLに合わせてください
if ($arg_loggedout = "true") {
return 302 /my-new-login?loggedout=true;
}
# -----------------------------------------------------------
# B. アクセス許可判定(フラグ方式)
# -----------------------------------------------------------
# nginxのif文には制約が多いため、まずは「許可しない(N)」フラグを立てます
set $allowed "N";
# 1. ログインボタンを押した時の送信(POST)なら許可
if ($request_method = POST) { set $allowed "Y"; }
# 2. ログアウトを実行する処理(?action=logout)なら許可
if ($arg_action = "logout") { set $allowed "Y"; }
# -----------------------------------------------------------
# C. 拒絶処理
# -----------------------------------------------------------
# 許可フラグが立っていなければ、攻撃者とみなして 404 エラーを返します
if ($allowed = "N") {
return 404;
}
# -----------------------------------------------------------
# D. PHP実行処理
# -----------------------------------------------------------
# 許可されたアクセス(POSTやログアウト)のみ、ここでPHPを実行します
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
設定内容の詳しい解説
今回の設定で特に重要なポイントは以下の2点です。
- ログアウト対策(フラグ方式)
- 単に
wp-login.phpを 404 にしてしまうと、ログアウトしようとした瞬間にエラーになってしまいます。 - そこで、「POSTメソッド(ログイン送信)」と「action=logout(ログアウト処理)」の時だけ
$allowed変数を “Y” にし、それ以外を 404 にするロジックを組んでいます。 if文の中で直接PHPを実行しようとするとnginxのエラー(fastcgi_split_path_info関連)が出るため、一度変数(フラグ)を経由させるのが鉄則です。
- 単に
- 新URLの仕組み
/my-new-loginという仮想のURLにアクセスすると、裏側でwp-login.phpが動くようにfastcgi_paramで指定しています。これにより、ファイル名を変更することなく入り口だけを変えることができます。
設定の反映と確認
設定を保存(Ctrl+O, Enter)し、エディタを終了(Ctrl+X)したら、設定を反映させます。
構文チェック
エラーが出ないことを確認してください。もし unknown directive などのエラーが出る場合は、スペルミスや } の閉じ忘れがないか確認しましょう。
sudo nginx -t
設定のリロード
sudo systemctl reload nginx
動作確認
最後に、ブラウザ(シークレットウィンドウ推奨)を使って挙動を確認します。
- 新URL(/my-new-login)にアクセス
- ログイン画面が表示されますか?
- IDとパスワードを入れて、正常にログインできますか?
- ログアウトの確認
- 管理画面からログアウトした際、エラーにならずにログイン画面に戻ってきますか?
- 旧URL(/wp-login.php)の遮断
- 直接アクセスした際、「404 Not Found」が表示されますか?
これらがすべて確認できれば、セキュリティ設定は完了です。
まとめ
nginx 環境でのログインURL変更は、プラグインに頼らず設定ファイルで行うのが最も安全で確実です。 特に「ログアウト時に404になる」という問題は nginx 特有のハマりポイントですが、今回紹介したフラグ方式を使えばきれいに解決できます。
ぜひこの設定を取り入れて、WordPress の防御力を向上させてください。
※環境差による補足や気づいた点があれば、コメントで共有してもらえると助かります。
なお、回答は筆者の検証環境で確認できる範囲となります。
なお、これまでのVPS上のUbuntu Server 24.04にnginx をWebサーバーとしたWordPress 環境の構築は、以下の記事にまとめています。ぜひこちらの記事もご参照ください。


