2018/08/24

macOS(High Sierra)でChromeからlocalhostにアクセスすると極端に遅くなるときの対処法

自宅用ラップトップをMacBook Pro 2018 High Sierraに更新したのだが、Chromium系ブラウザからlocalhostにアクセスしようとすると極端に遅くなってしまう。localhostのリソースにアクセスするだけで2〜3分ほどだ。

その対処法についていくつかまとめる。



環境と詳細な症状


環境は以下の通り。

  • MacBook Pro 2018 macOS High Sierra
  • ブラウザ
    • Chrome 68
    • Chromium 70
  • ローカルサーバー
    • Docker CE Version 18.06.0-ce-mac70 (26399)
    • Docker Compose version 1.22.0
    • nginx(Dockerコンテナ内)


下図のように、Dockerでnginxのリバースプロキシを立て、パスに応じてVolume機能で追加したローカルのファイルにアクセスするような構成。また自己証明書を使いhttps化している。
詳細な症状としては、

  • Chromium系ブラウザ(Chrome、Chromium)からlocalhostにアクセスすると再現する
    • FirefoxやSafariでは再現せず
  • リクエスト自体は飛んでいるがレスポンスが極端に遅い
  • nginxのアクセスログを確認するもレスポンス時のログのため原因はわからず
  • tcpdumpを確認するとアクセスが来てコネクションは張れているっぽい
  • 素のnginxイメージを使ってコンテナを立てた場合は、localhostでも正常にアクセスできた



localhostにアクセスすると極端に遅くなるときの対処法


先に解決した方法について説明する。
後に私の環境では解消しなかったけど、もしかしたら役に立つかもしれないので試した内容をまとめておく。

  • 127.0.0.1でアクセスする(解消)
  • IPv6を無効化する(ちょっとは改善されたが、解消はせず)
  • hostsにマシン名を追記(改善せず)


127.0.0.1でアクセスする(解消)

詳細は後述するが、どうやらlocalhostの名前解決に時間がかかっているようだった。そのため、127.0.0.1でアクセスすると正常にアクセスできた。

ただ、この現象が起こるのは私の環境だけだったので、localhostと127.0.0.1のどちらでもアクセスできるようにnginxの設定ファイルを修正した。
server {
  listen 443;
  # localhost, 127.0.0.1の両方で受け付ける
  server_name localhost 127.0.0.1;

  access_log  /root/logs/access.log;
  error_log   /root/logs/error.log;

  ssl                  on;
  ssl_certificate      /root/server.crt;
  ssl_certificate_key  /root/server.key;

  # $host変数を使ってURLを書き換える
  proxy_cookie_domain example.com $host;
  proxy_redirect      https://example.com/menu "https://${host}/menu";

  # 以下略
}


IPv6を無効化する(ちょっとは改善されたが、解消はせず)

そもそもlocalhostと疎通できるか確認するためにcurlコマンドを叩いてみたところ、どうやらIPv6の解決に時間がかかっているようだった(といっても数秒程度)
$ curl -v -k https://localhost
* Rebuilt URL to: https://localhost/
*   Trying ::1...
* TCP_NODELAY set
* Immediate connect fail for ::1: Input/output error
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:

### 以下略 ###

Trying ::1 ...の部分でちょっととまるので、/etc/hostsを編集してIPv6を無効化した。
※hostsファイルは管理者権限がないと編集できない重要なファイルなので十分注意してください。
$ sudo vi /etc/hosts

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1 localhost 
255.255.255.255 broadcasthost
# ↓ IPv6部分をコメントアウト
# ::1             localhost


hostsファイルを編集したので、もう一度curlコマンドを叩く。
$ curl -v -k https://localhost
* Rebuilt URL to: https://localhost/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
### 以下略 ###

これでlocalhostの名前解決が速くなった。といっても数秒程度しか改善されないので、ブラウザからのアクセスは相変わらず遅かった。


/etc/hostsにマシン名を追加(改善されず)

ググってみると海外の方も同じような問題に出くわしており、そこで提示されていた内容がhostsファイルの中にマシン名を追記すること。VPN接続している場合などに効果があるかもしれない。

まずは[システム環境設定]→[共有]を開き、コンピュータ名を確認する。

この「{コンピュータ名}.local」をhostsファイルに追記する。
$ sudo vi /etc/hosts

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##

# mycomputer.localを追記する
127.0.0.1 localhost mycomputer.local
255.255.255.255 broadcasthost
::1             localhost mycomputer.local

これで解消する場合もあるらしい。





以上

written by @bc_rikko

0 件のコメント :

コメントを投稿