Web開発中に発生したエラーについて対応した方法を書く。
エラー内容
grunt-contrib-connectで簡易サーバー起動後、ブラウザからアクセスするとこんなエラー画面になりました。
ERROR
The requested URL could not be retrieved
While trying to retrieve the URL: http://localhost:3000/
The following error was encountered:
Connection to 127.0.0.1 Failed
The system returned:
(111) Connection refused
The remote host or network may be down. Please try the request again.
Your cache administrator is root.
要するに、http://localhost:3000/
にアクセスしたところ127.0.0.1
への接続が失敗し、システムがエラーコード(111)を返してきているよ、リモートホストかネットワークが落ちてるかもね。って話ですね。
原因究明
私の環境ですが、Windows7です。
リモートホストかネットワークが原因との事なので、まずはホストから。
今回はgruntで立ち上げているのでgruntのログを確認し、以下のメッセージが出てればOK。
確認するログはコンソールに出ているメッセージです。
Started connect web server on http://localhost:3000
次にネットワークの確認。
ネットワークでのトラブルシュートはまずはpingですね。
gruntとは別にコマンドプロンプトを立ち上げてpingを打ってみます。
$ ping localhost
************* [::1]に ping を送信しています 32 バイトのデータ:
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
*************
はホスト名です。隠してます。
pingの結果、応答はちゃんと返って来ているようですね。
さて、もう少し詳しく見てみます。ホスト名の横の[]に囲まれている箇所ですが、
名前解決後のIPアドレスが表示されています。
localhost
は名前解決されると::1
となるようです。あまり見慣れないアドレスですね。。。
「IPアドレスって数字4つをピリオドで繋いだものじゃないの?」なんて疑問を持つかもしれませんが、
普段良く見る192.168.0.2
なんてアドレスはIPv4アドレスと呼ばれるものです。
それに対し今回の::1
のようなものはIPv6アドレスと呼ばれるものです。
IPv6???って方はググッてください。
話を戻しますが、要はlocalhostは名前解決された結果IPv6アドレスとなり、
IPv6プロトコルとしてサーバーにアクセスしに行ったというわけです。
先頭のエラーメッセージを思い出すと、「127.0.0.1への接続が失敗し・・・」と言われていました。
つまり、「ブラウザとしてはIPv4アドレスとして名前解決して欲しかったけどシステムからIPv6が返ってきちゃった」というような感じです。
(ここのところ、細かい部分で気になる人いると思います。私も細かい部分が分かってないかもしれません。ご指摘歓迎です。)
対応策
localhostやLAN内の名前解決がうまくいっていないのであれば、まずはhostsファイルを確認してみるといいです。
hostファイルはC:\Windows\System32\drivers\etc\hosts
にあります。
中を見ると以下のような記載が。
# localhost name resolution is handled within DNS itself.
127.0.0.1 localhost
::1 localhost
ありますね。IPv6アドレスとlocalhostを紐付けている行が。
::1 localhost
の行頭に#
を入力してこの行をコメントアウトします。
# localhost name resolution is handled within DNS itself.
127.0.0.1 localhost
# ::1 localhost
そもそも記載がない場合は、127.0.0.1 localhost
の行をコピー&ペーストしてください。
この記載もないのに!!って方は、IPv6プロトコルを無効にする方法があります。
コントロール パネル>ネットワークとインターネット>ネットワークと共有センター
と進むと、左側に「アダプター設定の変更」というメニューが出てくるはずなのでそこへ行きます。
すると接続一覧が出てくるので該当の接続のプロパティを開きます。
一覧の中の「インターネット プロトコル バージョン6(TCP/IPv6)」のチェックを外せば無効になります。
これでもう一度アクセスしてみると、無事にアクセス成功となるはずです。
hostsファイルに書き込むのは管理者権限がないと出来ないので気をつけてください。
また場合によって反映に再起動が必要かもしれません。