由于真正的HTTP请求常常是混合了静态请求和动态页面请求,那么很难调整Apache的设置使其既能适合静态网页请求,又能适合动态网页请求。为了提升Web服务的性能,还可以使用多个服务器,来帮助提升服务器性能。
代理服务器的加速模式
由于Apache服务器不能够特别高效的提供静态网页服务,那么就可以使用一些辅助手段来帮助Apache服务器来高效的实现静态网页服务。一个有效的方法为使用代理服务器Squid,Squid具备一种加速模式,这个模式下 Squid能将所有的HTTP请求转发给内部的真正Web服务器。然而由于Squid是单进程的服务器,这样就不会因为并发访问而产生大负载,并且它具备对静态网页的缓存功能,使得Squid不必每次都需要访问后端Web服务器。因此使用Squid能明显减轻对静态网页频繁访问造成的负载问题。
由于Squid不会带来很大的CPU负载,因此不必要让Squid单独运行在一台服务器上,可以让Squid 和Apache服务器同时运行在一台服务器上,这样通过对磁盘I/O产生一些额外的负载,但能有效的增加静态网页的服务能力。
请查看Squid的手册以得到如何设置加速模式的方法,Squid软件包含在FreeBSD的Packages Collection中。
分离静态网页服务器和动态网页服务器
由于Apache提供静态网页的服务能力不佳,那么可以将静态请求交给效率较高的服务器软件,如thttpd ,而动态请求较给Apache服务器来执行处理。这样的缺点就是其他的简易Web服务器不能提供Apache服务器一样的丰富功能,因此虽然这样做会提升效率,但一般并不建议这样设置服务器。
考虑到Apache服务器的设置因素,如果设置合适,Apache服务器本身就能提供高效的静态页面服务,只是当静态页面和动态页面混合的时候,就无法决定最优设置。尤其是当Apache支持了一些特定模块的时候,这些模块将使用大量的内存(例如一个mod_perl可能占据10M以上的内存空间),使得即使这个服务器是提供静态网页服务时,也要占用那么多内存,这样就使得为动态网页定制的设置完全不适合静态网页。
因此为了解决服务器的不同情况下的优化设置不同的问题,就可以在一台计算机同时运行两个Apache服务器,一个比较纯粹,没有支持额外的模块,只是为了和第二个服务器协作,需要支持proxy模块,用于支持静态网页,同时提供对第二个Apache服务器的代理请求,第二个Apache服务器可以载入复杂的模块,以支持动态网页。
两个Apache服务器可以根据不同的需要,进行不同的参数调整。第一个Apache服务器只进行静态网页服务和代理服务,因此可以将MaxClients设置的较大,而第二个Apache服务器要提供消耗处理器能力的动态网页服务,因此就要将MaxClients设置的较小。此时在第一个Apache服务器上设置其代理功能,虽然Apache 的代理能力比不上Squid优秀,然而这简化了服务器的种类,并能使用同一的访问控制手段
此时代理服务器是用于代理动态网页请求,和前面使用Squid代理静态网页请求的目的不同。但是也可以适用 Squid,在外部访问静态网页的时候,它代理访问第一个Web服务器,访问动态网页的时候,代理访问第二个Web服务器。
当使用这种设置方式的时候,为了使得外部客户访问第一个服务器时能自动代理到第二个服务器上,就需要在第一个 Apache上使用ProxyPass参数进行设置,将用于动态网页的CGI请求转发给第二个服务器。此时就有不同的选择,可以使用两个计算机各自运行一个Web服务器,也可以在一台计算机上安装两个Apache服务器,第一个服务器监听普通的80端口,而第二个服务器监听其他端口,例如3456,在第一个服务器的httpd.conf中设置ProxyPass:
ProxyPass /cgi-/bin/ http://localhost:3456/cgi-bin/
当在一个计算机上安装两个Apache服务器的时候,必须注意安装路径的问题。至少有一个服务器不能使用 Ports Collection直接安装,应该更改过路径设置编译安装