- Squid 介绍
- 代理服务器概念
- Squid 安装
- Squid 常规配置
- Squid 访问控制
- Squid 多级代理配置
- Squid 实验
- cachemgr.cgi 管理 Squid
- Squid 日志
- Squid 调优
- 参考文章
Squid 介绍
Squid 是一个支持 HTTP、HTTPS、FTP 等服务的 Web 缓存软件,可通过缓存页面实现降低带宽占用并优化页面相应时间。
Squid 特点与功能:
- 不仅能缓存 Web 页面资源,还能对 DNS 查询结果进行缓存
- 强大的访问控制功能
- 保护内网,并加速内网对外网的连接
- 记录内网用户访问外网行为
- 提供用户认证
- 减少出口流量
- 工作在 TCP/IP 的应用层,TCP 端口 3128
Squid 支持的网络协议:HTTP、FTP、Gopher(信息查找协议)、WAIS(广域信息查询系统)、SSL
Squid 支持的内部缓存和管理协议:HTTP、ICP(互联网缓存协议,用于从缓存中查找指定对象)、Cache Digests(用于生成缓存中对象的索引)、SNMP(用于为外部工具提供缓存信息)、HTCP(用于发现 HTTP 缓存区,存储管理 HTTP 数据)
Squid 请求过程:
- 客户端访问 Squid 服务器,由代理服务器代表客户端向 web 服务器(后端 Real Server)请求资源
- Web 服务器将相应数据返回给代理服务器
- 代理服务器将数据返回给客户端,并保留一份在本地
- 其他客户端向该代理服务器请求相同的资源
- 代理服务器直接将本地的该资源缓存返回给客户端
squid 的硬件环境:内存与磁盘是缓存性能的重要体现。所有对象都会尽可能缓存到内存中,更大的磁盘空间实现更多的缓存目标和更高的命中率,最好使用 SAS,尽量不用 SATA。磁盘与内存间也有关联,最好每 G 的磁盘空间有 32M 的内存对应。
代理服务器概念
代理服务器一般构建于内网和 Internet 间,负责转发内网对 Internet 的访问,并进行访问控制与记录,可实现安全保护、缓存数据、内容过滤、访问控制等功能。
Web 代理维护着庞大的缓存数据,因此对内存和硬盘的要求很高,更大的内存和硬盘意味着更多的缓存和更高的缓存命中率。
Web 缓存类型:
- 客户端缓存:一般就存放在浏览器中。有两个缺点:1.缓存容量小,不能存储大的 Web 对象,因此命中率较低。2.缓存在本地,不能共享,因此存在大量重复数据。
- 代理服务器缓存:位于网络中间位置。容量大,缓存能与内网所有客户端共享。但若性能达不到要求,反而会造成网络瓶颈。代理缓存应具有健壮性、可扩展性、稳定性、负载均衡的特点
- 服务器缓存:是为了减轻 web 服务器的负载,并不是为了提高资源命中率。服务器缓存减少了 web 服务器的流量、并保护了 web 服务器的安全,因为 web 服务器仅向服务器缓存提供数据,并不直接面向客户机。并且提高了网站的可靠性,因为各个服务器缓存间可实现共享。
三种典型代理方式:
传统代理:在浏览器中设置,指出代理服务器的 IP 地址和网络端口。便于用户对访问管理控制,配置简单。
透明代理(正向代理):为内网提供外网的访问,即普通的代理服务器。但增加了网络设备的负担,并需要做好更详细的配置,会有一定的延时。若程序的一系列请求是相关的并涉及多个目标对象,有可能会出问题。
反向代理:能代理外部网络访问内网服务器。主要为本地网站做缓存,加快 web 服务器的响应速度。相当于服务器缓存。反向代理结合智能 DNS 即可实现基本的 CDN
Squid 安装
Squid 版本:3.5
可直接通过yum install squid
安装。然后systemctl start squid
启动。
安装时会自动创建用户 squid,并且是系统用户,家目录为/var/spool/squid,且禁止登录。
注:一定要做到 squid 服务器的时间同步,否则无法进行缓存
Squid 的相关配置文件:
/etc/httpd/conf.d/squid.conf
:用于在 Apache 中添加运行cachemgr.cgi
的配置/etc/logrotate.d/squid
:Squid 的日志轮替配置/etc/squid/squid.conf
:Squid 主配置文件/etc/squid/cachemgr.conf
:设置可通过cachemgr.cgi
管理的主机/etc/squid/mime.conf
:定义 MIME 类型的文件
Squid 其他相关文件:
/var/log/squid/
:存放 squid 日志的目录/var/spool/squid/
:存放 squid 缓存的目录/usr/share/squid/errors/
:存放给客户端的报错信息 HTML,目录中包含各个语言的子目录/usr/lib64/squid/cachemgr.cgi
:squid cache manager,用于管理主机的动态网页
squid 提供两个命令:
squid
:用于管理 squid 守护进程squidclinet
:用于管理 squid 客户端
squid [options] |
squidclient [Basic Options] [HTTP Options] |
Squid 常规配置
http_port 3128 [模式] [options] #Squid监听的端口 |
Squid 会设置在缓存目录下建立多个目录,每个目录又建立多个子目录,在最里层的目录存放缓存文件,缓存文件是通过对客户端请求的 URL 进行哈希运算生成的。Squid 会在内存建立一张哈希表,记录硬盘中缓存文件配置的情形。
使用squid -k parse
检查配置文件语法,确认没有报错后squid -z
初始化缓存目录,会显示Making directories in /var/spool/squid/00
等信息,发现,第一层的目录数量是 16,第二层目录的数量是 256,目录名都是由十六进制标号,与配置文件cache_dir
配置的一致。若无法创建,可能是该目录的权限问题。
再使用squid -N -d1
测试,没有报错,则说明启动完成。
通过浏览器测试,设置代理服务器
Squid 访问控制
acl name type value1 value2... #设置ACL名字和对象的值 |
常见的 ACL 类型:
类型 | 含义 |
---|---|
src | 源 IP 地址,可以单个 IP 地址,可以是地址范围 |
dst | 目的 IP 地址,同上 |
myip | 本地网络接口 IP 地址 |
srcdomain | 客户所属的域,Squid 会根据客户 IP 地址进行反向 DNS 查询 |
dstdomain | 服务器所属的域,与客户请求的 URL 匹配 |
time | 时间段 |
port | 指向其他计算机的网络端口,即是目标服务器上的端口 |
myport | 指向 squid 服务器的端口,是 squid 服务器上的端口 |
proto | 客户端请求所使用的协议,如 http、https、ftp、gopher |
method | HTTP 请求方法 |
proxy_auth | squid 认证的用户名 |
url_regex | 关于 URL 的正则表达式(域名) |
urlpath_regex | 关于 URL 资源的正则表达式(资源路径,不带有域名) |
ident | 指定用户 |
acl 对象的值间的关系为”或“,只要满足一个就匹配了该 acl 规则。而 http_access 与其他规则的设置使用”与“逻辑。squid 默认配置拒绝每个请求,因此在使用代理前,必须先添加访问控制规则。
若 value 为文件名,对象的值实际上是文件的内容。
常见案例:
Squid3已默认定义acl名:all、localhost、manager、to_localhost |
squid 默认 acl 配置:
#所有内网 |
Squid 多级代理配置
在大型网络中一台 Squid 服务器的性能不能应对巨大的访问量,需要构建多级代理服务器,类似与计算机集群,使用 ICP 交换缓存,形成一个逻辑上的大型 Squid 服务器。
代理服务器间的结构可分为:同级结构、层次结构、网状结构。最常见是层次结构。
需要配置参数cache_peer hostname type http_port icp_port options
hostname
为另一台 Squid 服务器的域名或 IP 地址type
为 ICP 请求的类型:parent
或sibling
http_port
为对端的 Squid 监听请求端口icp_port
为对端 ICP 的端口
ICP 的两种请求类型 type:
parent
:会把客户端的请求发送给对方,对方的缓存中若有请求的数据,则返回,若没有,则对方向 web 服务器读取数据,再返回。(类似 DNS 的递归查询)一般对象处于上一级时使用此类型,因为上一级会更加接近于 web 服务器。sibling
:不会把客户端请求发给对方,仅仅询问有没有缓存。如果没有,则对方仅仅告诉回复没有,并不会向 web 服务器请求数据。一般对象处于同等级别时用此类型。de
常见的 options 参数:
选项 | 含义 |
---|---|
proxy-only | 从对方得到的数据不做缓存,默认会做 |
weight=n | 指定对方的权重,有多个 cache_peer 时会按权重选择,默认根据网络响应时间自动选择 |
no-query | 不向对方发送 ICP 请求,只发送 HTTP 代理请求,一般用于对方不支持 ICP 或不可用的情况 |
default | 与 no-query 一起用,当对方都不支持 ICP 时,就用该 peer |
no-digest | 不使用内存摘要表查询,直接 ICP 通信 |
login=user:password | 若对方需要认证,就提供用户名和密码 |
示例:
cache_peer system3.example.com parent 3128 3130 proxy-only default |
若要通过规则选择不同的上级代理服务器,达到负载均衡,还需要配置:
cache_peer_domain cache-host domain ...
cache_peer_access cache-host allow|deny [!]ACL对象...
示例:
cache_peer system1.example.com parent 3128 3130 |
Squid 实验
透明二级代理
环境:
- client1:192.168.1.128
- server1:192.168.1.129
- server2:192.168.1.130,192.168.205.140
- web1:192.168.205.139
server1 上的配置squid.conf
添加或修改以下内容:
http_port 3128 accel #配置为透明代理 |
并且需要进行端口转发,即重定向,因为代理服务器需要将客户端发往 80 端口的数据包改为发往自己的 3128 端口,实现代理。因此需要开启防火墙 firewalld 或 iptables 服务。
若是使用 firewalld,则先要确定是否开启了伪装 IP 功能(Masquerade)
firewall-cmd --query-masquerade
,若为 no,则需要开启firewall-cmd --add-masquerade --permanent
。
设置端口转发:firewall-cmd --add-forward-port=port=80:proto=tcp:toport=3128 --permanent
若为 iptables,则添加两条规则:
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j --REDIRECT --to-ports=3128 |
然后打开转发,无论是 firewalld 还是 iptables,都要打开。
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf |
最后放行 80 和 443 端口,放行 http 和 https 服务
firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp |
反向二级代理
cachemgr.cgi 管理 Squid
通过 web 界面管理 Squid,需要cachemgr.cgi
动态网页文件,存放在/usr/lib64/squid/
中。可以将该 cgi 文件复制到/var/www/cgi-bin
中,也可不动,但要注意文件的权限问题,一定要改为apache
。然后在 httpd 的主配置文件中添加,Location 配置
ScriptAlias "/squidcgi" "/var/www/cgi-bin/cachemgr.cgi" |
然后浏览器通过主机IP/squidcgi
访问。
默认不需要填用户名密码即可登录。若要设置登录用户名密码,只需要在主配置文件中添加cachemgr_password
参数。
cachemgr 密码 行为action |
Squid 日志
Squid 日志不仅记录服务器进程的运行,还记录用户的访问情况、缓存存储状况、缓存访问状况等。
Squid 三个日志:access.log,cache.log,store.log
和日志文件相关的配置:
cache_log /var/log/squid/cache.log
:指定缓存信息日志的路径。包含了缓存的起始配置信息,分类的错误信息,性能警告。cache_store_log /var/log/squid/store.log
:指定对象存储记录日志的路径。包含被写入缓存空间的对象、被从缓存空间清除的对象等。可设为none
禁止cache_swap_log /var/spool/squid/cache_swap.log
:指定每个交换日志的路径。包含存储在交换空间的对象元数据。这类日志最好不要删除,否则可能会导致 Squid 故障。debug_options ALL,1
:控制日志记录内容的多少,第一个参数决定对哪些行为做记录,ALL 表示对所有行为做记录,第二个参数表示详细程度,1 表示详细程度最低。log_fqdn
:控制 access.log 日志中客户机地址的记录方式。on 表示会记录客户机的域名,off 则记录 IP 地址。开启会增加系统负担
logformat squid %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt
是在配置文件中日志格式的参数配置。%ts.03tu
:记录请求完成时间。%ts
为相对于 Unix 纪元(1970-1-1)的秒数,%03tu
表示 3 个宽度的毫秒数,.
为写入日志的固定符号。%6tr
:响应时间,表明了 Squid 处理请求的时间(接收到 HTTP 请求到响应报文发出),单位毫秒。ICP 响应时间一般为 0,非常快速。%>a
:记录客户端地址,若开启了log_fqdn
,则会记录客户端主机名。还可通过client_netmask
隐藏客户端 IP 的一部分%Ss/%03Hs
:记录请求结果和状态码,%Ss
是 Squid 特有的请求结果码,%03Hs
是 HTTP 状态码%<st
:记录传输的字节数。是整个数据包的大小,会比实际载荷信息大。%rm
:记录请求的方法。HTTP 的常见请求和 ICP 的 ICP_QUERY 请求%ru
:记录客户端请求的 URI。默认不会记录 URL 中第一个?
后所有信息%un
:记录客户端用户身份。Squid 使用 RFC1413 或 HTTP 的验证头部确认用户身份%Sh/%<A
:记录 peer 主机(其他代理服务器)信息%mt
:记录 MIME 类型。从响应的Content-type
域获取信息,若没有就使用一个-
代替。
logfile_rotate
:轮询保存的文件数,超过限制就会从头开始覆盖
日志轮询
Squid 并没有自动轮询的机制,只能使用squid -k rotate
命令,并编写脚本通过 cron 周期执行。
#!/bin/bash |
Sarg 工具分析日志
Sarg 是一个 Squid 的日志分析工具,输出为 html 文件。Sarg 下载-tar.gz 包
依赖 gd 库,pcre 库。在 sarg 安装完成后,进入安装目录的bin
目录,执行sarg
命令,sarg 会自动寻找 Squid 的日志文件,并分析。SARG: Records in file: 595935, reading: 100.00%
,然后会生成一个目录,是自动存放在/var/www/html/squid-reports
下,目录名为起始日期-结束日期
,该目录下有index.html
通过浏览器访问该 index 文件,数据量相当庞大,并提供图表和日期时间的数据记录
sarg 命令:
sarg [options] |
Sarg 配置,存放在安装目录的etc/sarg.conf
access_log /usr/local/squid/var/logs/access.log #squid日志路径 |
Squid 调优
调整文件描述符
Squid 在高负载下,需要大量内核资源,又因为 Squid 是做缓存服务器,所以极度消耗文件描述符,而 unix 对文件描述符是有限制的(1024),这样会造成极大的性能影响,当 squid 用完所有文件描述符后,就不能接收新的请求了,并且 squid 发现文件描述符短缺后,就会发布警告。
因此,需要先查看文件描述符是否满足使用,大多数情况 1024 已经足够使用,当出现高负载情况时,则需要更多,因此最好将系统限制的文件描述符数量设为每个进程限制的两倍。
ulimit -a 查看当前的资源限制信息 |
注:ulimit 仅仅作为临时设置,可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。
**若要永久设置,可写入/etc/profile
:echo "ulimit -Hn 2048">>/etc/profile
**
或写入/etc/security/limits.conf
:echo "* - nofile 2048">>/etc/security/limits.conf
调整临时端口范围
临时端口是 TCP/IP 栈分配出连接的本地端口,当 squid 发起一条连接到另一台服务器,内核给本地 socket 分配一个端口号。CentOS 默认的临时端口范围是 32768 到 60999
当 squid 高负载时,若临时端口号短缺,会造成很大的性能影响,因为一些 TCP 连接在关闭时会进入TIME_WAIT
状态,此状态下临时端口不能重用。
可通过sysctl -a | grep net.ipv4.ip_local_port_range
查看
设置范围 4000 到 65000,sysctl -w net.ipv4.ip_local_port_range="4000 65000"
参考文章
- Linux 服务器架设指南(第二版)
- Linux 系统管理与网络管理(第二版)
- Linux 运维之道(第二版)
- 高性能网站构建实战