近来公司在香港的一台windows服务器会出现proxy error的问题,重新刷新可能又好了。因为我这台服务器放在香港也只是摆个架子。真正的data数据是放在大陆的。我在香港服务器上通过proxy_pass指令指向大陆的服务器上。 市场部的人把情况反应给了我们这边的BOSS,BOSS便指使我查找原因。老大,这是香港和大陆之间互防,线路时有不好时,出现proxy不到也很正常啊!BOSS肯定不会理会咱的申诉了,只会说发你工资干吗呢,就是让你解决这样的问题的!谁让咱是小喽啰呢!屁颠屁颠的去办吧!

本身配置指令都不多,之前的肯定不会动了。(之前的如果有问题,肯定就访问不了)在本来的基础上增加以下三处改动吧。

1、增大访问者和服务器的超时时间设置。

2、开启keepalive。

3、增大apache 和大陆服务器之间的proxy的超时时间。

首先将,Timeout时间由默认的300 改为600吧!接着开启keepalive,让图片和CSS、JS之类的访问也都占用独立的进程(之前是通过在一个进程上fork)。这样设了岂不是会对后面的访问造成影响。肯定的,还好我这台服务器访问量不是特别高。再加个KeepAliveTimeout配置,设为20s吧!不能总让你占着道,不让后面的访问不到吧!最后,再加个ProxyTimeout参数吧!

1Timeout 600
2KeepAlive On
3KeepAliveTimeout 20
4#StartServers 4
5ProxyTimeout 600

可能有人会问我为什么会注释掉的一个参数。是的,这个参数是必须注释掉的,不然apache起来有困难。下面就讲为什么会注释掉这个参数。

在linux下StartServers这个参数是控制父进程数量的。我本来以为在windows下的apache下使用也一样。不过,在我设置为该参数以后,apache确怎么也起不来。查了半天原因,发现是因为:

apahce在windows下有个mpm_winnt_module模块(不用在module文件夹里找了。静态编译的,就像linux下httpd -l 列出的那几个一样。)mpm_winnt.c 是专门针对Windows NT优化的MPM(多路处理模块),它使用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理请求。也就是说 mpm_winnt只能启动父子两个进程, 不能像Linux下那样同时启动多个进程。

mpm_winnt主要通过ThreadsPerChild和MaxRequestsPerChild两个参数来优化Apache,下面详细来说明一下。

1、ThreadsPerChild

这个参数用于设置每个进程的线程数, 子进程在启动时建立这些线程后就不再建立新的线程了. 一方面因为mpm_winnt不能启动多个进程, 所以这个数值要足够大,以便可以处理可能的请求高峰; 另一方面该参数以服务器的响应速度为准的, 数目太大的反而会变慢。因此需要综合均衡一个合理的数值。

mpm_winnt上的默认值是64, 最大值是1920. 这里建议设置为100-500之间,服务器性能高的话值大一些,反之值小一些。

2、MaxRequestsPerChild

该参数表示每个子进程能够处理的最大请求数, 即同时间内子进程数目。设置为零表示不限制,mpm_winnt上的默认值就是0。官方参考手册中不建议设置为0,,主要基于两点考虑::(1) 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存; (2) 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

因此这个参数的值更大程度上取决于服务器的内存,如果内存比较大的话可以设置为0或很大的数字,否则设置一个小的数值。需要说明的是,如果这个值设置的太小的话会造成Apache频繁重启,在日志文件中会看到如下的文字:

Process exiting because it reached MaxRequestsPerChild. Signaling the parent

这样一来降低了Apache的总体性能。

另外,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开它:

1SetHandler server-status
2Order deny,allow
3Deny from all
4#如果限制某个IP访问则设置为 Allow from 192.168.1.1
5Allow from all

综合来说,因为Windows NT下Apache只能启动父子两个进程,因此只能通过增大单个进程的线程数以及单个进程能够处理的最大请求数来进行优化。其他优化的参数同Linux系统下是一样的,大家可以加以参考。下面针对上述两个参数给出一个建议的设置:

1ThreadsPerChild 250
2MaxRequestsPerChild 5000