Squid 完全指南 / 16 - 最佳实践
第十六章:最佳实践
16.1 配置规范
16.1.1 配置文件组织
# /etc/squid/squid.conf — 推荐的配置结构
# ============================================================
# Section 1: 网络端口
# ============================================================
http_port 3128
# https_port 443 ...
# ============================================================
# Section 2: ACL 定义
# ============================================================
# --- 网络 ACL ---
acl localnet src 192.168.0.0/16
acl localhost src 127.0.0.0/8 ::1
# --- 端口 ACL ---
acl Safe_ports port 80 443 21 70 8080 8443
acl SSL_ports port 443 8443
# --- 方法 ACL ---
acl CONNECT method CONNECT
# --- 时间 ACL ---
acl work_hours time MTWHF 08:30-18:00
# --- 认证 ACL ---
acl auth proxy_auth REQUIRED
# --- 内容 ACL ---
acl blocked_sites dstdomain "/etc/squid/blocked.txt"
# ============================================================
# Section 3: 认证配置
# ============================================================
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Proxy
auth_param basic credentialsttl 2 hours
# ============================================================
# Section 4: 访问控制规则
# ============================================================
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow localnet
http_access deny !auth
http_access deny blocked_sites
http_access deny all
# ============================================================
# Section 5: 缓存配置
# ============================================================
cache_dir ufs /var/spool/squid 10000 16 256
cache_mem 512 MB
maximum_object_size 128 MB
refresh_pattern -i \.(jpg|png|gif|css|js)$ 1440 90% 43200
refresh_pattern . 60 20% 1440
# ============================================================
# Section 6: 日志配置
# ============================================================
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
# ============================================================
# Section 7: 安全配置
# ============================================================
via off
forwarded_for delete
httpd_suppress_version_string on
visible_hostname proxy.example.com
# ============================================================
# Section 8: 性能参数
# ============================================================
# memory_replacement_policy heap GDSF
# cache_replacement_policy heap GDSF
# pipeline_prefetch on
16.1.2 配置管理
# 版本控制配置文件
cd /etc/squid
git init
git add squid.conf
git commit -m "Initial squid config"
# 修改前备份
cp squid.conf squid.conf.$(date +%Y%m%d%H%M%S)
# 修改后验证
squid -k parse && echo "Config OK" || echo "Config ERROR"
# 热重载
squid -k reconfigure
# 配置差异比较
diff squid.conf.bak squid.conf
16.2 企业正向代理方案
16.2.1 架构设计
┌──────────────────────────────────────────────────────────────┐
│ 企业正向代理架构 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 员工PC │ │ 员工PC │ │ 员工PC │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ └────────────┼────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ PAC / WPAD 自动配置 │ │
│ └──────────────────┬───────────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ Squid 集群(正向代理) │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Squid-1 │ │ Squid-2 │ ← 负载均衡 │ │
│ │ │ (Active) │ │ (Standby)│ │ │
│ │ └────┬─────┘ └────┬─────┘ │ │
│ └───────┼──────────────┼────────────────────┘ │
│ └──────┬───────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ 上游代理 / 互联网出口 │ │
│ └──────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
16.2.2 高可用配置
#!/bin/bash
# squid-ha-failover.sh — Squid 高可用故障转移脚本
PRIMARY="192.168.1.10"
SECONDARY="192.168.1.11"
VIP="192.168.1.1"
check_squid() {
curl -s -o /dev/null -w "%{http_code}" \
--max-time 5 \
http://$1:3128/squid-internal-mgr/info
}
# 检查主节点
if [ "$(check_squid $PRIMARY)" != "200" ]; then
echo "Primary Squid is down, switching to secondary"
# 更新 VIP 指向
ip addr del $VIP/24 dev eth0 2>/dev/null
ssh root@$SECONDARY "ip addr add $VIP/24 dev eth0"
fi
16.3 企业反向代理/CDN 方案
16.3.1 多级缓存架构
┌──────────────────────────────────────────────────────┐
│ CDN 多级缓存架构 │
│ │
│ Level 1: 边缘节点(Squid) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 北京节点 │ │ 上海节点 │ │ 广州节点 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ └────────────┼────────────┘ │
│ ▼ │
│ Level 2: 区域节点(Squid 父代理) │
│ ┌──────────┐ ┌──────────┐ │
│ │ 华北区域 │ │ 华南区域 │ │
│ └────┬─────┘ └────┬─────┘ │
│ └────────────┼───────────┘ │
│ ▼ │
│ Level 3: 源站集群 │
│ ┌──────────────────────────────────┐ │
│ │ Web Server 1 | 2 | 3 | ... │ │
│ └──────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
16.3.2 边缘节点配置
# 边缘节点配置
http_port 80
https_port 443 cert=/etc/squid/ssl/site.pem
# 区域父代理
cache_peer parent-huabei.example.com parent 80 0 \
no-query default weight=10
# 缓存配置
cache_dir aufs /var/spool/squid 50000 256 4096
cache_mem 4096 MB
maximum_object_size 256 MB
# 缓存策略
refresh_pattern -i \.(jpg|png|gif|css|js|woff2|mp4)$ 1440 90% 43200
refresh_pattern . 60 20% 1440
# 安全
via off
forwarded_for delete
16.4 安全审计方案
16.4.1 完整审计配置
# /etc/squid/squid.conf — 审计模式配置
# 详细日志格式(包含完整请求信息)
logformat audit %ts.%03tu %6tr %>a %[un %Ss/%03>Hs %<st %rm %ru %Sh/%<a %mt %>ha{User-Agent} %ssl::>sni
access_log /var/log/squid/access.log audit
# 不遗漏任何请求
# 不使用 access_log ... squid !internal 过滤
# 保留完整请求头(调试用,生产环境慎用)
# log_mime_hdrs on
# 日志轮转 180 天(合规要求)
# logrotate 配置 rotate 180
# SSL Bump 解密 HTTPS(需要合规授权)
# http_port 3129 ssl-bump cert=...
# ssl_bump bump all
# 禁止删除日志
# 通过文件系统权限限制
16.5 容量规划指南
16.5.1 用户规模与硬件对应
| 用户数 | CPU | 内存 | 磁盘 (缓存) | 网络 | 架构 |
|---|
| 50 | 2核 | 4 GB | 200 GB SSD | 1 Gbps | 单节点 |
| 200 | 4核 | 8 GB | 500 GB SSD | 1 Gbps | 单节点 |
| 500 | 8核 | 16 GB | 1 TB SSD | 1 Gbps | 主备 |
| 1000 | 16核 | 32 GB | 2 TB SSD | 10 Gbps | 集群(2节点) |
| 5000 | 32核 | 64 GB | 4 TB SSD | 10 Gbps | 集群(3-5节点) |
| 10000+ | 64核+ | 128 GB+ | 分布式 | 多链路 | 多级缓存 |
16.5.2 带宽计算
日均用户数 × 平均请求数 × 平均对象大小 = 日总流量
示例(1000 企业用户):
1000 × 300 请求/天 × 150 KB = 45 GB/天
45 GB / 86400 秒 ≈ 520 KB/s ≈ 4.2 Mbps 平均
峰值带宽:4.2 Mbps × 3 ≈ 13 Mbps
缓存节省(假设 60% 命中率):
实际出口带宽需求:13 Mbps × (1 - 0.6) = 5.2 Mbps
16.6 备份与恢复
16.6.1 备份策略
#!/bin/bash
# squid-backup.sh — Squid 备份脚本
BACKUP_DIR="/backup/squid/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
# 备份配置
tar czf "$BACKUP_DIR/config.tar.gz" /etc/squid/
# 备份密码文件
cp /etc/squid/passwd "$BACKUP_DIR/"
cp /etc/squid/ssl/* "$BACKUP_DIR/" 2>/dev/null
# 备份缓存索引(不备份缓存数据,太大)
cp /var/spool/squid/swap.state "$BACKUP_DIR/" 2>/dev/null
# 备份日志(最近 7 天)
find /var/log/squid/ -name "*.log*" -mtime -7 \
-exec cp {} "$BACKUP_DIR/" \;
# 清理 30 天前的备份
find /backup/squid/ -mtime +30 -exec rm -rf {} \; 2>/dev/null
echo "Backup completed: $BACKUP_DIR"
16.6.2 恢复步骤
#!/bin/bash
# squid-restore.sh — Squid 恢复脚本
BACKUP_DIR="$1"
if [ -z "$BACKUP_DIR" ]; then
echo "Usage: $0 /backup/squid/20260510"
exit 1
fi
# 停止服务
sudo systemctl stop squid
# 恢复配置
sudo tar xzf "$BACKUP_DIR/config.tar.gz" -C /
# 恢复密码文件
sudo cp "$BACKUP_DIR/passwd" /etc/squid/
# 恢复 SSL 证书
sudo cp "$BACKUP_DIR"/*.pem /etc/squid/ssl/ 2>/dev/null
# 检查配置
sudo squid -k parse
# 重建缓存目录(如果缓存数据丢失)
sudo squid -z
# 启动
sudo systemctl start squid
echo "Restore completed from: $BACKUP_DIR"
16.7 变更管理
16.7.1 变更流程
1. 需求评审
└─ 评估影响范围、风险等级
2. 配置准备
└─ 编写配置、语法检查
3. 测试验证
└─ 在测试环境验证功能
4. 审批
└─ 运维主管审批
5. 实施
└─ squid -k parse → squid -k reconfigure
6. 验证
└─ 功能测试、性能监控
7. 回滚
└─ 如有问题,恢复备份配置
16.7.2 变更检查清单
# 变更前
□ 备份当前配置
□ squid -k parse 语法检查
□ 记录变更内容和原因
# 变更中
□ squid -k reconfigure 热重载
□ 观察 cache.log 错误
# 变更后
□ 功能验证测试
□ 性能指标检查
□ 日志检查
□ 通知相关人员
□ 更新文档
16.8 运维自动化
16.8.1 Ansible 部署
# ansible/playbook.yml
---
- name: Deploy Squid Proxy
hosts: squid_servers
become: yes
tasks:
- name: Install Squid
apt:
name: squid
state: present
update_cache: yes
- name: Copy config
template:
src: squid.conf.j2
dest: /etc/squid/squid.conf
owner: root
group: proxy
mode: '0640'
notify: Restart Squid
- name: Ensure cache directory
file:
path: /var/spool/squid
state: directory
owner: proxy
group: proxy
mode: '0750'
- name: Initialize cache
command: squid -z
when: squid_config.changed
- name: Enable and start
systemd:
name: squid
state: started
enabled: yes
handlers:
- name: Restart Squid
systemd:
name: squid
state: restarted
16.8.2 监控脚本
#!/bin/bash
# squid-health-monitor.sh — 定时健康检查
PROXY="localhost:3128"
ALERT_EMAIL="[email protected]"
# 检查进程
if ! pgrep squid > /dev/null; then
echo "Squid down at $(date)" | mail -s "SQUID ALERT" $ALERT_EMAIL
systemctl restart squid
fi
# 检查缓存命中率
HIT_RATIO=$(squidclient -h localhost mgr:info | grep "Request Hit Ratios" | grep -oP '\d+\.\d+' | head -1)
if (( $(echo "$HIT_RATIO < 30" | bc -l) )); then
echo "Low cache hit ratio: $HIT_RATIO%" | mail -s "SQUID WARNING" $ALERT_EMAIL
fi
# 检查错误率
TOTAL=$(tail -1000 /var/log/squid/access.log | wc -l)
ERRORS=$(tail -1000 /var/log/squid/access.log | grep -c "TCP_DENIED\|TCP_ERROR")
if [ $TOTAL -gt 0 ]; then
ERROR_RATE=$((ERRORS * 100 / TOTAL))
if [ $ERROR_RATE -gt 10 ]; then
echo "High error rate: $ERROR_RATE%" | mail -s "SQUID WARNING" $ALERT_EMAIL
fi
fi
16.9 文档模板
16.9.1 标准操作手册模板
# Squid 标准操作手册
## 基本信息
- 服务器:proxy.example.com
- IP:192.168.1.1
- 端口:3128
- 版本:Squid 6.10
- 管理员:[email protected]
## 日常操作
- 查看状态:systemctl status squid
- 重载配置:squid -k reconfigure
- 查看日志:tail -f /var/log/squid/access.log
## 紧急操作
- 重启:systemctl restart squid
- 停止:systemctl stop squid
- 清缓存:rm -rf /var/spool/squid/* && squid -z
## 联系方式
- 主管:[email protected]
- 供应商:[email protected]
16.10 检查清单总结
部署前检查清单
□ 硬件资源满足容量规划
□ 操作系统版本兼容
□ Squid 版本选择(5.x/6.x)
□ 配置文件语法验证
□ SSL 证书准备(如需要)
□ 防火墙规则配置
□ 日志轮转配置
□ 监控和告警配置
□ 备份策略确定
□ 文档完成
安全检查清单
□ 不是开放代理(http_access deny all)
□ 监听内网接口
□ 认证已启用
□ ACL 规则顺序正确
□ SSL/TLS 版本安全
□ 版本信息已隐藏
□ 日志保留策略符合合规
□ 文件权限正确
□ fail2ban 已配置
性能检查清单
□ 文件描述符限制已调高
□ TCP 内核参数已优化
□ 缓存目录使用 SSD
□ cache_mem 设置合理
□ 存储后端选择合适(AUFS/Rock)
□ DNS 缓存已启用
□ 持久连接已启用
□ 日志异步写入
16.11 本章小结
| 实践领域 | 要点 |
|---|
| 配置规范 | 分区组织、版本控制、变更管理 |
| 高可用 | 主备/集群、故障转移、健康检查 |
| 缓存架构 | 多级缓存、CDN 边缘、父代理 |
| 安全审计 | 完整日志、HTTPS 解密、合规保留 |
| 容量规划 | 用户规模→硬件→带宽→架构 |
| 运维自动化 | Ansible 部署、脚本监控、告警 |
扩展阅读