違い
◯ 127.0.0.1 と localhost
同じものになります。
あるいは localhost は 127.0.0.1 の別名と言ってもいいかもしれません。nslookup
コマンドで対応付を見てみます。
$ nslookup localhost
...
Name: localhost
Address: 127.0.0.1
Name: localhost
Address: ::1
$
/etc/hosts
を削除してもこの挙動は変化しませんでした。もしかしたら対応付を消す方法があるのかもしれません。
◯ 127.0.0.1 と 0.0.0.0
- 127.0.0.1 ... PC の中だけで通信を行う場合に使います。
- 0.0.0.0 ... PC の外と通信を行う場合に使います。
例えば
127.0.0.1 と 0.0.0.0 について説明します。
◯ 前提
- PC には 192.0.2.2 が割り当てたとします。
- ウェブサーバ Uvicorn をポート番号 80 で立ち上げたとします。
- データベースサーバ PostgreSQL ポート番号 5432 で立ち上げたとします。
- ウェブサーバとデータベースサーバを1つの PC の中で立ち上げたとします。
◯ 前提 ウェブサーバ
ウェブサーバは外部と通信が必要になるので 0.0.0.0 を設定します。
$ # Uvicorn を起動
$ uvicorn app:app --host 0.0.0.0
- Uvicorn の --host のデフォルト値は 127.0.0.1
◯ 前提 データベースサーバ
データベースサーバはウェブサーバとだけ通信をすればよいので 127.0.0.1 を設定します。
listen_addresses = '127.0.0.1'
$ # PostgreSQL を起動
$ postgres -D /etc/postgresql/10/main
- PostgreSQL の listen_addresses デフォルト値は localhost
◯ 結果
外部からウェブサーバには 192.0.2.2:80 でアクセスすることができますが、データベースサーバには外部から 192.0.2.2:5432 でアクセスすることはできません。
データベースサーバにはウェブサーバから 127.0.0.1:5432 でアクセスすることができます。
ネットワークインターフェイス
1つの PC は複数のネットワークインターフェイスを持つことができます。ネットワークインターフェイスはそれぞれが IP アドレスを持つことができます。Windows なら ipconfig コマンド, macOS, Ubuntu なら ifconfig コマンドで確認することができます。
以下は Ubuntu での実行結果です。1台の PC が複数のネットワークインターフェイス, IP アドレスを持っていることがわかります。
$ ifconfig | grep "inet "
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
inet 172.20.0.1 netmask 255.255.0.0 broadcast 172.20.255.255
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet 127.0.0.1 netmask 255.0.0.0
inet 192.168.11.2 netmask 255.255.255.0 broadcast 192.168.11.255
$
ウェブサーバを起動する際に 192.0.2.2 を指定せず 0.0.0.0 を指定すると、外部からすべてのネットワークインターフェイス、複数のIPアドレスを経由してアクセスしてもらうことができます。ウェブサーバに対しては 127.0.0.1 でも 192.168.11.2 でも 172.17.0.1 でも... 通信が可能になります。
一方でデータベースサーバはウェブサーバとだけ通信が可能です。
ただし 0.0.0.0 を指定することは一般的に開発環境でのみ推奨され、本番環境では適切なセキュリティ対策を講じる必要があります(ChatGPT からの引用です、不要なネットワークインターフェイスを閉じろ、ということを言っているのでしょうか? https://bit.ly/48swjhx )。
参考
すいません、別のタイトルが思いつきませんでした... orz