<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Young for you]]></title> 
<link>179401.cn/index.php</link> 
<description><![CDATA[吃好喝好！喝好吃好]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Young for you]]></copyright>
<item>
<link>179401.cn/read.php?13</link>
<title><![CDATA[配置单台squid反向代理服务器使其能承受4万并发]]></title> 
<author> &lt;&gt;</author>
<category><![CDATA[应用加速]]></category>
<pubDate>Tue, 30 Jun 2009 08:51:05 +0000</pubDate> 
<guid>179401.cn/read.php?13</guid> 
<description>
<![CDATA[ 
	<span style="font-size: 24px;">一、反向代理的概念</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;什么是反向代理呢？其实，反向代理也就是通常所说的WEB服务器加速，它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器（即：WEB反向代理服务器）来降低实际的WEB服务器的负载。典型的结构如下图所示： <br/><p align="center"><a href="http://179401.cn/file/squid1.jpg" target="_blank"><img src="http://179401.cn/file/squid1.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a></p><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Web服务器加速（反向代理）是针对Web服务器提供加速功能的。它作为代理Cache，但并不针对浏览器用户，而针对一台或多台特定Web服务器（这也是反向代理名称的由来）。实施反向代理（如上图所示），只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时，通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,这时Reverse Proxy Server设备充当Web服务器，浏览器可以与它连接，无需再直接与Web服务器相连。因此，大量Web服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患，而且能够很大程度上减轻web服务器的负担，提高访问速度。<br/><br/><span style="font-size: 24px;">二、反向代理工作原理</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;反向代理服务器位于本地WEB服务器和Internet之间,如下图所示：<br/><p align="center"><a href="http://179401.cn/file/squid2.jpg" target="_blank"><img src="http://179401.cn/file/squid2.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a></p><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当用户浏览器发出一个HTTP请求时，通过域名解析将请求定向到反向代理服务器（如果要实现多个WEB服务器的反向代理，需要将多个WEB服务器的域名都指向反向代理服务器）。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据（比如html网页和图片等），而一些CGI脚本程序或者ASP之类的程序不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面<br/><br/><span style="font-size: 24px;">三、具体搭建过程</span><br/><br/><span style="font-size: 18px;">1、安装squid</span><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE15.tar.gz<br/>tar zxvf squid-3.0.STABLE15.tar.gz<br/>cd squid-3.0.STABLE15<br/>./configure --prefix=/usr/local/squid &#92;<br/>--enable-dlmalloc &#92;<br/>--enable-gnuregex &#92;<br/>--enable-async-io &#92;<br/>--enable-removal-policies='heap,lru' &#92;<br/>--enable-delay-pools &#92;<br/>--enable-snmp &#92;<br/>--enable-storeio='ufs,aufs,null' &#92;<br/>--disable-wccp &#92;<br/>--enable-kill-parent-hack &#92;<br/>--disable-select &#92;<br/>--enable-auth=basic &#92;<br/>--with-aio &#92;<br/>--disable-ident-lookup &#92;<br/>--with-filedescriptors=102400 &#92;<br/>--enable-epoll &#92;<br/>--enable-linux-netfilter &#92;<br/>--enable-underscore &#92;<br/>--enable-arp-acl &#92;<br/>--enable-arp-acl &#92;<br/>--enable-cache-digests &#92;<br/>--enable-icmp &#92;<br/>--enable-large-cache-file &#92;<br/>--with-large-files &#92;<br/>--localstatedir=/var/squid &#92;<br/>--enable-stacktraces<br/>make && make install</div></div><br/>相关编译参数说明：<br/><span style="color: #87CEEB;">--prefix=/usr/local/squid</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定squid日志，二进制文件和配置文件的默认位置，squid会将var目录也放在这下面，在这个目录下面会有日志文件，日志文件通常会很大，因此建议将其放在较大的磁盘下面，你可以使用 —localstatedir 选项。<br/><span style="color: #87CEEB;">--localstatedir=/bigdisk/var </span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定var目录的安装位置<br/><span style="color: #87CEEB;">--enable-dlmalloc[=LIB]</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一些系统上，内建的内存分配机制（malloc）在使用squid时表现不尽人意。使用--enable-dlmalloc选项将squid源代码包中的dlmalloc包编译和链接进来。假如你的系统中已安装dlmalloc，你能使用=LIB参数指定库的路径。请 http://g.oswego.edu/dl/html/malloc.html更多关于dlmalloc的信息。<br/><span style="color: #87CEEB;">--enable-gnuregex</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在访问控制列表和其他配置指令里，squid使用正则表达式作为匹配机制。GNU的正则表达式库包含在squid的源代码包里；它可以在没有内建正则表达式的操作系统中使用。./configure脚本侦察你系统中的正则表达式库，假如必要，它可以激活使用GNU正则表达式。如果因为某些理由，你想强制使用GNU正则表达式，你可以将这个选项加到./configure命令后。<br/><span style="color: #87CEEB;">--enable-async-io[=N_THREADS]</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 异步I/O是squid技术之一，用以提升存储性能。aufs模块使用大量的线程来执行磁盘I/O操作。该代码仅仅工作在linux和solaris系统中。=N_THREADS参数改变squid使用的线程数量。aufs 在多cup 系统上优势更为明显，设置的线程数量不要过多。squid默认根据缓存目录的数量，自动计算需要使用多少线程。<br/><span style="color: #87CEEB;">--enable-removal-policies='heap,lru' </span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 排除策略是squid需要腾出空间给新的cache目标时，用以排除旧目标的机制。squid-2.5支持3个排除策略：最少近期使用(LRU),贪婪对偶大小(GDS),最少经常使用(LFU)。。LRU是默认的，它以双链表数据结构执行。<br/><span style="color: #87CEEB;">--enable-delay-pools</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 延时池是squid用于传输形状或带宽限制的技术。该池由大量的客户端IP地址组成。当来自这些客户端的请求处于cache丢失状态，他们的响应可能被人工延迟。<br/>--enable-snmp<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单网络管理协议(SNMP)是监视网络设备和服务器的流行方法。该选项导致编译过程去编译所有的SNMP相关的代码，包括一个裁切版本的CMU SNMP库。<br/><span style="color: #87CEEB;">--enable-cachemgr -hostname[=hostname]</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cachemgr是一个CGI程序，你能使用它来管理查询squid。默认cachemgr的hostname值是空的，但你能使用该选项来指定一个默认值<br/><span style="color: #87CEEB;">--enable-htcp</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTCP是超文本缓存协议--类似于ICP的内部缓存协议。<br/><span style="color: #87CEEB;">--enable-ssl</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用该选项赋予squid终止SSL/TLS连接的能力。注意这仅仅工作在web加速器中用以加速请求。<br/><span style="color: #87CEEB;">--with-openssl[=DIR]</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假如必要，你使用该选项来告诉squid到哪里找到OpenSSL库或头文件。假如它们不在默认位置，在该选项后指定它们的父路径。例如： ./configure --enable-ssl --with-ssl=/opt/foo/openssl，在这个例子中，你的编译器将在/opt/foo/openssl/include目录中找头文件，在/opt/foo/openssl/lib中找库文件。<br/><span style="color: #87CEEB;">--enable-cache-digests</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cache消化是ICP的另一个替代，但有着截然不同的特性。<br/><span style="color: #87CEEB;">--enable-err-languages="Simplify_Chinese"<br/>--enable-default-err-languages="Simplify_Chinese"</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面两个选项告诉Squid编入并使用简体中文错误信息。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; squid支持定制错误消息，错误消息可以用多种语言报告。该选项指定复制到安装目录($prefix/share/errors)的语言。假如你不使用该选项，所有可用语言被安装。想知道何种语言可用，请见源代码包里errors目录下的目录列表。<br/><span style="color: #87CEEB;">--enable-epoll：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用epoll模型（只支持2.6内核）<br/><span style="color: #87CEEB;">--enable-linux-netfilter：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以支持透明代理<br/><span style="color: #87CEEB;">--enable-underscore：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许解析的URL中出现下划先，因为默认squid会认为带下划线的URL地址是非法的，并拒绝访问该地址。<br/><span style="color: #87CEEB;">--enable-arp-acl：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以在规则设置中直接通过客户端的MAC地址进行管理，防止客户使用IP欺骗。<br/><span style="color: #87CEEB;">--disable-ident-lookups：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;防止系统使用RFC931规定的身份识别方法。 <br/><span style="color: #87CEEB;">--enable-cahce-digests：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加快请求时，检索缓存内容的速度。<br/><span style="color: #87CEEB;">--enable-icmp：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加入icmp支持。 <br/><span style="color: #87CEEB;">--enable-kill-parent-hack：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关掉suqid的时候，要不要连同父进程一起关掉，这个当然要啦<br/><span style="color: #87CEEB;">--with-filedescriptors=102400：</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置squid可以同时打开的文件数，此参数比较重要<br/><span style="font-size: 18px;">2、创建squid用户和组：</span><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">useradd squid -M -c "Squid user" -d /dev/null -s /sbin/nologin</div></div><br/><span style="font-size: 18px;">3、配置squid</span><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">rm -f /usr/local/squid/etc/squid.conf <br/>vi /usr/local/squid/etc/squid.conf</div></div><br/>使用以下内容：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">cache_effective_user squid<br/>cache_effective_group squid<br/>visible_hostname squid.test.com<br/>http_port 80 accel vhost vport<br/>cache_peer www.test.com parent 8080 0 no-query originserver<br/>acl all src<br/>http_access allow all<br/>cache_log /var/squid/logs/cache.log<br/>acl QueryString url_regex &#92;.php?<br/>no_cache deny QueryString<br/>maximum_object_size 10240 KB<br/>maximum_object_size_in_memory 512 KB</div></div><br/>参数说明：<br/><span style="color: #87CEEB;">cache_effective_user<br/>cache_effective_group</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表明运行squid进程的用户和组都为squid<br/><span style="color: #87CEEB;">visible_hostname</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;squid服务器的名称，没有这项服务启动不了<br/><span style="color: #87CEEB;">http_port 80 accel vhost vport</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表明squid监听本机80端口加速web访问，后面的vhost和vport必须加<br/><span style="color: #87CEEB;">cache_peer www.test.com parent 8080 0 no-query originserver</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置真实服务器，上面的选项表明为加速www.test.com:8080端口的访问<br/><span style="color: #87CEEB;">acl all src<br/>http_access allow all<br/>cache_log /var/squid/logs/cache.log<br/>acl QueryString url_regex &#92;.php?<br/>no_cache deny QueryString</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;访问控制与日志的存放位置，上面的选项表明允许所有的访问，日志存放于/var/squid/logs/，不缓存.php文件<br/><span style="color: #87CEEB;">maximum_object_size 10240 KB</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大缓存文件大小<br/><span style="color: #87CEEB;">maximum_object_size_in_memory 512 KB</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内存中缓存文件大小<br/><span style="font-size: 18px;">4、优化linux内核</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linux内核的优化根据具体情况来定，其中比较重要的参数有：<br/><span style="color: #87CEEB;">net.ipv4.tcp_max_tw_buckets = 6000</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示允许的最多timewait数量，这个值根据服务器的情况来定，不建议太高<br/><span style="color: #87CEEB;">net.ipv4.ip_local_port_range = 1024&nbsp;&nbsp;&nbsp;&nbsp;65000</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许tcp连接打开的端口范围，上面指定为1024-65000<br/>&nbsp;&nbsp;&nbsp;&nbsp; 参考优化参数：（将此参数插入到/etc/sysctl.conf文件中）<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">net.ipv4.ip_forward = 0<br/>net.ipv4.conf.default.rp_filter = 1<br/>net.ipv4.conf.default.accept_source_route = 0<br/>kernel.sysrq = 0<br/>kernel.core_uses_pid = 1<br/>net.ipv4.tcp_syncookies = 1<br/>kernel.msgmnb = 65536<br/>kernel.msgmax = 65536<br/>kernel.shmmax = 68719476736<br/>kernel.shmall = 4294967296<br/>net.ipv4.tcp_max_tw_buckets = 6000<br/>net.ipv4.tcp_sack = 1<br/>net.ipv4.tcp_window_scaling = 1<br/>net.ipv4.tcp_rmem = 4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8388608&nbsp;&nbsp; 16777216<br/>net.ipv4.tcp_wmem = 4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8388608&nbsp;&nbsp; 16777216<br/>net.core.wmem_default = 8388608<br/>net.core.rmem_default = 8388608<br/>net.core.rmem_max = 16777216<br/>net.core.wmem_max = 16777216<br/>net.core.netdev_max_backlog = 262144<br/>net.core.somaxconn = 262144<br/>net.ipv4.tcp_max_orphans = 262144<br/>net.ipv4.tcp_max_syn_backlog = 262144<br/>net.ipv4.tcp_timestamps = 0<br/>net.ipv4.tcp_synack_retries = 2<br/>net.ipv4.tcp_syn_retries = 2<br/>net.ipv4.tcp_tw_recycle = 1<br/>net.ipv4.tcp_tw_reuse = 1<br/>net.ipv4.tcp_mem = 94500000 915000000 927000000<br/>net.ipv4.tcp_tw_recycle = 1<br/>net.ipv4.tcp_fin_timeout = 1<br/>net.ipv4.tcp_keepalive_time = 60<br/>net.ipv4.ip_local_port_range = 1024&nbsp;&nbsp;&nbsp;&nbsp;65000</div></div><br/>运行命令使其生效：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">sysctl -p</div></div><br/><span style="font-size: 18px;">5、创相关目录并启动squid</span><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">mkdir /var/squid<br/>chown -R squid.squid /var/squid<br/>ln -s /usr/local/squid/sbin/squid /usr/sbin/<br/>ln -s /usr/local/squid/bin/squidclient /usr/bin/<br/>ulimit -SHn 102400<br/>squid -z<br/>squid</div></div><br/>查看squid服务是否正常启动，端口是否打开<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">netstat -an &#124; grep 80</div></div><br/><span style="font-size: 18px;">6、测试</span><br/>首先创建一个测试页面，这里给出一个包含js,css以及一些图片文件的页面:<a href="http://179401.cn/file/test.tar.gz">点击这里下载文件</a><br/>将这个页面在真实服务器上通过apache或其他web服务发布<br/>分别在两台服务器上使用webbench同时进行测试，webbench下载与安装方法：<a href="http://blog.s135.com/post/288/" target="_blank">http://blog.s135.com/post/288/</a><br/>使用如下命令：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">webbench -c 20000 -t 600 http://www.test.com/index.html</div></div><br/>在squid服务器使用如下命令查看tcp连接数：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">netstat -n &#124; awk '/^tcp/ &#123;++S[$NF]&#125; END &#123;for(a in S) print a, S[a]&#125;'</div></div><br/>一般情况下服务器应该可以承受20000个左右的并发，下面贴一张我的测试结果：<br/><p align="center"><a href="http://179401.cn/file/squid3.jpg" target="_blank"><img src="http://179401.cn/file/squid3.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a></p><br/>参考文档：<br/>http://blog.chinaunix.net/u3/93182/showart_1867043.html<br/>Tags - <a href="179401.cn/tag.php?tag=squid" rel="tag">squid</a> , <a href="179401.cn/tag.php?tag=%25E9%25AB%2598%25E5%25B9%25B6%25E5%258F%2591" rel="tag">高并发</a>
]]>
</description>
</item>
</channel>
</rss>