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 に向けると、ほかの訪問者には影響を与えずに新サーバーの表示や管理画面を確かめられます。
- パソコンの hosts ファイルに
新サーバーのIP example.com www.example.comを追記する - ブラウザーでサイトを開き、表示・ログイン・フォームの送信などを確かめる
- 確認が終わったら 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 を疑う - サーバー移転の確認に使ったエントリは、終わったら消す