反向代理服务器有两种传输模式:
1.同步模式:(如:squid)用户发起请求,请求立即被转到后端的服务器,于是在浏览器和后端服务器之间就建立了一个连接,在请求完成前这个连接是一直存在的。
2.异步模式:(如:nginx)用户发起的请求会发送到nginx,nginx接收到所有的数据后在转发到后端的服务器,后端服务器处理完成后把数据返回给nginx,nginx在返回给用户。
由此可见如果用户发起的请求的数据比较大,或者用户端的网速比较慢,同步模式时后端服务器的连接数相对于异步模式会比较多,压力也比较大。
squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性、安全性方面有很好用途。作者在具体实验环境下,利用 DNS 轮询和 Squid 反向代理技术,实现了网站的负载均衡,从而提高了网站可用性和可靠性。
现在有许多大型的门户网站如 SINA 都采用 squid 反向代理技术来加速网站的访问速度,可将不同的 URL 请求分发到后台不同的 WEB 服务器上,同时互联网用户只能看到反向代理服务器的地址,加强了网站的访问安全。
反向代理的概念
反向代理服务器又称为 WEB 加速服务器,它位于WEB 服务器的前端,充当WEB 服务器的内容缓存器。
系统结构
系统结构
反向代理服务器是针对 WEB 服务器设置的,后台 WEB 服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台 WEB 服务器是如何组织架构的。当互联网用户请求 WEB 服务时,DNS 将请求的域名解析为反向代理服务器的 IP 地址,这样 URL 请求将被发送到反向代理服务器,由反向代理服务器负责处理用户的请求与应答、与后台 WEB 服务器交互。利用反向代理服务器减轻了后台 WEB 服务器的负载,提高了访问速度,同时避免了因用户直接与 WEB 服务器通信带来的安全隐患。
Squid 反向代理的实现原理
目前有许多反向代理软件,比较有名的有 Nginx 和 Squid 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
Squid 是由美国一项研究计划,其目的为解决网络带宽不足的问题,支持HTTP,HTTPS,FTP 等多种协议。
Squid反向代理服务器位于本地 WEB 服务器和 Internet 之间 , 组织架构如图:
客户端请求访问 WEB 服务时,DNS 将访问的域名解析为 Squid 反向代理服务器的 IP 地址,这样客户端的 URL 请求将被发送到反向代理服务器。如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端,否则反向代理服务器将向后台的 WEB 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。 Squid 反向代理一般只缓存可缓冲的数据(比如 html 网页和图片等),而一些 CGI 脚本程序或者 ASP、JSP 之类的动态程序默认不缓存。它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。
四个最重要 HTTP 头标记:
Last-Modified: 告诉反向代理页面什么时间被修改
Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
Cache-Control: 告诉反向代理页面是否应该被缓冲
Pragma: 用来包含实现特定的指令,最常用的是 Pragma:no-cache
利用 Squid 反向代理加速网站实例
本实例的域名是 wenjin.cache.fqj.com.cn,通过DNS的轮询技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户,否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理,这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。该系统结构图:
配置系统环境:
一台 DNS 服务器:操作系统Centos6.4,软件 BIND 9.5,IP 192.168.76.222 ;
三台 Squid 服务器:操作系统 Centos6.4,软件 Squid 3.0,相应的 IP 如下:
Squid1:192.168.76.223
Squid2:192.168.76.224
Squid3:192.168.76.225
三台 WEB 服务器:操作系统Centos6.4,应用软件 apache+Mysql,相应的 IP 地址如下:
webServer1:210.82.118.195
webServer2:192.168.76.226
webServer1:192.168.76.227
配置 DNS 服务器
软件利用 centos6.4自带的 bind 软件。然后针对该系统配置 bind,首先修改 bind 配置文件 /etc/namedb/named.conf,在文件中添加
复制代码 代码如下:zone "cache.xxx.com.cn"{
type master;
file "master/ cache.fqj.com.cn ";
};
再在 /etc/namedb/master 目录下添加 cache.fqj.com.cn 文件,该文件的内容如下:
复制代码 代码如下:$TTL3600
@ IN SOA search. xxx.com.cn. root. xxx.com.cn. (
20080807; Serial
3600; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS search.xxx.com.cn.
1 IN PTR localhost.xxx.com.cn.
wenjin IN A 192.168.76.223
wenjin IN A 192.168.76.224
wenjin IN A 192.168.76.225
这样当用户请求的时候,DNS 通过轮询机制将 wenjin.cache.fqj.com.cn 的域名解析为 192.168.76.223、192.168.76.224 和 192.168.76.225 其中之一。
配置完成后,启动 bind 服务。
可在 /etc/rc.conf 中设置 named_enable="YES" 使得开机自启动。
用 pf -ex | grep named 查看 bind 服务是否起来;
用 nslookup wenjin.cache.fqj.com.cn 测试 bind 服务是否正常运行。
配置 Squid1 服务器
下载squid-3.4.0.3.tar.gz软件包
https://launchpad.net/squid/3.4/3.4.0.3/+download/squid-3.4.0.3.tar.gz
安装依赖包:yum install -y gcc gcc-c++ make perl perl-devel
tar zxvf squid-3.4.0.3.tar.gz
./configure --prefix=/usr/local/squid
make && make install
groupadd squid
useradd -g squid -s /sbin/nologin squid
chown -R squid /usr/local/squid/var/logs/ /usr/local/squid/var/cache/
配置squid反向代理
清除默认配置,添加自定义的配置:
cache_effective_user squid
cache_effective_group squid
######### 设定 squid 的主机名 , 如无此项 squid 将无法启动
visible_hostname squid1.nlc.gov.cn
############# 配置 squid 为加速模式 #################
http_port 80 accel vhost vport
icp_port 3130
##### 配置 squid2、squid3 为其邻居,当 squid1 在其缓存中没有找到请求资源时, 通过 ICP 查询去其邻居中取得缓存 .
cache_peer squid2.xxx.com.cn sibling 80 3130
cache_peer squid3.xxx.com.cn sibling 80 3130
##### squid1 的三个父节点,originserver 参数指明是源服务器,
round-robin 参数指明 squid 通过轮询方式将请求分发到其中一台父节点;
squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了,那么 squid 会从剩余origin 服务器中抓取数据.
cache_peer 210.82.118.195 parent 8080 0 no-query originserver round-robin name=webServer1
cache_peer 192.168.76.226 parent 8080 0 no-query originserver round-robin name=webServer2
cache_peer 192.168.76.227 parent 8080 0 no-query originserver round-robin name=webServer3
#### 将 wenjin.cache.xxx.com.cn 域的请求通过 RR 轮询方式转发到三个父节点中的一个
cache_peer_domain webServer1 webServer2 webServer3 wenjin.cache.xxx.com.cn
##### 下面是一些访问控制、日志和缓存目录的设置
acl localnet src 192.168.76.223 192.168.76.224 192.168.76.225
http_access allow all
icp_access allow localnet
cache_log /usr/local/squid/var/logs/cache.log
access_log /usr/local/squid/var/logs/access.log squid
cache_dir ufs /usr/local/squid/var/cache/ 1000 16 256
####### 对 squid 的一些优化 ###############
maximum_object_size 10240 KB ### 能缓存的最大对象为 10M
maximum_object_size_in_memory 512 KB ### 内存中缓存的最大对象 512K
cache_mem 256 MB ###squid 用于缓存的内存量,最后进行保存
在 /etc/hosts 文件中添加
复制代码 代码如下:
192.168.76.223 squid1.xxx.com.cn
192.168.76.224 squid2.xxx.com.cn
192.168.76.225 squid3.xxx.com.cn保存
维护命令
/usr/local/squid/sbin/squid -s #启动squid
/usr/local/squid/sbin/squid –k parse #检查squid配置文件是否正确
/usr/local/squid/sbin/squid –N -z #生成缓存目录
配置 squid2 和 squid3 服务器
squid2 和 squid3 配置方法和配置参数和 squid1 一样,配置完成后,分别启动这两个服务器上的 squid 服务。
在 squid 日志文件 cache.log 中,出现如下日志信息则说明三台 squid 之间成功配置为 sibling,且配置了三个父代理。
2013/11/17 10:08:47| Configuring Sibling squid1.xxx.com.cn/80/3130
2013/11/17 10:08:47| Configuring Sibling squid3.xxx.com.cn/80/3130
2013/11/17 10:08:47| Configuring Parent 210.82.118.195/8080/0
2013/11/17 10:08:47| Configuring Parent 192.168.76.226/8080/0
2013/11/17 10:08:47| Configuring Parent 192.168.76.227/8080/0
2013/11/17 10:08:47| Ready to serve requests.
进行测试
测试之前,保证 DNS 服务、三台 squid 服务和三台 web 服务都正常起来。在客户端输入 http://wenjin.cache.xxx.com.cn,
则正确的显示该网页。服务器端的响应对客户端是透明的,客户端不知道请求是由哪台 WEB 服务器处理的;而且其中某 台 Squid 服务器或 WEB 服务器发生故障,也不影响服务的正常运行。
测试命中率:
这里-p后面根的是端口,根据自己具体的情况而定。如果是3128端口,就把上面的80换成3128就可以了
[root@test01 ~]# /usr/local/squid/bin/squidclient -p 80 mgr:info
Sending HTTP request ... done.
HTTP/1.1 200 OK
Server: squid/3.4.0.3
Mime-Version: 1.0
Date: Wed, 11 Dec 2013 09:08:36 GMT
Content-Type: text/plain
Expires: Wed, 11 Dec 2013 09:08:36 GMT
Last-Modified: Wed, 11 Dec 2013 09:08:36 GMT
X-Cache: MISS from www.eshow365.com
Via: 1.1 www.eshow365.com (squid/3.4.0.3)
Connection: close
Squid Object Cache: Version 3.4.0.3
Build Info:
Start Time:Wed, 11 Dec 2013 08:06:39 GMT
Current Time:Wed, 11 Dec 2013 09:08:36 GMT
Connection information for squid:
Number of clients accessing cache:3
Number of HTTP requests received:363
Number of ICP messages received:0
Number of ICP messages sent:0
Number of queued ICP replies:0
Number of HTCP messages received:0
Number of HTCP messages sent:0
Request failure ratio: 0.00
Average HTTP requests per minute since start:5.9 #每分钟http request的数量
Average ICP messages per minute since start:0.0
Select loop called: 7788 times, 477.226 ms avg
Cache information for squid:
Hits as % of all requests:5min: 0.0%, 60min: 16.3% #Cache Request命中率
Hits as % of bytes sent:5min: -0.0%, 60min: 24.6% #Cache Byte命中率
Memory hits as % of hit requests:5min: 0.0%, 60min: 0.0%
Disk hits as % of hit requests:5min: 0.0%, 60min: 97.3%
Storage Swap size:3660 KB #存放cache的硬盘使用大小
Storage Swap capacity: 0.4% used, 99.6% free
Storage Mem size:2864 KB #存放cache的内存使用大小
Storage Mem capacity: 1.1% used, 98.9% free
Mean Object Size:17.18 KB
Requests given to unlinkd:0
Median Service Times (seconds) 5 min 60 min:
HTTP Requests (All): 0.00000 0.28853
Cache Misses: 0.00000 0.30459
Cache Hits: 0.00000 0.00000
Near Hits: 0.00000 0.00000
Not-Modified Replies: 0.00000 0.00000
DNS Lookups: 0.00000 0.00000
ICP Queries: 0.00000 0.00000
Resource usage for squid:
UP Time:3716.636 seconds
CPU Time:1.097 seconds
CPU Usage:0.03%
CPU Usage, 5 minute avg:0.01%
CPU Usage, 60 minute avg:0.02%
Process Data Segment Size via sbrk(): 8264 KB
Maximum Resident Size: 55472 KB
Page faults with physical i/o: 0
Memory usage for squid via mallinfo():
Total space in arena: 8396 KB
Ordinary blocks: 8254 KB 51 blks
Small blocks: 0 KB 0 blks
Holding blocks: 656 KB 2 blks
Free Small blocks: 0 KB
Free Ordinary blocks: 142 KB
Total in use: 142 KB 2%
Total free: 142 KB 2%
Total size: 9052 KB
Memory accounted for: #内存使用情况
Total accounted: 3762 KB 42%
memPool accounted: 3762 KB 42%
memPool unaccounted: 5290 KB 58%
memPoolAlloc calls: 79957
memPoolFree calls: 80460
File descriptor usage for squid:
Maximum number of file descriptors: 1024 #系统最大file descriptor数
Largest file desc currently in use: 18 #目前使用file descriptor最大值
Number of file desc currently in use: 10 #目前正在使用的file descriptor数
Files queued for open: 0
Available number of file descriptors: 1014
Reserved number of file descriptors: 100
Store Disk files open: 0
Internal Data Structures:
265 StoreEntries #Cache中存放的 object 的数量
219 StoreEntries with MemObjects #内存中 object 数量
218 Hot Object Cache Items #热点object 的数量
213 on-disk objects # 硬盘上的object的数量
从访问日志中查看命中情况
[root@test01 ~]# tail -f /usr/local/squid/var/logs/access.log | grep HIT
1386753542.844 4 180.153.223.26 TCP_MEM_HIT/200 60317 GET http://www.eshow365.com/guowai/country-381.html - HIER_NONE/- text/html
常用的squidclient查询语句如下:
squidclient -p 80 mgr:info #取得squid运行状态信息:
squidclient -p 80 mgr:mem #取得squid内存使用情况:
squidclient -p 80 mgr:objects #取得squid已经缓存的列表,使用时要小心,可能会造成squid崩溃:
squidclient -p 80 mgr:diskd #取得squid的磁盘使用情况:
squidclient -p 80-m PURGE http://www.361way.com #强制更新某个url,即清理某连接的squid
转载自:http://fuquanjun.blog.51cto.com/5820068/1339465