「504 Gateway Time-out」がWordPressの管理画面・ダッシュボードに発生して表示できない場合の全プラグインの一時的な無効化

ここのサーバではない別のサーバで、延々と6時間ぐらい格闘し続ける羽目になった&ネット上では見当たらない解決方法だったのでメモしておく。まず発生状況や原因は不明で、今朝午前9時から突然、ログインが劇的に重くなり、これまで1秒だったのが20秒に。記事を投稿しようとしてもnginxの「504 Gateway Time-out」が出る始末で、プラグインの追加もテーマの追加もそういうのが全部「504 Gateway Time-out」でできなくなってしまった。

・再起動しても変化なし
・nginxのキャッシュを完全に削除しても効果なし
・負荷が高いのかと思ってtopコマンドなどを使って見てみるが、ロードアベレージは0.01でまったく重たくない
・空き領域不足でもない(60%使っていて、40%が空き)
・メモリも余ってる
・ネットワークの帯域にも問題がない
・MySQLが壊れているのかと思ってチェックするがエラーなし、念のため修復したり最適化もするが効果なし
・Googleで検索するとタイムアウトの秒数を伸ばせとか出てくるが、150秒まで延ばしてもタイムアウトになり、しかもこれだと根本的な対応とは言えない
・nginxやMySQLのエラーログなどを見るが何も出ていない
・AWSのインスタンスタイプを変更したりIPアドレスを変えたりしても変化なし、CloudWatchも使ったが何も見つけられず

完全にお手上げになったので、「これはもうお引っ越しするしかないのか……いや、引っ越しても必ず解決するわけでは……いやしかし……」というわけで、さらにいろいろ調べてみたところ、WordPressの管理画面・ダッシュボード「だけ」が重たくて、普通のページ表示自体は問題がない。というか、nginxのキャッシュで爆速。ということは、ダッシュボードにだけ関係しており、なおかつ管理画面の全てについてだけ起動するプラグインでもあるのか?はてな?というわけで、プラグインを無効化していくことを思いつくが、そもそも「504 Gateway Time-out」で画面が真っ白になるので、ダッシュボードから無効化できない。で、検索した結果、こんなのを発見。

How to deactivate all plugins when not able to access the administrative menus?

管理パネルにアクセスできないときに全プラグインを停止するには?

・1つ目の方法(phpMyAdminから)
phpMyAdminでwp_optionsのテーブルを見に行き、option_name columnフィールドからactive_pluginsを見つける。次にoption_valueを「a:0:{}」に変更する。こうするとプラグインが全部無効化される。

・2つ目の方法(FTPやコンパネのファイルマネージャなどから)
1:wp-contentsディレクトリに移動
2:wp-contentsディレクトリの中にある「plugins」ディレクトリの名前を「plugins.hold」に変更
3:ログインして「プラグイン」をクリックするとすべて「missing」になっているのを確認
4:ディレクトリの名前を「plugins.hold」から「plugins」に戻す

今回はWinSCPを使って2つ目の方法を使い、SCP経由でディレクトリ名を変更したところ、ログイン爆速&ダッシュボードがかつてないほど高速化。順に一つずつ、必須なプラグインから有効化していったところ、結局、すべてのプラグインを有効化することに。「504 Gateway Time-out」も出なくなり、解決しましたとさ。なんだそりゃ!

というわけで、ダッシュボードが劇的に重たくなってタイムアウトも頻発し、プラグインを無効化してみたいがその画面までたどり着けない!もうどうしようもない!という場合でもこういう方法があるよ、というメモでした。