(68) DB接続時のホスト指定 localhost と 127.0.0.1 の違いは?

投稿者: | 2020年9月17日

2,383 views

1. 問題発生

レンタル共有サーバー上に設置している WEBサイトで起こったこと。

昨日まで正常に閲覧できていたのに突然…
500 Internal Server Error
が発生して閲覧できなくなった!

WEBサーバー上のプログラムは何も変更していないのに。
何が起こった?

2. 原因

レンタルサーバー会社に問い合わせたところ、以下のような回答をいただきました。

弊社サーバーでは外部のデータベースへのアクセスができない仕様となっております。

当該コアサーバーで作成されたデータベースとの紐づけを行われる場合には、
対象データベース情報にも記載されておりますが
「接続ホスト名」を【localhost】に設定
の上運用いただけますと幸いでございます。

そういうことだったんですね…

3. 対策

MySQL接続時のホスト指定を
127.0.0.1
から
localhost
に変更した。

$con = new mysqli('localhost', $user, $pw, $dbname);

逆方向は何度か経験しているのだが今回は…

4. 動作の違いは?

localhost → 名前解決のプロセスを実行する。
127.0.0.1 → 名前解決のプロセスを実行しない。(=スキップできる)

これについて、ChatGPT大先生の説明は以下の通り。

HTTP通信において、localhostと127.0.0.1は共にローカルマシンにアクセスするために使用されますが、その背後で動作するプロセスには微妙な違いがあります。

127.0.0.1 は、IPv4アドレス空間におけるループバックアドレスです。このアドレスを使用してネットワークリクエストを行うと、システムは外部ネットワークに出ることなく直接自身にリクエストをルーティングします。これは、ネットワークスタックを通じて、しかし外部ネットワークには出ずに、自分自身に対して通信を行う一種のショートカットと考えることができます。

localhost は、通常127.0.0.1にマッピングされるホスト名です。localhostを使用する場合、システムは名前解決プロセスを経由します。つまり、localhostという名前をIPアドレスに解決する必要があります。この名前解決は、ほとんどのオペレーティングシステムでホストファイルやローカルDNSリゾルバを通じて行われます。localhostはIPv6環境では::1に解決されることもあります。

違いの要点:
名前解決: localhostは名前解決のプロセスを必要とし、これが127.0.0.1と直接指定する場合との主な違いです。
127.0.0.1は直接IPアドレスなので、名前解決のステップをスキップします。
対応するIP: localhostは環境に応じてIPv4の127.0.0.1やIPv6の::1など、異なるループバックアドレスに解決される可能性があります。
どちらの方法もローカルマシン上でのテストや開発に広く利用されますが、この微妙な違いが意味するところは、使用する環境や要件によって、一方が他方より適している場合があるということです。たとえば、名前解決の挙動をテストする場合やIPv6環境での動作を確認したい場合は、localhostを使用すると良いでしょう。

5. 所感

・現状は他のマシン上の DBにアクセスする必要はないので、個人的には問題なし。
・なぜ前日まで数年間問題なく動作していたのか?
 → 仕様変更後の猶予期間だったんでしょうかね?

6. 参考

有用な情報をありがとうございます。m(_ _)m
https://qiita.com/TanukiTam/items/f6a08740d0fcda0db7be
http://rookie-teck-info.blogspot.com/2015/02/mysqllocalhost127001.html


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)