在 ubuntu 18.04 中,squid 的配置文件默认位置为:/etc/squid/squid.conf
,访问日志默认保存在 /var/log/squid/access.log
缓存配置
cache_dir aufs /var/spool/squid 100000 16 256
cache_mem 1024 MB
maximum_object_size_in_memory 2 MB
maximum_object_size 80 MB
cache_dir
后面的参数非常重要,其中 100000
说明可以分配硬盘上 100GB
的空间用于保存缓存。默认情况下只有 100MB
,所以会发现之前的缓存没有生效,因为超出 100MB
后,会用 LRU
的策略清除缓存。
maximum_object_size
参数也比较重要,有时候文件没有缓存,是因为这个值太小了,导致稍微大一些的文件就没有被缓存,需要重新下载。
权限配置
squid 默认只限本地访问,如果需要其它机器访问,需要指定可访问的机器的 IP。首先,需要找到 http_access deny all
这一行,在这一行前面添加:
acl permittedips src 192.168.0.0/16
acl permittedips src 172.0.0.0/8
http_access allow permittedips
其中,限制可访问 IP 地址的方式是指定子网和掩码,如上所述,192.168.0.0/16
表示允许以 192.168
开头的所有 IP 地址访问。permittedips
是自定义的变量名,每个变量名相当于是一个数组,可以容纳多个子网和掩码的组合。
每当修改配置文件后,需要重启 squid 服务。可以执行:systemctl restart squid
,或者 service squid restart
。systemctl
是推荐使用的方式,有很多 init.d 没有的高级功能,相关内容可以参考:
日志阅读
当发现访问某个链接没有生效时,需要去访问日志中确认原因。访问日志的默认位置为 /var/log/squid/access.log
,也可以在配置文件中修改:
access_log daemon:/var/log/squid/access.log squid
默认情况下,日志输出如下:
1553684143.879 0 172.17.0.2 TCP_MEM_HIT/200 50109 GET http://mirrors.aliyun.com/debian/pool/main/u/unrtf/unrtf_0.21.9-clean-3_amd64.deb - HIER_NONE/- application/octet-stream
1553684143.879 0 172.17.0.2 TCP_MEM_HIT/200 170627 GET http://mirrors.aliyun.com/debian/pool/main/u/unzip/unzip_6.0-21_amd64.deb - HIER_NONE/- application/octet-stream
1553684143.883 4 172.17.0.2 TCP_MEM_HIT/200 234749 GET http://mirrors.aliyun.com/debian/pool/main/z/zip/zip_3.0-11%2bb1_amd64.deb - HIER_NONE/- application/octet-stream
1553684143.884 0 172.17.0.2 TCP_MEM_HIT/200 18108 GET http://mirrors.aliyun.com/debian/pool/main/d/docx2txt/docx2txt_1.4-0.1_all.deb - HIER_NONE/- application/octet-stream
其中 TCP_MEM_HIT
这个位置的字段最为重要,一般有下列情况:
TCP_DENIED # 表示请求被拒绝,一般因为请求的 IP 不符合条件
TCP_MISS # 表示没有找到缓存
TCP_TUNNEL # 一般因为这是一个 https 请求,https 请求无法被缓存
TCP_MEM_HIT # 在内存缓存中找到请求的内容,直接发给客户
TCP_HIT # 在硬盘缓存中找到请求的内容,直接发给客户
TCP_REFRESH_UNMODIFIED
上面尤其要注意的是,https 请求是无法被缓存的,在日志中会显示 TCP_TUNNEL
。
如果请求没有在日志中找到,说明请求时 Proxy 配置有问题。这是,可以用命令行测试,执行:
export http_proxy=http://192.168.0.125:3128;export https_proxy=http://192.168.0.125:3128; # 192.168.0.125 和 3128 需要根据实际替换
curl http://www.baidu.com/
然后到日志的最后查看是否多了一行请求 www.baidu.com 的记录。
更多字段可以参考:https://wiki.squid-cache.org/SquidFaq/SquidLogs#access.log