Squidで困りました

中国に置いてあるプロキシが故障したと連絡があり、格闘した記録です。

# 環境
古い！！

- Red Hat Enterprise Linux ES release 4 (Nahant)
- Squid Cache: Version 2.6.STABLE22

# 現象
以下のエラーメッセージが出現すると代理アクセスを行わなくなる？

```cache.log
squid[3177]: Failure Ratio at 1.20
squid[3177]: Going into hit-only-mode for 5 minutes...
```

# 調べたこと
## エラーの内容

https://squid.robata.org/faq_12.html

> 12.13 "Failure Ratio at 1.01; Going into hit-only-mode for 5 minutes"とは何ですか。
AとBの２つの隣接キャッシュペアがあった時、仮にBのキャッシュのインターネットへの接続が不安定だったとします。
このようなとき、隣接のキャッシュにその事を伝えたいと考えられます。
Squidはトラフィックを追跡しており、リクエストが短期間の ERR_DNS_FAIL や ERR_CONNECT_FAIL や ERR_READ_ERROR で失敗したなら、失敗から成功の比率を1.0以上にします。　
このときSquidはICP_MISS ではなく ICP_MISS_NOFETCH を返します。　また、ICP_HIT が増えたならこれを戻します。

## 動作を確認してみた

以下コマンドラインで

```
# http_proxy=http://xxx:xxx@10.xx.xx.xx:8080 https_proxy=http://xxx:xxx@10.xx.xx.xx:8080 wget -d http://wx.qq.com
```

応答

```
---request begin---
GET http://wx.qq.com/ HTTP/1.0
User-Agent: Wget/1.10.2 (Red Hat modified)
Accept: */*
Proxy-Authorization: Basic xxx=
Host: wx.qq.com

---request end---
Proxy request sent, awaiting response...
---response begin---
HTTP/1.0 503 Service Unavailable
Server: squid/2.6.STABLE22
Date: Wed, 05 Dec 2018 05:08:16 GMT
Content-Type: text/html
Content-Length: 1134
Expires: Wed, 05 Dec 2018 05:08:16 GMT
X-Squid-Error: ERR_DNS_FAIL 0
X-Cache: MISS from xxx
Via: 1.0 xxx:8080 (squid/2.6.STABLE22)
Proxy-Connection: close

---response end---
503 Service Unavailable
Closed fd 3
13:08:16 ERROR 503: Service Unavailable.
```

ERR_DNS_FAIL ??

## 参考にしたサイト

https://qa.atmarkit.co.jp/q/2613

> Squidはシステムが持っているresolver libraryを使わずに自前の名前解決を
行なうようです。
http://search.luky.org/linux-users.9/msg02857.html
「192.168.1.1 192.168.1.2のどちらかのDNSサーバが生きていれば
プロキシサーバから確実にアクセスできる」ことを目標にするのであれば、
Squid.confに
dns_nameserver 192.168.1.1 192.168.1.2
と記述して動作させてはいかがでしょうか。
※当方でもdns_nameserverに指定してSquidを運用しています

この環境では、dns_nameserverを書いていない。
とりあえず設定してみた。結果、改善した？？ように今の所見える。

# その他
## SSL handshake

SSLv3を有効にしている不適切な端末がWEBサイトにアクセスし、SSL handshakeで失敗していることが原因かと考えた。。。

squidのバージョンが古いので、新しいSSL handshakeが出来ないのではと考えた。。。
しかし、SSLのProxyでは、squidサーバでhandshakeは行わないので関係ないか。。。

最新のsquidにすれば解決するはず！という希望を込めて最新版をインストールした。

## squidのインストール

同じサーバに別ポートで起動させて改善するか確認を行う。
yumは、まだない。
ソースからコンパイルしました。

- squid-3.5.28　コンパイルエラー
- squid-3.4.14　コンパイルエラー

gcc-4.4以上が必要みたいでした。

- squid-3.3.14　コンパイル成功！！

configのオプションは以下。必要そうな最低限と思われるものだけを選択してコンパイルしました。

```
# ./configure --prefix=/usr/local/squid-3.3.14 --with-openssl=/usr/local/openssl-1.0.2q --enable-auth-basic=LDAP,NCSA
 --enable-auth-digest=none --enable-auth-negotiate=none --enable-auth-ntlm=none --enable-external-acl-helpers=file_user
ip,unix_group,session
```

# この件を通して学んだ新しいこと
## squid access.logの読み方

```
1543988361.875     44 10.214.57.147 TCP_MISS/200 284 POST http://get.sogou.com/q 20052 HIER_DIRECT/111.202.100.40 text/plain
```

- 時間はUNIXタイムスタンプ
- `TCP_MISS/200` の部分にHTTPステータスコードがある

## UNIXタイムスタンプの変換

このままだと何時かわからないので変換する。awkを使ってやってます。

```
# cat access.log | awk '{print strftime("%Y/%m/%d %H:%M:%S", $1), $0}'
```

## squidclient

squidの統計情報などが確認できます。

確認できる一覧。いろいろある。

```
# squidclient -h localhost -p 8080 -u xx -w xx mgr:
HTTP/1.0 200 OK
Server: squid/2.6.STABLE22
Date: Wed, 05 Dec 2018 05:54:09 GMT
Content-Type: text/plain
Expires: Wed, 05 Dec 2018 05:54:09 GMT
Last-Modified: Wed, 05 Dec 2018 05:54:09 GMT
X-Cache: MISS from xx
Via: 1.0 xx:8080 (squid/2.6.STABLE22)
Proxy-Connection: close

 mem                    Memory Utilization      public
 cbdata                 Callback Data Registry Contents public
 events                 Event Queue     public
 diskd                  DISKD Stats     public
 config                 Current Squid Configuration     hidden
 ipcache                IP Cache Stats and Contents     public
 fqdncache              FQDN Cache Stats and Contents   public
 idns                   Internal DNS Statistics public
 basicauthenticator     Basic User Authenticator Stats  public
 external_acl           External ACL stats      public
 http_headers           HTTP Header Statistics  public
 menu                   This Cachemanager Menu  public
 shutdown               Shut Down the Squid Process     hidden
 offline_toggle         Toggle offline_mode setting     hidden
 info                   General Runtime Information     public
 filedescriptors        Process Filedescriptor Allocation       public
 objects                All Cache Objects       public
 vm_objects             In-Memory and In-Transit Objects        public
 openfd_objects         Objects with Swapout files open public
 pending_objects        Objects being retreived from the network        public
 client_objects         Objects being sent to clients   public
 io                     Server-side network read() size histograms      public
 counters               Traffic and Resource Counters   public
 peer_select            Peer Selection Algorithms       public
 digest_stats           Cache Digest and ICP blob       public
 5min                   5 Minute Average of Counters    public
 60min                  60 Minute Average of Counters   public
 utilization            Cache Utilization       public
 histograms             Full Histogram Counts   public
 active_requests        Client-side Active Requests     public
 storedir               Store Directory Stats   public
 store_check_cachable_stats     storeCheckCachable() Stats      public
 store_io               Store IO Interface Stats        public
 pconn                  Persistent Connection Utilization Histograms    public
 refresh                Refresh Algorithm Statistics    public
 forward                Request Forwarding Statistics   public
 client_list            Cache Client List       public
 asndb                  AS Number Database      public
 server_list            Peer Cache Statistics   public
 non_peers              List of Unknown sites sending ICP messages      public
```

なんとなくよく見てた内容

```
# squidclient -h localhost -p 8080 -u xx -w xx mgr:info
HTTP/1.0 200 OK
Server: squid/2.6.STABLE22
Date: Wed, 05 Dec 2018 05:56:20 GMT
Content-Type: text/plain
Expires: Wed, 05 Dec 2018 05:56:20 GMT
Last-Modified: Wed, 05 Dec 2018 05:56:20 GMT
X-Cache: MISS from xx
Via: 1.0 xxx:8080 (squid/2.6.STABLE22)
Proxy-Connection: close

Squid Object Cache: Version 2.6.STABLE22
Start Time:     Wed, 05 Dec 2018 00:01:44 GMT
Current Time:   Wed, 05 Dec 2018 05:56:20 GMT
Connection information for squid:
        Number of clients accessing cache:      939
        Number of HTTP requests received:       582409
        Number of ICP messages received:        0
        Number of ICP messages sent:    0
        Number of queued ICP replies:   0
        Request failure ratio:   0.09
        Average HTTP requests per minute since start:   1642.4
        Average ICP messages per minute since start:    0.0
        Select loop called: 4412612 times, 4.822 ms avg
Cache information for squid:
        Request Hit Ratios:     5min: 1.0%, 60min: 0.4%
        Byte Hit Ratios:        5min: 23.9%, 60min: 31.0%
        Request Memory Hit Ratios:      5min: 52.2%, 60min: 44.6%
        Request Disk Hit Ratios:        5min: 31.3%, 60min: 20.6%
        Storage Swap size:      87280 KB
        Storage Mem size:       7520 KB
        Mean Object Size:       33.27 KB
        Requests given to unlinkd:      287
Median Service Times (seconds)  5 min    60 min:
        HTTP Requests (All):   0.00091  0.00091
        Cache Misses:          5.63745  4.79440
        Cache Hits:            0.00179  0.00091
        Near Hits:             5.34113  0.05633
        Not-Modified Replies:  0.00000  0.00091
        DNS Lookups:          19.72745 33.58970
        ICP Queries:           0.00000  0.00000
Resource usage for squid:
        UP Time:        21276.279 seconds
        CPU Time:       123.029 seconds
        CPU Usage:      0.58%
        CPU Usage, 5 minute avg:        0.52%
        CPU Usage, 60 minute avg:       0.48%
        Process Data Segment Size via sbrk(): 50300 KB
        Maximum Resident Size: 0 KB
        Page faults with physical i/o: 0
Memory usage for squid via mallinfo():
        Total space in arena:   50300 KB
        Ordinary blocks:        31977 KB    969 blks
        Small blocks:               0 KB      0 blks
        Holding blocks:           232 KB      1 blks
        Free Small blocks:          0 KB
        Free Ordinary blocks:   18322 KB
        Total in use:           32209 KB 64%
        Total free:             18322 KB 36%
        Total size:             50532 KB
Memory accounted for:
        Total accounted:        16497 KB
        memPoolAlloc calls: 44372128
        memPoolFree calls: 44307585
File descriptor usage for squid:
        Maximum number of file descriptors:   1024
        Largest file desc currently in use:    474
        Number of file desc currently in use:  347
        Files queued for open:                   0
        Available number of file descriptors:  677
        Reserved number of file descriptors:   100
        Store Disk files open:                   0
        IO loop method:                     epoll
Internal Data Structures:
          2711 StoreEntries
          1552 StoreEntries with MemObjects
          1518 Hot Object Cache Items
          2623 on-disk objects
```