一.Squid是什么?
Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net/)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。
2.squid各种代理的定义
正向代理
a.标准的代理缓冲服务器
一个标准的代理缓冲服务被用于缓存静态的网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时,每次都把请求送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发给客户端浏览器。
b.透明代理缓冲服务器(常用在局域网网关上安装,配合防火墙reject使用)
透明代理缓冲服务和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于Linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。
反向代理
a.反向代理缓冲服务器
反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。
二.系统架构
1.原理说明
通过DNS的轮询技术,将来自客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户,否则 Squid 将此次请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理,这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。
2.主机分配:
DNS服务器: 启用两张网卡,连接两个网段
eth0:10.10.54.15.150
eth1:172.16.54.254
两台squid反向代理服务器
squid1:172.16.54.150
squid2:172.16.54.151
两台web服务器,安装Discuz_X3.0_SC_UTF8.zip
web1:172.16.54.200
web2:172.16.54.201
三台mysql服务器
master:172.16.54.203
slave1:172.16.54.204
slave2:172.16.54.205
三:具体配置
1.首先进行内存优化
# 编辑sysctl.conf文件添加以下内容 vi /etc/sysctl.conf net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 65536 4194304 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 262144 net.core.somaxconn = 262144 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 786432 1048576 1572864 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 1024 65000 #以上配置说明: net.ipv4.tcp_rmem = 4096 87380 4194304:TCP读buffer,可参考的优化值: 32768 436600 873200 net.ipv4.tcp_wmem = 4096 65536 4194304:TCP写buffer,可参考的优化值: 8192 436600 873200 net.core.wmem_default:表示发送套接字缓冲区大小的缺省值(以字节为单位) net.core.rmem_default:表示接收套接字缓冲区大小的缺省值(以字节为单位) net.core.rmem_max :表示接收套接字缓冲区大小的最大值(以字节为单位) net.core.wmem_max:表示发送套接字缓冲区大小的最大值(以字节为单位) net.core.netdev_max_backlog = 262144:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.core.somaxconn = 262144:web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。 net.ipv4.tcp_max_orphans = 3276800:系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。 net.ipv4.tcp_max_syn_backlog = 8192:表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。 net.ipv4.tcp_max_tw_buckets = 5000:表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。减少它的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。 net.ipv4.tcp_timestamps = 0:时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号,时间戳能够让内核接受这种“异常”的数据包,这里需要将其关掉。 net.ipv4.tcp_tw_recycle = 1:表示开启TCP连接中TIME-WAIT sockets的快速回收。 net.ipv4.tcp_tw_reuse = 1:表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接。 net.ipv4.tcp_mem = 786432 1048576 1572864:同样有3个值,net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力;net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段;net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。可根据物理内存大小进行调整,如果内存足够大的话,可适当往上调。建议94500000 915000000 927000000。 net.ipv4.tcp_fin_timeout = 30:表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。 net.ipv4.tcp_keepalive_time = 1200:表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。 net.ipv4.ip_local_port_range = 1024 65000:表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。 #使配置立即生效: /sbin/sysctl -p
2.配置DNS服务器,实现轮询
#安装DNS服务器,并配置named.conf shell> vim /etc/named.conf options { listen-on port 53 { any; }; allow-query { any; }; recursion yes; #rrset-order表明对bbs.centos.com域中的IN记录使用轮询 rrset-order { class IN typeA name "bbs.centos.com"order cyclic; }; }; zone "."IN { typehint; file"named.ca"; }; zone "centos.com"IN { typemaster; file"named.lij.com"; }; zone "54.16.172.in-addr.arpa"IN { typemaster; file"named.172.16.54"; }; #配置正解域 shell> vim /var/named/named.centos.com $TTL 600 @ IN SOA centos.com. ftp. ( 2011080404 3H 15M 1W 1D) @ IN NS ceontos.com. centos.com. IN A 10.10.54.150 @ IN MX 10 mail.ceontos.com. mail.centos.com. IN A 10.10.54.151 bbs.centos.com. IN A 172.16.54.150 bbs.centos.com. IN A 172.16.54.151 #重启 shell> /etc/init.d/named restart #测试DNS轮询是否生效,通过两次ping shell> ping bbs.centos.com PING bbs.centos.com (172.16.54.151) 56(84) bytes of data. 64 bytes from 172.16.54.151: icmp_seq=1 ttl=64 time=0.441 ms #再次ping shell> ping bbs.centos.com PING bbs.centos.com (172.16.54.150) 56(84) bytes of data. 64 bytes from 172.16.54.150: icmp_seq=1 ttl=64 time=0.019 ms #上面可以看到两次ping的IP并不相同 注意:测试机的DNS服务器需要配置为10.10.54.150这台
3.配置两台squid服务器
#编译安装squid yum install gcc wget perl gcc-c++ make cd /tmp wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.19.tar.gz tar xzf squid-3.1.19.tar.gz cd squid-3.1.19 ./configure --prefix=/usr/local/squid --enable-gnuregex --disable-carp --enable-async-io=240 --with-pthreads --enable-storeio=ufs,aufs,diskd --disable-wccp --enable-icmp --enable-kill-parent-hack --enable-cachemgr-hostname=localhost --enable-default-err-language=Simplify_Chinese --with-maxfd=65535 --enable-poll --enable-linux-netfilter --enable-large-cache-files --disable-ident-lookups --enable-default-hostsfile=/etc/hosts --with-dl --with-large-files --enable-delay-pools --enable-snmp --disable-internal-dns --enable-underscore -enable-arp-acl make && make install #创建squid缓存目录,和日志目录 groupadd squid useradd -g squid -s /sbin/nologin squid mkdir /squid/data -p mkdir /squid/log chown -R squid.squid /squid #编辑squid配置文件 #用户和用户组 cache_effective_user squid cache_effective_group squid #主机名 visible_hostname squid1.lij.com #配置squid为反向代理模式 http_port 172.16.54.150:80 accel vhost vport #配置squid2为其邻居,当 squid1 在其缓存中没有找到请求的资源时,通过 ICP查询去其邻居中取得缓存 icp_port 3130 cache_peer 172.16.54.151 sibling 80 3130 #配置squid1的两个父节点(web server),originserver参数指明是源服务器, round-robin参数指明squid通过轮询方式将请求分发到其中一台父节点; squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了,那么 squid 会从剩余的 origin 服务器中抓取数据 cache_peer 172.16.54.200 parent 80 0 originserver round-robin cache_peer 172.16.54.201 parent 80 0 originserver round-robin #下面是一些访问控制、日志和缓存目录的设置 cache_mem 128 MB maximum_object_size_in_memory 4096 KB maximum_object_size 10240 KB cache_dir aufs /squid/data 4000 16 512 coredump_dir /squid/data #日志路径 cache_access_log /squid/logs/access.log cache_log /squid/logs/cache.log cache_store_log /squid/logs/store.log acl localnet src 10.10.54.0/24 http_access allow all icp_access allow localnet 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
注意:
1.squid2上配置和squid1上配置完全一样,只需要修改相关IP,如下
visible_hostname squid2.lij.com
http_port 172.16.54.151:80 accel vhost vport
icp_port 3130
cache_peer 172.16.54.150 sibling 80 3130
2.两台squid上都要添加hosts记录
vim /etc/hosts
172.16.54.200 squid1.lij.com
172.16.54.201 squid2.lij.com
四.配置nginx服务器
user apache apache; worker_processes 2; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘; access_log logs/access.log; sendfile off; keepalive_timeout 65; # gzip on; server { listen 80; server_name bbs.centos.com; root /var/www/bbs/upload; charset utf-8; index index.php index.html; access_log logs/bbs.access.log; location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; include fastcgi.conf; } location /server-status { stub_status on; allow all; access_log off; } }
五.配置论坛数据库
1.这个web架构为clients-->DNS轮询-->squid加速-->web-->mysql主从
2.负载均衡除了使用DNS轮询之外,也可以使用LVS+keepalieve实现,两台realserver配置为squid1和squid2
3.这篇文章对于两台web之间的数据同步没有提及,但是实际环境中必须要保证数据同步
4.在两台server上安装Discuz_X3.0_SC_UTF8.zip论坛工具,论坛数据库放在master主机上,两台slave实现数据同步
参考文章:
http://www.centos.bz/2012/05/squid-reverse-proxy-deploy/
http://rfyiamcool.blog.51cto.com/1030776/915092
本文出自 “fightering-cluter” 博客,请务必保留此出处http://3974020.blog.51cto.com/3964020/1393353