SQLSTATE[HY000] [2003] '127.0.0.1' (13) の MySQL サーバーに接続できませんが、'localhost' は動作します

SQLSTATE[HY000] [2003] '127.0.0.1' (13) の MySQL サーバーに接続できませんが、'localhost' は動作します

Cent OS Apache + php + MySQLからphpアドレス127.0.0.1のMySQLに接続しようとすると、エラーが発生します。行を置き換えると127.0.0.1localhostすべて問題なく動作します。ブラウザのphpの唯一の問題。コンソールを実行すると

php -r "var_dump (mysqli_connect ( '127.0.0.1', 'user', 'pass', 'db_name'))"

エラーはありません。また、コンソールに入力する場合

mysql -u user -h 127.0.0.1 -p db_name

または

mysql -u user -h localhost -p db_name

すべて正常に動作します。何が問題なのでしょうか?

ソフトウェアバージョン

  • PHP-5.6.26
  • MySQL-5.5.53
  • アパッチ2.2.15

ついに、

$ host localhost
localhost has address 127.0.0.1

PHPコードの動作:

$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

PHP コードが機能しない:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';

    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }

SQLSTATE[HY000] [2003] '127.0.0.1' の MySQL サーバーに接続できません (13)

PHPコードの動作:

$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

PHP コードが機能しない:

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

解決:

setsebool httpd_can_network_connect_db on

答え1

によるとStackOverflow 上のこの(未承認の)回答理由はMySQLがlocalhostを異なる方法で解釈するためです127.0.0.1。これは文書で確認、次の段落を参照してください。Unixでは、MySQLプログラムはホスト名をlocalhost特別に扱います「」。

  • 明示的なIPv4アドレスなので127.0.0.1、クライアントはTCP/IP経由で接続を試みます。
  • これはlocalhost、ローカルホストを使用するための暗黙のヒントであり、MySQLは、可能な場合はTCP/IPではなくローカルソケット経由で実装します。

localhost接続は機能しているのに、もう 1 つの接続が機能していない場合は127.0.0.1、次のいずれかの問題が原因である可能性があります。

  • データベースの権限により接続が拒否されました127.0.0.1
  • TCP/IP経由のすべての受信データベース接続試行をブロックするファイアウォールルールがある
  • MySQLの設定エントリを変更してbind、ループバックアドレスにバインドしないようにしました

エラーコード13(許可が拒否されました)、私は他の 2 つよりもまず最初のものを調べます。

関連情報