TL;DR — 素早い解決策
wp-config.php を開き、DB_HOST の行で localhost を 127.0.0.1 に変更します:
// Before
define( 'DB_HOST', 'localhost' );
// After
define( 'DB_HOST', '127.0.0.1' );
この一行を変えるだけで、PHP は Unix ソケットファイルを探す代わりに TCP 経由で接続するようになります。サイトをリロードしてください。動作すれば完了です。動作しない場合は読み続けてください。
なぜこのエラーが発生するのか
PHP の MySQLi にはコンパイル時に組み込まれたデフォルトのソケットパスがあり、多くの場合 /tmp/mysql.sock です。しかし MySQL や MariaDB のインストール先は、/var/run/mysqld/mysqld.sock や /var/lib/mysql/mysql.sock など別の場所にソケットを配置することがほとんどです。パスが一致しないため、PHP はファイルを見つけられず、WordPress が壊れます。
最もよくあるパスの不一致:
- PHP が
/tmp/mysql.sockでコンパイルされているが、MySQL が実際に使用するのは/var/run/mysqld/mysqld.sock - MariaDB のソケットが
/var/lib/mysql/mysql.sockにあるが、PHP は別の場所を参照している - MySQL が再インストールまたはアップグレードされ、ソケットが新しい場所に移動した
- MySQL が Docker やVM 内で動作しており、ホスト上にソケットパスが存在しない
このエラーは WordPress の汎用的な白画面「Error establishing a database connection」よりも具体的です。PHP の出力に直接表示され、障害ポイントを正確に示します:
Warning: mysqli_real_connect(): (HY000/2002): No such file or directory in /var/www/html/wp-includes/class-wpdb.php
これは実際には有用な情報です。パスワードの誤りやデータベースの欠如ではなく、ソケットの問題であることがわかります。
修正方法 1 — TCP に切り替える(最も速い)
/var/www/html/wp-config.php を編集します(WordPress が別の場所にある場合はパスを調整してください):
define( 'DB_HOST', '127.0.0.1' );
ポート 3306 の TCP 接続になります。ソケットファイルは使用されません。条件が一つあります:MySQL がループバックインターフェースでリッスンしている必要があります。確認するには:
ss -tlnp | grep 3306
次のような出力が表示されるはずです:
LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:("mysqld",...)
何も表示されない場合、MySQL はソケットのみで動作しています。修正方法 2 または修正方法 3 に進んでください。
修正方法 2 — 実際のソケットを見つけて PHP に指定する
MySQL が実際にソケットを配置している場所を特定します:
# MySQL に直接確認する
mysql -e "SHOW VARIABLES LIKE 'socket';"
# 設定ファイルを検索する
grep -r "socket" /etc/mysql/ /etc/my.cnf /etc/my.cnf.d/ 2>/dev/null
# またはディスク上で直接探す
find /var/run /tmp /var/lib/mysql -name "*.sock" 2>/dev/null
実際のパスが判明したら、wp-config.php に直接指定します:
// host:socket 形式 — WordPress はこれをそのまま MySQLi に渡す
define( 'DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock' );
MySQLi は host:socket_path 形式をネイティブに受け付けます。特殊な対処は不要です。
修正方法 3 — php.ini でデフォルトソケットを設定する
WordPress だけでなくサーバー上のすべての PHP アプリに適用される修正が必要ですか? php.ini で設定しましょう。
# 有効な php.ini を探す
php --ini | grep "Loaded Configuration"
# 編集する(バージョン番号を実際のものに合わせてください)
sudo nano /etc/php/8.1/cli/php.ini
mysqli.default_socket を見つけて、実際のソケットパスを指定します:
mysqli.default_socket = /var/run/mysqld/mysqld.sock
PDO も使用している場合はそちらも更新します:
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock
変更を反映するために PHP を再起動します:
# PHP-FPM
sudo systemctl restart php8.1-fpm
# Apache mod_php
sudo systemctl restart apache2
修正方法 4 — MySQL が起動していない
ソケットパスを調べる前に、明白な原因を排除しましょう:MySQL がクラッシュしています。
sudo systemctl status mysql
# または
sudo systemctl status mysqld
# 停止している場合は起動する:
sudo systemctl start mysql
# 停止した原因を確認する:
sudo journalctl -u mysql -n 50 --no-pager
MySQL が起動時に繰り返し停止する場合は /var/log/mysql/error.log を確認してください。ディスク容量不足、InnoDB の破損、メモリ制限の超過など、本当の原因はほぼ必ずそこに記録されています。
修正方法 5 — Docker やカスタムサーバー構成
Docker で WordPress を動かしていますか? コンテナ内の localhost はコンテナ自身を指しており、ホストマシンや隣接するコンテナではありません。実際のサービス名または IP アドレスを使用してください:
# docker-compose.yml で定義されたサービス名
define( 'DB_HOST', 'db' );
# ホスト上の MySQL — Mac/Windows Docker Desktop
define( 'DB_HOST', 'host.docker.internal' );
# ホスト上の MySQL — Linux Docker デフォルトブリッジ
define( 'DB_HOST', '172.17.0.1' );
修正の確認
サイトをリロードする前に、コマンドラインから接続をテストしてください。wp-config.php から DB_USER、DB_PASSWORD、DB_NAME を取得して実行します:
# TCP 経由
mysql -h 127.0.0.1 -u your_wp_user -p your_wp_database
# ソケット経由
mysql -S /var/run/mysqld/mysqld.sock -u your_wp_user -p
エラーなく接続できましたか? WordPress も問題ありません。サイトを読み込み、エラーログを確認してクリーンな状態を確認しましょう:
sudo tail -f /var/log/nginx/error.log
# または
sudo tail -f /var/log/apache2/error.log
どの修正方法を使うべきか
- 共有ホスティング / マネージドサーバー — 修正方法 1(TCP)。ほぼ毎回うまくいきます。
wp-config.phpへのアクセスのみ必要で、サーバー管理者権限は不要です。 - フル制御の VPS — まず修正方法 1 を試してください。マシン上のすべてのアプリにグローバルでソケットパスを設定したい場合は修正方法 3 を追加してください。
- Docker 構成 — 修正方法 5 を使用してください。コンテナ間のソケット共有は手間がかかります。TCP の方がシンプルで移植性が高いです。
- MySQL が起動していない — まず修正方法 4 を試してください。サービスが実際に起動するまで他の方法は意味がありません。

