近来一台windows服务器出现proxy error的问题,重新刷新可能又好了。这台服务器通过proxy_pass指令指向别的服务器上。
本身配置指令都不多,之前的肯定不会动了。(之前的如果有问题,肯定就访问不了)在本来的基础上增加以下三处改动吧。
1、增大访问者和服务器的超时时间设置。
2、开启keepalive。
3、增大apache 和大陆服务器之间的proxy的超时时间。
首 先将,Timeout时间由默认的300 改为600吧!接着开启keepalive,让图片和CSS、JS之类的访问也都占用独立的进程(之前是通过在一个进程上fork)。这样设了岂不是会对 后面的访问造成影响。肯定的,还好我这台服务器访问量不是特别高。再加个KeepAliveTimeout配置,设为20s吧!不能总让你占着道,不让后 面的访问不到吧!最后,再加个ProxyTimeout参数吧!
Timeout600KeepAliveOnKeepAliveTimeout20#StartServers 4<IfModule mod_proxy>ProxyTimeout600</IfModule>
可能有人会问我为什么会注释掉的一个参数。是的,这个参数是必须注释掉的,不然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文件中做如下设置来打开它:
SetHandler server-status
Order deny,allow
Denyfrom all
#如果限制某个IP访问则设置为 Allow from 192.168.1.1Allowfrom all
综合来说,因为Windows NT下Apache只能启动父子两个进程,因此只能通过增大单个进程的线程数以及单个进程能够处理的最大请求数来进行优化。其他优化的参数同Linux系统下是一样的,大家可以加以参考。下面针对上述两个参数给出一个建议的设置:
ThreadsPerChild 250
MaxRequestsPerChild 5000
|