Squid Ubuntu 22.04 安装指南
在 Ubuntu 22.04 上通过 apt 安装 Squid 5.9,覆盖 apt update/install 回显、squid -v 版本确认、/etc/squid 关键路径、systemd 服务托管(enable/start/status)与 squid -z 初始化 cache_dir,并通过正向代理实测首次 MISS 二次 HIT(TCP_MISS/TCP_MEM_HIT)流程,全部实测
Squid Ubuntu 22.04 安装指南
目标:在 Ubuntu 22.04 真实环境通过 apt 安装 Squid(缓存代理,
squid守护进程),确认squid -v版本回显,掌握/etc/squid关键路径、systemd 服务托管(systemctl enable/start/status)与squid -z初始化cache_dir,最后实测正向代理缓存命中(TCP_MISS→TCP_MEM_HIT)。全部命令与回显均为本机实测结果。
环境信息
- 操作系统:Ubuntu 22.04.4 LTS(x86_64),内核
6.8.0-138-generic - 软件版本:
squid 5.9-0ubuntu0.22.04.7(Ubuntu 22.04 官方源最高可用版本) - 安装方式:apt 官方源在线安装
- 账号约定:root 账号,密码
q1w2e3r4(示例环境)
💡 Squid 是历史悠久的 HTTP 正向/反向缓存代理,核心是
squid守护进程与squid.conf配置。默认 http 监听端口3128(http_port 3128),典型缓存目录/var/spool/squid(cache_dir ufs ...),日志/var/log/squid/access.log与/var/log/squid/cache.log。本专栏第 2 篇用容器演示,本篇与其余篇一律在真实宿主机实测。
一、更新 apt 源并安装
Ubuntu 22.04 官方源仓库直接内置 Squid 5.x,无需额外 PPA:
apt-get update
apt-get install -y squid squidclient
📘
squid是核心包;squidclient提供缓存管理诊断命令(mgr:info等),单独一个包,需一并安装。
实测安装回显(关键部分):
正在解压 squid (5.9-0ubuntu0.22.04.7) ...
正在设置 squid-langpack (20200403-1) ...
正在设置 squ-common (5.9-0ubuntu0.22.04.7) ...
正在设置 squid (5.9-0ubuntu0.22.04.7) ...
Setcap worked! /usr/lib/squid/pinger is not suid!
Skipping profile in /etc/apparmor.d/disable: usr.sbin.squid
Created symlink /etc/systemd/system/multi-user.target.wants/squid.service → /lib/systemd/system/squid.service.
💡 回显末尾的
Created symlink ... squid.service说明 apt 已把 Squidenable(开机自启)并交由 systemd 托管。Squid 默认监听3128,且默认cache_dir在 Ubuntu 上是关闭的(见后文实测Swap maxSize 0),需按需开启。
二、确认版本
squid -v
实测回显(-v 输出首行即版本信息):
Squid Cache: Version 5.9
Service Name: squid
Ubuntu linux
configure options: '--build=x86_64-linux-gnu' '--prefix=/usr' ...
'--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap'
'--enable-cache-digests' '--enable-icmp' '--enable-ecap' '--with-systemd'
📘
5.9是 Ubuntu 22.04 官方仓库中的最新稳定版(Squid 6.x 需自行编译或使用容器镜像)。--enable-storeio显示支持ufs,aufs,diskd,rock等存储后端,--enable-cache-digests(缓存摘要)与--enable-icmp/pinger(ICP)是 cache peer 集群相关的关键特性。
三、安装产生的关键文件路径
| 路径 | 作用 |
|---|---|
/usr/sbin/squid | 主守护进程二进制 |
/usr/bin/squidclient | 缓存管理与诊断客户端(squidclient) |
/usr/sbin/squid → squid | 子命令入口 |
/etc/squid/squid.conf | 主配置(约 340KB,含大量注释与默认值) |
/etc/squid/conf.d/ | Debian 风格的分片配置目录(debian.conf) |
/var/spool/squid/ | cache_dir 交换目录 |
/var/log/squid/access.log | 访问日志(含 TCP_HIT/TCP_MISS 状态) |
/var/log/squid/cache.log | 缓存/运行日志(启动、peer、报错) |
/run/squid.pid | PID 文件 |
/lib/systemd/system/squid.service | systemd 服务单元 |
确认关键文件:
which squid squidclient
ls -l /etc/squid/
实测回显:
$ which squid squidclient
/usr/sbin/squid
/usr/bin/squidclient
$ ls -l /etc/squid/
total 360
drwxr-xr-x 3 root root 4096 10月 8 12:07 .
drwxr-xr-x 145 root root 12288 10月 8 12:07 ..
drwxr-xr-x 2 root root 4096 10月 8 12:07 conf.d
-rw-r--r-- 1 root root 1800 6月 13 22:32 errorpage.css
-rw-r--r-- 1 root root 343185 6月 13 22:32 squid.conf
💡 Ubuntu 的
squid.conf长达 300KB,几乎每个指令都自带注释与官方默认值。前http_port 3128已默认开启(第 2116 行附近),http_access访问控制规则位于1529-1565行附近。
四、systemd 服务托管
systemctl enable squid # 开机自启(apt 已默认做)
systemctl start squid # 启动
systemctl reload squid # 重载(实际走 squid -k reconfigure)
systemctl restart squid # 重启
systemctl status squid # 查看运行状态
实测 systemctl status 回显:
● squid.service - Squid Web Proxy Server
Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-10-08 12:07:39 CST; 10s ago
Docs: man:squid(8)
Process: 329223 ExecStartPre=/usr/sbin/squid --foreground -z
Main PID: 329226 (squid)
Tasks: 4 (limit: 57655)
Memory: 16.3M
systemd 单元的关键执行命令(systemctl cat squid):
ExecStartPre=/usr/sbin/squid --foreground -z
ExecStart=/usr/sbin/squid --foreground -sYC
💡
ExecStartPre=... squid -z表示启动前先初始化 cache_dir(若目录空会自动创建),这是 Debian/Ubuntu 体系的标准做法——真正开启cache_dir后的首次启动即由该钩子完成初始化,无需手动squid -z。
五、squid -z:初始化 cache_dir
cache_dir 是 Squid 落盘缓存的交换目录。默认 Ubuntu 配置未启用(Swap maxSize 0),开启后在启动前需用 squid -z 初始化目录结构(分 00~0F 16 个子目录 16 级层次)。
先确认当前默认 cache_dir 状态(实测未启用):
Swap maxSize 0 + 262144 KB, estimated 20164 objects
Setting Current Directory to /var/spool/squid
📘 第一行
Swap maxSize 0表示未启用磁盘缓存(262144 KB是内存cache_mem),此时 Squid 只做内存缓存不做落盘。开启cache_dir ufs /var/spool/squid 100 16 256后并用squid -z初始化,实测回显会创建完整哈希目录:
squid -f /etc/squid/squid.conf -z
实测 squid -z 创建目录结构的回显(自建实例):
kid1| Making directories in /var/spool/squid/00
kid1| Making directories in /var/spool/squid/01
kid1| Making directories in /var/spool/squid/0A
kid1| Making directories in /var/spool/squid/0F
kid1| Removing PID file (/var/tmp/sq/run/forward.pid)
初始化后的目录结构(ls /var/spool/squid/ 实测):
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
💡
cache_dir ufs <path> <M> <L1> <L2>:ufs是默认存储后端;100= 目录上限 100MB;16= 一级子目录数;256= 每级子目录 256 个交换文件槽。Squid 用 URL 哈希分布到这些子目录,squid -z就是预建这套层次避免首次写盘时逐个建目录。
六、实测:正向代理缓存命中(MISS → HIT)
这一节打通「Squid 正代 → 本机 HTTP 后端 → 缓存命中」的完整链路,为后续配置与集群篇做铺垫。
开启 cache_dir 并用后台 http.server 模拟后端(端口 20090,返回带静态内容与过去时间戳的对象,便于观察命中)。连续三次请求同一 URL:
curl -s -x http://127.0.0.1:3128 http://127.0.0.1:20090/hit.txt
curl -s -x http://127.0.0.1:3128 http://127.0.0.1:20090/hit.txt
curl -s -x http://127.0.0.1:3128 http://127.0.0.1:20090/hit.txt
观察 access.log(/var/log/squid/access.log 或自建实例的 access_log 路径),实测回显:
1791433455.646 1 127.0.0.1 TCP_MISS/200 385 GET http://127.0.0.1:20090/hit.txt - HIER_DIRECT/127.0.0.1 text/plain
1791433455.655 0 127.0.0.1 TCP_MEM_HIT/200 391 GET http://127.0.0.1:20090/hit.txt - HIER_NONE/- text/plain
1791433455.663 0 127.0.0.1 TCP_MEM_HIT/200 391 GET http://127.0.0.1:20090/hit.txt - HIER_NONE/- text/plain
📘 关键一列是
TCP_MISS/TCP_MEM_HIT/TCP_HIT:首次请求TCP_MISS/200且HIER_DIRECT/127.0.0.1(正代直连后端拿对象);后续请求TCP_MEM_HIT/200且HIER_NONE/-(纯内存命中,不再访问后端)。TCP_MEM_HIT是「内存中直接命中」,TCP_HIT是「磁盘缓存命中」,两者都代表命中缓存。
用 curl -D 观察响应头,实测命中时带 X-Cache 与 Via:
X-Cache: HIT from squid-forward
X-Cache-Lookup: HIT from squid-forward:3128
Via: 1.1 squid-forward (squid/5.9)
💡
X-Cache: HIT即缓存命中;Via头记录经过的代理链(squid/5.9),这是判断流量确实经 Squid 转发的最直观证据。X-Cache-Lookup的MISS与响应体X-Cache的HIT组合分别标记「缓存查找结果」与「本次响应来源」。
七、安装验证汇总
| 验证点 | 实测结果 |
|---|---|
apt-get install -y squid squidclient | 安装 squid 5.9-0ubuntu0.22.04.7 与 squidclient 5.9 |
squid -v | Squid Cache: Version 5.9 |
which squid | /usr/sbin/squid |
| 默认配置 | /etc/squid/squid.conf(343KB,http_port 3128) |
| systemd | enabled + active (running),ExecStartPre=... squid -z |
| cache_dir | squid -z 建 00~0F 目录;默认 Swap maxSize 0 |
| 缓存命中 | 首次 TCP_MISS/200 HIER_DIRECT,后续 TCP_MEM_HIT/200 HIER_NONE |
| 响应头 | X-Cache: HIT,Via: 1.1 ... squid/5.9 |
八、常见问题(FAQ)
Q1:squid -v 提示找不到命令?
A:未安装成功或 PATH 不含 /usr/sbin。先 apt-get install -y squid 再 apt list --installed | grep squid 确认;任一 root 登录用户均应在 PATH 中包含 /usr/sbin。
Q2:systemctl start squid 起不来?
A:多半是 squid.conf 语法错误、端口被占用或 cache_dir 目录属主不对。先 squid -k parse 校验配置(见下);再 journalctl -u squid / tail /var/log/squid/cache.log 看报错。
Q3:默认装好能用吗?
A:能启动、监听 3128,但 Ubuntu 默认 cache_dir 是关闭的(Swap maxSize 0),且 http_access 仅允许 localhost。生产需自行开启 cache_dir、放宽 acl/http_access 并 squid -k reconfigure。
Q4:改配置用 systemctl reload 还是 restart?
A:语法级变更推荐 systemctl reload squid(等价 squid -k reconfigure,热生效不断线);改 cache_dir、http_port 等需重启才生效的用 systemctl restart squid。
参考链接
- Squid 官网:http://www.squid-cache.org/
- Squid 5.9 文档:http://www.squid-cache.org/Doc/
- Ubuntu squid 软件包:https://packages.ubuntu.com/jammy/squid