squid原理和配置
介绍
在web服务器的前端架设一台代理服务器,此代理服务器可以接受用户浏览器发出的请求,然后根据请求到web服务器上取得相应的数据并传送给客户浏览器。这种代理服务器就是反向代理服务器,常用的反向代理服务器软件有squid、varnish和ningx。这里主要介绍squid,Squid可以实现正向代理、反向代理、缓存服务器等功能。
squid可以通过ACL访问控制访问控制来限制用户的访问时间、访问站点等,从而控制网络访问,通过缓存可以提高访问速度;可以阻止特定的网络连接来减少一些非法连接,阻止内部主机访问非法站点或不适宜的站点,从而提高网络安全。当用户请求到达时,首先到达squid服务器,squid会查看访问控制列表中的访问规则,如果符合规则,squid会去缓存中查找数据,缓存中如果没有用户请求的数据,squid会根据用户请求去后端获取网页数据,然后将数据发送给用户,同时会在自己的缓存中保存一份,当下次别的用户请求这一数据时,squid直接将缓存中的数据发送给客户端,从而提高访问速度。Squid还可以缓存DNS查询结果,支持非模块化的DNS查询,对失败的请求进行消极缓存。
squid在作为缓存服务器时,是从磁盘上读取缓存数据,和vanish相比,速度有些慢,因为vanish的缓存数据是从内存中读取的。但是vanish一旦崩溃,重启后存储在内存中数据会丢失,而squid不会有此问题。
准备
需要安装gcc编译工具、make编译器、开发包组、开发工具。
squid在高负载时需要消耗大量内存资源,要为系统配置更高的文件描述符,根据具体情况指定文件描述符:
[root@localhost ~]# ulimit -Hn 65535 [root@localhost ~]# echo "ulimit -Hn 65535" >> /etc/rc.local
下载源码包,这里使用的是squid-3.3.5.tar.bz2
环境如下:
[root@ASANGE ~]# uname -r 2.6.32-358.el6.x86_64 [root@ASANGE ~]# cat /etc/redhat-release CentOS release 6.4 (Final)
安装
[root@ASANGE ~]# tar xfv squid-3.3.5.tar.bz2 -C /opt/ [root@ASANGE ~]# cd /opt/squid-3.3.5/ [root@ASANGE squid-3.3.5]# ./configure --prefix=/opt/squid --enable-dlmalloc --enable-icmp --enable-htcp --enable-poll --disable-ipv6 --enable-large-files �Cenable-linu-netfilter .... [root@ASANGE squid-3.3.5]# make [root@ASANGE squid-3.3.5]# make install [root@ASANGE squid-3.3.5]# make install-pinger //如果启用了―enable-icmp选项,必须以root身份安装pingwer程序 ********************************************************************** configure常用选项有: --prefix=PREFIX //安装目录 --localstatedir=DIR //该选项可以改变var目录的安装位置,var是实际磁盘上cache的默认位置,可以在主配置文件中修改此路径。 Sysconfdir=DIR //etc目录位置 Squid专有选项: --enable-dlmalloc[=LIB] //在一些系统上内建的内存分配机制(malloc)在使用squid时表现一般。使用次参数将squid源码包中的dlmalloc包编译和连接进来。加入系统中已经安装dlmallc,可以使用=LIB来指定库的路径。 --enable-carp //cache数组路由协议crap,用来转发丢失的cache到父cache的数组或cluster。 --enable-async-io[=N_THREADS] //启用异步I/O,=N_THREADS参数改变squid使用的线程数量 --enable-icmp //启用ICMP的ping功能 --enable-htcp //启用超文本缓存协议 --enable-arp-acl //支持arp地址访问控制列表 --enable-poll //unix中提供两个相似的函数用以在I/O事件里扫描开放文件描述符:select()和poll()。 --disable-ipv6 //禁用ipv6 --with-large-files //支持大文件,包括文件、日志等 �Cenable-linu-netfilter //支持linux中的netfilter
[root@ASANGE squid-3.3.5]# cd /opt/squid [root@ASANGE squid]# ls bin etc include lib libexec sbin share var
主配置文件
主配置文件是/opt/squid/etc/squid.conf,其中的关键选项如下:
http_port 3128 //squid在哪个端口侦听http请求,默认是3128。可以通过多行设置多个端口。 // 日志文件路径:日志存放在/opt/squid/var/logs目录下,squid有三个主要日志文件:cache.log,access.log,store.log。 // Cache.log包含状态和调试信息,可以在主配置文件中指定: cache_log /opt/squid/var/logs/cache.log // Access.log包含对squid发起的每个请求的单一行。每行约150个字节。如果有一百万客户请求,它的大小约为150M。 cache_access_log /opt/squid/var/logs/access.log // Store.log包含进入和离开缓存的每个目标的记录。平均记录大小为175-200字节。但是squid不在store.log里对cache点创建接口,所以比access.log包含的记录少。 cache_store_log /opt/squid/var/logs/store.log //如果路径值为none,会禁止store.log cache_dir ufs /opt/squid/var/cache/squid 100 16 256 //指定缓存文件夹。其中ufs是存储机制;缓存文件的存放位置,大小为100M,一般应设置大一些;16和256表示在cache目录中创建一级目录和二级目录的个数。 maximum_object_size SIZE //缓存文件的最大值,大于此值的响应不会被缓存在磁盘。 cache_replacement_policy lru|gdsf|lfuda //磁盘cache的置换策略,默认使用lrc:最近最少使用。
主配置文件中最重要的是acl访问控制语句,用户可以自己定义acl来对客户请求做限制 :
Squid默认拒绝所有客户请求,可以通过在主配置文件中定义访问控制规则来允许客户请求。先定义一个针对客户的ACL,然后在对此ACL定义访问规则。 ACL元素语法如下: Acl name type value1 value2 … 例如:acl workstation src 10.0.0.1/16 在ACL中有许多类型(type),下面介绍一些常用项: 1:IP地址 使用type:src,dst 它们的值可以是ip地址、ip和子网掩码、ip段 2:域名 使用type:srcdomain,dstdomain,cache_host_domain 它们的值是:域名 3:用户名: 使用type:ident,proxy_auth 它们的值是用户名。 4:正则表达式: 使用type:srcdom_regex,dstdom_regex,url_regex,urlpath_regex等 它们的值是一些正则表达式表示的地址或文件。(加 �CI 参数表示不区分大小写) 例如:acl AAA url_regex �CI ^http://www.bai 5:tcp端口号: 使用type:port,myport 它们的值是端口号或端口范围 例如:acl APORT port 1-500 6:时间 使用type:time 它的值每天中具体的时间,和每周中每天。日期用单字母表示,时间以24小时制表示,开始时间小于结束时间。 S Sunday M Monday T Tuesday W Wednesday H thersday F firday A satusday D all weekdays(M-F) 例如:acl w-hour time D 08:00-17:30 访问控制规则: http_access allow|deny ACLNAME 如拒绝使用IP地址的请求 Acl useip dstdomain_regex ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ http_access deny useip
常用命令
查看配置文件是否正确:
[root@ASANGE ~]# /opt/squid/sbin/squid -k check
初始化cache目录
[root@ASANGE ~]# Squid�Cz
squid作为服务器进程运行:
[root@ASANGE ~]# Squid�Cs
如果开机启动squid须执行一下命令:
[root@ASANGE ~]# Echo“squid -s” >> /etc/rc.local
停止squid:
[root@ASANGE ~]# Squid�Ck shutdown
代理实现
当配置squid作为正向代理服务器时,通过acl定义代理的客户端,符合acl规则的客户端可以通过squid服务器访问别的网站。1:客户端需配置代理指向squid服务器,端口为squid运行端口。2:当实现透明代理使客户端不需要配置代理和端口,而squid需借助iptables实现透明代理。例如:
Iptables �Ct nat �CA PREROUTING �CI eth0 �Cp tcp�Cddport 80 �Cj REDIRECT �Cto-port 3128
当使用squid作为反向代理时,需要修改主配置文件squid.conf,添加一些关于主机的定义:
例如:
http_port115.239.210.26:80 vhost //修改http_port内容为外网地址和端口, cache_peer192.168.0.3 parent 80 0 originserver weight=1 max-conn=1000 cache_peer192.168.0.6 parent 80 0 originserver weight=2 max-conn=1000 cache_peer192.168.0.9 parent 80 0 originserver weight=3 max-conn=1000 //定义多台,负载均衡
各个参数的意义如下:
格式:cache_peer web服务器地址服务类型 http端口 icp端口 [可选项]
其中服务类型有parent(父),sibling(兄弟),multicast(多播)
Max_conn定义可以打开多少个连接
此时如果外网用户访问我们的web服务器115.239.210.26的80端口时,用户请求会被反向代理至192.168.0.3/6/9中的一台机器上,而且是根据各个服务器的权重进行分配。可以通过access.log查看是反问的具体是那台服务器。当同一请求再次到达squid服务器时,会直接从缓存中返回数据,从而加速访问。当后端服务器撒谎能够的数据发生改变时,用户请求到达squid服务器,squid会到后端查看数据是否发生改变,如果没有改变,后端服务器会返回一个304代码给squid服务器,squid服务器将缓存中的数据发送给用户;如果改变了,会从新从后端服务器获取数据并缓存,同时将新数据发送给用户,而这些都是通过http首部中一个Last-modified和If-Modified-Since的报头实现,让客户端能够获得最新的资源。