Linux之代理服务器squid配置与实战场景解析
1. Squid代理服务器基础入门Squid是一款开源的代理缓存服务器软件它能够显著提升网络访问速度并节省带宽资源。我第一次接触Squid是在2013年为一个企业内网部署统一上网出口时当时就被它强大的缓存能力和灵活的配置所吸引。简单来说Squid就像是一个网络中间商。当客户端请求访问某个网站时请求会先发送到Squid服务器。如果Squid的缓存中已经有这个网站的内容它会直接返回给客户端如果没有Squid会代表客户端去获取内容在返回给客户端的同时保留一份副本。下次再有相同请求时就能快速响应了。Squid支持多种协议包括HTTP/HTTPS最常见的网页浏览协议FTP文件传输协议GOPHER早期互联网协议现在很少用了在实际工作中我发现Squid特别适合以下场景企业内网统一上网出口管理服务器集群通过单台机器访问外网加速重复访问的网站内容作为开发测试环境的外部访问代理2. 安装与基础配置2.1 安装Squid服务在CentOS系统上安装Squid非常简单一条命令就能搞定yum install -y squid安装完成后系统会自动创建几个重要目录和文件/etc/squid/squid.conf主配置文件/var/log/squid/日志目录/var/spool/squid/缓存目录启动Squid服务的命令是systemctl start squid systemctl enable squid # 设置开机自启2.2 基础网络配置Squid默认监听3128端口我们可以通过netstat命令验证netstat -tnlp | grep squid如果系统启用了防火墙需要放行这个端口firewall-cmd --add-port3128/tcp --permanent firewall-cmd --reload2.3 配置文件详解Squid的主配置文件是/etc/squid/squid.conf里面有很多参数可以调整。新手最容易上手的几个关键参数是# 允许访问的客户端IP范围 acl localnet src 192.168.1.0/24 # 监听端口可以改为其他端口如8080 http_port 3128 # 访问控制规则允许localnet定义的网络 http_access allow localnet修改配置后记得重启服务生效systemctl restart squid3. 高级配置实战3.1 用户认证配置为了安全考虑我们通常会给代理加上认证。Squid支持多种认证方式最常用的是basic认证# 安装认证工具 yum install -y httpd-tools # 创建密码文件首次创建加-c参数 htpasswd -c /etc/squid/passwd proxy_user然后在配置文件中添加auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd auth_param basic children 5 auth_param basic realm Squid Proxy auth_param basic credentialsttl 2 hours acl auth_user proxy_auth REQUIRED http_access allow auth_user3.2 缓存优化配置Squid的缓存性能可以通过以下参数优化# 内存缓存大小根据服务器内存调整 cache_mem 256 MB # 磁盘缓存目录和大小 cache_dir ufs /var/spool/squid 5000 16 256 # 缓存刷新规则 refresh_pattern . 1440 20% 100803.3 访问控制列表Squid的ACL功能非常强大可以实现精细化的访问控制# 定义工作时间段 acl workhours time MTWHF 09:00-18:00 # 定义禁止访问的网站 acl badsites dstdomain .facebook.com .twitter.com # 应用规则 http_access deny badsites workhours4. 典型应用场景4.1 内网服务器统一出口假设我们有3台服务器代理服务器可访问外网IP192.168.1.10应用服务器A内网IP192.168.1.20应用服务器B内网IP192.168.1.30配置步骤在代理服务器上安装配置Squid在内网服务器上设置环境变量echo export http_proxyhttp://192.168.1.10:3128 /etc/profile echo export https_proxyhttp://192.168.1.10:3128 /etc/profile source /etc/profile4.2 Docker容器代理配置Docker的代理配置比较特殊需要修改服务配置mkdir -p /etc/systemd/system/docker.service.d cat /etc/systemd/system/docker.service.d/http-proxy.conf EOF [Service] EnvironmentHTTP_PROXYhttp://192.168.1.10:3128 EnvironmentHTTPS_PROXYhttp://192.168.1.10:3128 EnvironmentNO_PROXYlocalhost,127.0.0.1,192.168.1.0/24 EOF systemctl daemon-reload systemctl restart docker4.3 Kubernetes集群代理对于K8s节点可以通过以下方式配置代理# 配置yum代理 echo proxyhttp://192.168.1.10:3128 /etc/yum.conf # 配置kubelet代理 mkdir -p /etc/systemd/system/kubelet.service.d cat /etc/systemd/system/kubelet.service.d/proxy.conf EOF [Service] EnvironmentHTTP_PROXYhttp://192.168.1.10:3128 EnvironmentHTTPS_PROXYhttp://192.168.1.10:3128 EOF systemctl daemon-reload systemctl restart kubelet5. 监控与排错5.1 日志分析Squid的主要日志文件/var/log/squid/access.log访问日志/var/log/squid/cache.log缓存日志查看实时日志tail -f /var/log/squid/access.log5.2 性能监控可以使用squidclient工具查看运行状态squidclient mgr:info squidclient mgr:mem5.3 常见问题解决问题1客户端连接被拒绝检查防火墙设置确认Squid服务正常运行检查配置文件中的acl规则问题2认证失败确认密码文件路径正确检查文件权限squid用户需要可读确认配置中的认证模块路径正确问题3缓存不生效检查磁盘空间是否充足确认缓存目录权限正确检查refresh_pattern配置6. 安全加固建议定期更新保持Squid版本最新修复已知漏洞最小权限运行Squid使用专用账户限制权限日志审计定期检查访问日志发现异常行为防火墙规则只允许必要IP访问代理端口加密传输考虑配置SSL加密代理连接一个加固过的配置示例# 限制管理接口访问 acl manager proto cache_object acl localhost src 127.0.0.1/32 http_access allow manager localhost http_access deny manager # 防止缓存污染 acl purge method PURGE http_access deny purge # 防止IP欺骗 acl spoof_client src 0.0.0.0/32 http_access deny spoof_client7. 性能调优技巧根据多年经验以下调优方法效果显著内存分配将cache_mem设置为物理内存的1/3左右缓存分区使用多个cache_dir分散IO压力DNS优化配置positive_dns_ttl减少DNS查询文件描述符增加Squid的文件描述符限制调整文件描述符限制的方法echo squid - nofile 65535 /etc/security/limits.conf然后在squid.conf中添加max_filedescriptors 655358. 实际案例分享去年我为一家电商公司部署Squid时遇到一个有趣的问题他们的商品图片服务器在国外国内访问很慢。通过在多地域部署Squid缓存节点配合智能DNS解析最终将图片加载时间从3秒降低到0.5秒以内。关键配置点调整缓存策略优先缓存图片等静态资源配置层次化缓存多个Squid节点形成缓存树优化refresh_pattern延长热门商品的缓存时间refresh_pattern -i \.(jpg|png|gif|css|js)$ 1440 50% 10080这个案例让我深刻体会到合理的缓存策略能带来巨大的性能提升。