2026年5月31日

2026年5月31日

/etc/hosts の編集方法|書式・反映の確認・サーバー移転前の動作確認

/etc/hosts は、ホスト名と IP アドレスの対応を 1 行ずつ書いておくファイルです。ここに書いた名前は DNS に問い合わせる前に解決されるため、DNS を変えずに「このパソコン(サーバー)からだけ、この名前を別の IP に向ける」ことができます。WordPress の引っ越しで、DNS を切り替える前に新しいサーバーを本番のドメイン名で確かめるときによく使います。

この記事では、書式、編集と削除の手順、反映の確認方法、反映されないときの原因を説明します。

/etc/hosts の書式

1 行に「IP アドレス」「正式なホスト名」「別名(任意、複数可)」を空白またはタブで区切って書きます。# から行末まではコメントです。

127.0.0.1       localhost
127.0.1.1       web01
::1             localhost ip6-localhost ip6-loopback

# サーバー移転の確認用(確認が終わったら消す)
203.0.113.20    example.com www.example.com
  • 1 つの IP に複数の名前を書けます(上の例では example.com と www.example.com)。
  • *.example.com のようなワイルドカードは使えません。サブドメインは 1 つずつ書きます。
  • localhost の行と、Debian / Ubuntu の 127.0.1.1 ホスト名 の行は消さないでください。自分自身の名前が引けなくなり、sudo などが遅くなったり警告を出したりします。

名前解決の順番

/etc/hosts が DNS より先に使われるのは、/etc/nsswitch.conf の hosts: の行で files が dns より前にあるからです。多くのディストリビューションでは既定でそうなっています。

grep '^hosts:' /etc/nsswitch.conf
# 例: hosts: files dns
# 例(Ubuntu): hosts: files mdns4_minimal [NOTFOUND=return] dns

files が dns より後ろにある環境では、DNS で見つかった名前は /etc/hosts で上書きされません。

編集する手順

1. バックアップを取る

sudo cp -p /etc/hosts /etc/hosts.bak.$(date +%Y%m%d)

2. エディターで開いて書き足す

/etc/hosts は root だけが書き込めます。sudo を付けてエディターで開きます。

sudo nano /etc/hosts
# または
sudo vi /etc/hosts

3. コマンドで追記する場合

sudo echo ... >> /etc/hosts は失敗します(リダイレクトは sudo の外の、一般ユーザーのシェルが行うため)。tee -a を使います。

# 1 行追記
echo '203.0.113.20 example.com www.example.com' | sudo tee -a /etc/hosts

# 複数行をまとめて追記
sudo tee -a /etc/hosts <<'EOF'
192.0.2.10  dev.example.test
192.0.2.20  api.example.test
EOF

tee -a の -a を付け忘れると、ファイルの中身が置き換わって localhost などの行が消えます。追記したら中身を確認してください。

cat /etc/hosts

反映を確認する

/etc/hosts の変更は、ファイルを保存した時点から新しく始まる名前解決に使われます。サービスの再起動は要りません。確認には getent を使います。getent は nsswitch.conf の順番どおりに名前を引くので、アプリケーションと同じ結果になります。

getent hosts example.com
# 203.0.113.20    example.com www.example.com

# 実際に接続して確かめる
curl -sI http://example.com/ | head -1

dig と nslookup は DNS サーバーに直接問い合わせる道具で、/etc/hosts を読みません。/etc/hosts に書いた内容を確かめるのには使えないので、getent を使います(DNS 側の設定を確かめる方法はnslookup と dig で DNS を確認する方法を参照)。

エントリを消す・無効にする

確認が終わったエントリは、残しておくと DNS を変えても古い IP に接続し続けるので、消しておきます。エディターで行を削除するか、行頭に # を付けてコメントにするのが確実です。コマンドで消す場合は、対象の名前を正確に指定します。

# 名前として example.com が書かれた行を削除(-i.bak で元のファイルを /etc/hosts.bak に残す)
sudo sed -i.bak '/[[:space:]]example\.com\([[:space:]]\|$\)/d' /etc/hosts

# バックアップから戻す
sudo cp -p /etc/hosts.bak.20261110 /etc/hosts

sed の正規表現で . をエスケープせず、名前の境目も指定しないと、myexample.com のような別の行まで消すことがあります。実行後は cat /etc/hosts で確認してください。

反映されないときの原因

  • ブラウザーが名前解決の結果を持っている:ブラウザーは独自に結果を短時間保持することがあります。ブラウザーを再起動するか、別のブラウザーで確かめます。
  • プロキシを経由している:ブラウザーや curl がプロキシを使う設定だと、名前解決はプロキシ側で行われ、手元の /etc/hosts は使われません。
  • nsswitch.conf で files が後ろにある:前述のとおり、順番を確認します。
  • サーバーを再起動すると元に戻る:クラウドの仮想マシンでは、cloud-init の manage_etc_hosts が有効だと、起動のたびに /etc/hosts がテンプレート(/etc/cloud/templates/hosts.*.tmpl)から作り直されます。恒久的に変えたい場合はテンプレート側を編集するか、この設定を無効にします。
  • Docker コンテナの中:コンテナの /etc/hosts は Docker が管理しており、コンテナを作り直すと消えます。docker run --add-host や Compose の extra_hosts で指定します。

macOS と Windows の hosts ファイル

手元のパソコンから新しいサーバーを確かめる場合は、パソコン側の hosts ファイルを編集します。

OS 場所 編集のしかた
macOS /etc/hosts ターミナルで sudo nano /etc/hosts
Windows C:\Windows\System32\drivers\etc\hosts メモ帳を「管理者として実行」して開く

保存後、macOS では sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder、Windows ではコマンドプロンプトで ipconfig /flushdns を実行すると、OS が持っている名前解決の結果が消えます。

サーバー移転前の確認に使う

WordPress を新しいサーバーへ移すとき、DNS を切り替える前に、自分のパソコンの hosts ファイルで本番のドメイン名を新サーバーの IP に向けると、ほかの訪問者には影響を与えずに新サーバーの表示や管理画面を確かめられます。

  1. パソコンの hosts ファイルに 新サーバーのIP example.com www.example.com を追記する
  2. ブラウザーでサイトを開き、表示・ログイン・フォームの送信などを確かめる
  3. 確認が終わったら hosts ファイルの行を消す(消さないと、DNS を切り替えた後も古い設定のままになり、問題に気付けない)

新サーバーにまだ SSL 証明書が入っていない場合、https:// で開くと証明書のエラーになります。移転の全体の流れはサーバー移転の手順を参照してください。

hosts ファイルを書き換えずに 1 回だけ確かめたいなら、curl の --resolve で接続先の IP を指定する方法もあります。

curl -sI --resolve example.com:443:203.0.113.20 https://example.com/ | head -1

まとめ

  • 書式は「IP アドレス ホスト名 別名…」。ワイルドカードは使えず、localhost の行は消さない
  • 追記は sudo tee -a。sudo echo >> は権限エラーになり、tee の -a 忘れはファイルを上書きする
  • 確認は getent hosts。dig と nslookup は /etc/hosts を読まない
  • 反映されないときは、ブラウザーやプロキシ、nsswitch.conf の順番、cloud-init を疑う
  • サーバー移転の確認に使ったエントリは、終わったら消す

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲