本文摘自:http://www.williamsang.com/archives/1645.html
快速安装
执行yum install squid
复制最下面的配置文件覆盖默认配置文件squid.conf
生成密码文件(见下图)
启动squid:service squid start
配置文件介绍
################################# ### acl和http_pass访问控制 ### ################################# acl manager proto cache_object acl localhost src 127.0.0.1/32 ::1 acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 # 以下定义了局域网地址localnet(需要了解一些网络里面的私有地址概念) acl localnet src 10.0.0.0/8 acl localnet src 172.16.0.0/12 acl localnet src 192.168.0.0/16 acl localnet src fc00::/7 acl localnet src fe80::/10 # 定义SSL_ports为443 acl SSL_ports port 443 # 定义了Safe_ports所代表的端口 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http # 定义CONNECT代表http里的CONNECT请求方法 acl CONNECT method CONNECT # 允许本机管理缓存 http_access allow manager localhost # 拒绝其他地址管理缓存 http_access deny manager # 拒绝不安全端口请求 http_access deny !Safe_ports # 不允许连接非安全SSL_ports端口 http_access deny CONNECT !SSL_ports # 拒绝连接到本地服务器提供的服务 # (用于保护本机一些只有本机用户才能访问的服务) # http_access deny to_localhost # 允许局域网用户的请求 http_access allow localnet # 允许本机用户的请求 http_access allow localhost # 拒绝其他所有请求 http_access deny all ################################# ### squid 服务器基本配置 ### ################################# # Squid的监听端口 http_port 3128 ################################# ### squid 缓存配置 ### ################################# # 出现cgi-bin或者?的URL不予缓存 hierarchy_stoplist cgi-bin ? # 磁盘缓存目录 #cache_dir ufs /var/spool/squid 100 16 256 # squid挂掉后,临终遗言要放到哪里 coredump_dir /var/spool/squid # 刷新缓存规则 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320
acl控制格式:
acl 列表名称 列表类型 列表值1 列表值2 ...
列表名称:自己定义的,用于下面进行权限控制(allow/deny)。
列表类型:
- proto:指明URL访问/传输协议。如:http、https、ftp、gopher、urn、whois、cache_object。
- src:指明IP地址。
- dst:指明最终服务器IP。
- port:单独定义端口/端口范围。
- method:指http的请求方法。包括GET、POST、PUT、HEAD、CONNECT等。
http_access deny/allow acl列表名称
这里需要注意的是:http_access按照定义的顺序来过滤请求的,只要前面被allow/deny了下面就不再判断了。
举个例子:
acl manager proto cache_object
http_access allow manager localhost
http_access deny manager
第一句指明manager为缓存管理,后面限定只能本机进行缓存管理。
squid服务器自身配置
http_port 3128
设置squid监听端口,可以自己更换,客户端链接的时候需要指定这个端口。
缓存配置:
cache_dir ufs /var/spool/squid 100 16 256
这里设置磁盘缓存的目录以及空间大小,目录结构等,格式为:
cache_dir schema directory size L1 L2 [option]
- schema:默认为ufs,是一种存储机制,一般不修改。
- directory:指定磁盘缓存存放目录。
- size:指定cache目录的大小,单位M。
- L1 L2:一级目录数量和二级目录数量。默认为16 256不需要更改。
- [option]:可以指定只读和最大文件大小。(一般不用设置)
coredump_dir /var/spool/squid
squid挂掉后,临终遗言要放到哪里,一般也不需要处理
hierarchy_stoplist
后跟着字符串列表,请求的URL里面包含字符串列表里的任何一个字符就不予缓存。
hierarchy_stoplist cgi-bin ?
上述语句表示:任何包含?或cgi-bin字符串的请求的URL不予缓存直接把最终服务器结果返回给用户。
refresh_pattern
使用正则表达式来确定资源过期时间。
refresh_pattern <最小时间> <百分比> <最大时间>
如何判断过期?
如下是squid的refresh_pattern算法的简单描述:
假如响应年龄超过refresh_pattern的max值,该响应过期;
假如LM-factor少于refresh_pattern百分比值,该响应存活;
假如响应年龄少于refresh_pattern的min值,该响应存活;
其他情况下,响应过期。
LM-factor算法:
resource age =对象进入cache的时间-对象的last_modified
response age =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)
这里多介绍点额外选项:
设定DNS服务器
- dns_nameserers 8.8.8.8
日志记录
默认都在/var/log/squid目录下,默认安装时候就配置好了日志轮转,查看/etc/logrotate.d/squid 如果自己更改日志存放位置,最好重新配置自动轮转,关于logrotate参看:logrotate使用:
- cache_log /var/log/cache.log:包括状态性和调试性消息。如果启动失败、报错,可以查看本文件。
- cache_access_log /var/log/access.log:记录每个终端请求日志,可以设定为/dev/null 不记录日志。
- cache_store_log /var/log/store.log:对大多数cache管理员来说很有用。包含了进入和离开缓存的每个目标的记录。
启动squid PID 的用户和群组,默认都为squid
- cache_effective_user squid
- cache_effective_group squid
内存缓冲大小:设定额外提供多少内存给squid使用。
cache_mem 20M
总内存占用计算方法
squid自身进程占用(10~20M)+ Cache目录放在内存的索引(500M目录大约20M索引)+cache_mem
官方建议可用内存大小要是这里计算量的两倍以上。因此这里的cache_mem不能设置太大。当然内存充足的话,越大越好。
Cache目录放在内存的索引(500M目录大约20M索引)这里其实是估算,没法准确计算,一般64位系统中,每个缓存索引占用112字节内存。这样如果一个缓存文件大小在1K到20K之间则,大概内存花费为:50M~3M之间。其实通过查看/var/spool/squid 目录下的缓存文件大小你可以发现基本都是几K的偏多。所以取20M还是比较合理的。
密码登录
一般我们使用代理都是有密码的,不然谁都可以用,服务器还不得挂掉,怎么在squid中是用密码验证呢?
先设定验证相关的验证参数:
# 密码存储路径,设定通过ncsa_auth程序来读取
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/htpasswd
auth_param basic children 5
# 设定通过验证时,呈现给用户的欢迎信息,可以不写
auth_param basic realm “Welcome to proxy web server”
# 验证一次,可以持续访问多长时间
auth_param basic credentialsttl 12 hours
auth_param basic casesensitive off
# 设定acl密码用户
acl squid_user proxy_auth REQUIRED
# 允许密码用户登录
http_access allow squid_user
生成用户名密码文件,这里使用william作为用户名,test1234作为密码,见下图:
touch /etc/squid/htpasswd
htpasswd /etc/squid/htpasswd william
这里密码最好放在/etc/squid/目录下,不然很容易有权限问题,导致squid启动失败
注:这里的htpasswd命令是apache服务器自带的。你执行下面的名利安装apache