Squid3.0(反向代理)配置基本语法

发布时间:2019-07-16编辑:脚本学堂
本文介绍下,squid3.0中有关反向代理的一些配置语法,尤其是refresh_pattern的作用,本文进行了精彩的阐释。有需要的朋友不要错过。

配置说明:

http_port 80  
选项 http_port 指定squid监听HTTP请求的端口,一般都设置成80端口,这样使用户感觉不到反向代理的存在,就像访问真正的WEB服务器一样。
例如:http_port 192.168.1.101:80 vhost vport

cache_mem 2048 MB         
共享内存大小(squid在提供服务时使用的内存)

max_open_disk_fds 0
maximum_object_size 512 KB
maximum_object_size_in_memory 256 KB
最大内存缓存OBJECT值,如果超过则不再内存中缓存,而存入IO中。

memory_replacement_policy lru     
替换机制(lru叫做最近不常用的单元 unit一般就是常说的object 也就是当cache中的内容比如内存或硬盘达到上限时的那么就需要进行数据的换进和换出工作)

cache_dir null /tmp
cache_dir存储cache内容也就是object的物理存放点 
cache_dir ufs /tmp1 10000 16 256
100G其中1层目录16个,并且每个1层目录下又有256个2层子目录,磁盘缓存的类型和目录,大小,一二级目录的设置,这里磁盘缓存大小是10G,ufs是一种文件存储方式
,因为os一般都是从内存获取数据,那么内存的东西必须最后写的硬盘上,sync同步的时候用的ufs,那么squid也是一样,ufs一般是同时写入内存和硬盘。注意:size是按
照M为单位的也就这个目录中最大存储容量的上限

max_open_disk_fds 0
minimum_object_size 0 KB

最小缓存对象为0K,意思是无限制。

maximum_object_size 4096 KB  
最大缓存对象为4M

logformat squid %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt
设置access_log中日志存储的格式~

access_log /usr/local/squid3/var/logs/access.log squid   
access_log为客户端请求的日志 
cache_log /usr/local/squid3/var/logs/cache.log   
为squid自身的运行日志 
pid_filename /usr/local/squid3/var/logs/squid.pid
此三项是设置PID和日志文件位置

cache_store_log none
不记录store.log

visible_hostname
只是标签,有利于检查是否你的那台设备在提供服务,强烈建议配置

cache_peer 192.168.1.53 parent 80 0 no-query round-robin max-conn=32 originserver
squid2.5以上都是用的cache_peer来指定所需要代理的服务器的IP 这一点很重要! 由于本例squid 与web 不在同一服务器,因此需要cache_peer 指定相应WEB服务器IP
 

acl all src 0.0.0.0/0.0.0.0
http_access allow all
acl QUERY urlpath_regex cgi-bin .php .cgi .avi .wmv .rm .ram .mpg .mpeg .zip .exe
cache deny QUERY

访问控制列表定义;默认的配置文件已包含了一些重要的访问控制,不应该改变或删除它们,除非完全理解它们的意义。
 

cache_effective_user squid
cache_effective_group squid

此设置告诉squid,在执行完需要特别权限的任务艰务后,变成哪个用户(squid),详细原因见②
error_directory /usr/local/squid3/share/errors/Simplify_Chinese
将squid的报错信息用中文显示。

①refresh_pattern的作用(重点内容)
用于确定一个页面进入cache后,它在cache中停留的时间。
refresh_pattern 只对后端没设置Expires过期时间的页面起作用,比如论坛页面;而对类似apache mod_expires 设置过的页面不起作用。
语法:
refresh_pattern [-i] regexp min percent max [options]
几个概念:
resource age =对象进入cache的时间-对象的last_modified
response age =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)

举个例子,这里只考虑percent, 不考虑min 和 max
例如:refresh_pattern   20%
假设源服务器上www.aaa.com/index.htm -----lastmodified 是       2007-04-10 02:00:00
squid上     proxy.aaa.com/index.htm index.htm进入cache的时间 2007-04-10 03:00:00
1)如果当前时间   2007-04-10 03:00:00
resource age =3点-2点=60分钟
response age =0分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟
也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。

2)如果当前时间 2007-04-10 03:05:00
resource age =3点-2点=60分钟
response age =5分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7
LM-factor=5/60=8.3%<20%
一直到2007-04-10 03:12:00   LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。
如果这时没有index.htm的请求,index.htm会一直在缓存中,如果有index.htm请求,squid收到该请求后,由于已经过期,squid会向源服务器发一个index.htm是否有改变
的请求,源服务器收到后,如果index.htm没有更新,squid就不用更新缓存,直接把缓存的内容放回给客户端,同时,重置对象进入cache的时间为与源服务器确认的时间,
比如2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age变长,相应在cache中存活的时间也变长。
如果有改变则把最新的index.htm返回给squid,squid收到会更新缓存,然后把新的index.htm返回给客户端,同时根据新页面中的Last_Modified和取页面的时间,重新计算
resource age,进一步计算出存活时间。
实际上,一个页面进入cache后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认。
理解了百分比后,min max就好理解了
squid收到一个页面请求时:
1、计算出response age,
2、如果response age<min 则 fresh 如果response age>max 则 stale
3、如果response age在之间,如果response时间<存活时间,fresh,否则stale
常用的几个参数的意思
override-expire
该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期。
override-lastmod
改选项导致squid在检查LM-factor百分比之前先检查min值。
reload-into-ims
该选项让squid在确认请求里,以no-cache指令传送一个请求。换句话说,squid在转发请求之前,对该请求增加一个If-Modified- Since头部。注意这点仅仅在目标有
Last-Modified时间戳时才能工作。外面进来的请求保留no-cache指令,以便它到达原始服务器。
一般情况可以使用 reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间。
举例:
 

复制代码 代码示例:
refresh_pattern -i .css$ 1440 50% 129600 reload-into-ims
refresh_pattern -i .xml$ 1440 50% 129600 reload-into-ims
refresh_pattern -i .html$ 1440 90% 129600 reload-into-ims-
refresh_pattern -i .shtml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i .hml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i .jpg$ 1440 90% 129600 reload-into-ims
refresh_pattern -i .png$ 1440 90% 129600 reload-into-ims
refresh_pattern -i .gif$ 1440 90% 129600 ignore-reload
refresh_pattern -i .bmp$ 1440 90% 129600 reload-into-ims
refresh_pattern -i .js$ 1440 90% 129600 reload-into-ims
 

ignore-reload
该选项导致squid忽略请求里的任何no-cache指令。
所以。如果希望内容一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项,这个我们常用在mp3,wma,wmv,gif之类。
示例:
 

复制代码 代码示例:
refresh_pattern -i .mp3$ 1440 50% 2880 ignore-reload
refresh_pattern -i .wmv$ 1440 50% 2880 ignore-reload
refresh_pattern -i .rm$ 1440 50% 2880 ignore-reload
refresh_pattern -i .swf$ 1440 50% 2880 ignore-reload
refresh_pattern -i .mpeg$ 1440 50% 2880 ignore-reload

②设置squid用户的作用:
User ID
你可能知道,unix进程和文件拥有文件和组属主的属性。你必须选择某个用户和组给squid。该用户和组的组合,必须对大部分squid相关的文件和目录有读和写的权限。我
高度推荐创建名为"squid"的用户和组。这避免了某人利用squid来读取系统中的其他文件。假如不止一个人拥有对squid的管理权限,你可以将他们加到squid组里。
unix进程继承了它们父进程的属主属性。那就是说,假如你以joe用户来启动squid,squid也以joe来运行。假如你不想以joe来运行squid,你需要预先改变你的用户ID。这
是su命令的典型功能。例如:
joe% su - squid
squid% /usr/local/squid/sbin/squid
不幸的是,运行squid并非总是如此简单。在某些情况下,你必须以root来启动squid,这依赖于你的配置。例如,仅仅root能绑定TCP套接字到 特权端口上,如80。假如你
必须以root来启动squid,你必须设置cache_effective_user指令。它告诉squid,在执行完需要 特别权限的任务后,变成哪个用户。例如:
cache_effective_user squid
你提供的该名字必须是有效用户(在/etc/passwd文件里)。请注意仅仅当你以root来启动squid时,你才需要用到该指令。仅仅root有能力来随意改变用户身份。假如你以
joe来启动squid,它不能改变到squid用户。

你可能尝试不设置cache_effective_user,直接以root来运行squid。假如你试过,你会发现squid拒绝运行。这违背了安全规 则。假如外部攻击者有能力危及或利用
squid,他能获取对系统的全部访问权。

假如,没有设置cache_effective_user,以root来启动squid,squid使用nobody作为默认值。
不管选择什么用户ID,请确认它有对下面目录的读访问权:$prefix/etc、$prefix/libexec、$prefix/share。
该用户ID也必须有对日志文件 和缓存目录的写访问权。

squid还有一个cache_effective_group指令,但你也许不必设置它。

默认的,squid使用cache_effective_user的默认组(从/etc/passwd文件读取)。

建议:
源码安装前执行命令:
 

groupadd squid;
useradd -G squid -s /sbin/nologin squid;
chown -R squid.squid /usr/local/squid3.0/var