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)流程,全部实测

SquidSquid缓存2026/10/08

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 已把 Squid enable(开机自启)并交由 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.pidPID 文件
/lib/systemd/system/squid.servicesystemd 服务单元

确认关键文件:

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 -vSquid Cache: Version 5.9
which squid/usr/sbin/squid
默认配置/etc/squid/squid.conf(343KB,http_port 3128)
systemdenabled + active (running),ExecStartPre=... squid -z
cache_dirsquid -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。

参考链接