Web服务器问题

作者:港云互联 时间:2019-10-14

        Apache是最流行的Web应用服务器软件。它在许多情况下都运行良好,但如果使用不当也会消耗大量的资源。最常见的问题总保持它的进程的存话(aivo) 时间过长,或者在各种不同的用途下混合使用,而不是分别对不同类型的工作进行优化。

Web服务器

        Apache通常是通过prefork配置来使用mod php,mod perl和mod python模块的。prefork模式会为每个请求预分配进程。因为PHP Perl和Python脚本是可以定制化的,每个进程使用SOMB成10MB内存的情情况并不少见。当一个请求完成后,会释放大部分内存给操作系统,但并不是全部。Apache会保持进程处于打开状态以备后来的请求重用。这意味着,如果下一个请求是请求静态文件,比如一个CSS文件或者一张图片,就会出现用一个占用内存很多的进程来为一个很小的请求服务的情况。这就是使用Apache作为通用Web服务器很危险的原因。它的确是为通用目的而设计的,但如果能够有针对性地使用其长处,会获得更好的性能。


        另一个主要的问题是,如果开启了KepAlive设置,进程可能很长时间处于繁忙状态。当然,即使没有开启Kep-Alive某些进程也可能存活很久,“填鸭式”地将内容传给客户端可能导致获取数据很慢。


        人们常犯的另外一个错误, 就是保持那些Apache默认开启的模块不动。


        最好能够精简Apache的模块,移除掉那些不需要的。这很简单:只需要检查Apache的配置文件,注释掉不想要的模块,然后重启Apache就行。也可以在php.ini文件中删除不使用的PHP模块。


        最差情况是,如果用一个通用目的的Apache配置直接用于Web服务,最后很可能产生很多重量级的Apache进程。这将浪费Web服务器的资源。它们还可能保持大量MySQL连接,浪费MySQL的资源。下面是一些 可以降低服务器负载的方法。


        不要使用Apache来做静态内容服务,或者至少和动态服务使用不同的Apache实例。流行的替代品有Nginx和lighttpd。


        使用缓存代理服务器,比如Squid或者Varnish,防止所有的请求都到达Web服务器。这个层面即使不能缓存所有页面,也可以缓存大部分页面,并且使用像ESI (EdgeSide Includes, )这样的技术来将部分页面中的小块的动态内容嵌入到静态缓存部分。


        对动态和静态资源都设置过期策略。可以使用Squid这样的缓存代理显式地使内容过期。维基百科就使用了这个技术来清理缓存中变更过的文章。


        有时也许还需要修改应用程序,以便得到更长的过期时间。例如,如果你告诉浏览器永久缓存CSS和JavaScript文件,然后对站点的HTML做了一个修改,这个页面谊染将会出问题。这种情况可以为文件的每个版本设定唯-的文件名。 例如,你可以定制网站的发布脚本,复制CSS文件到/s13 fonpgecss,这里的123就是版本管理器中的版本号。对图片文件的文件名也可以这么做一永不重用文件名, 这样页面就不会在升级时出问题,浏览器缓存多久的文件都没问题。


注1:填鸭式抓取发生在当 一个客户端发起HTP请求,但是没有迅速获取结果时,直到客户端花取整个结果,HTTP连接以及处理的 Apache进程都将保持活跃。


注2:有一本关于如何优化Web应用的很不错的书,尽管书中大部分内容从客户的角度来看如何让Web站点运行更快,但是参考他的建议也有利于你的服务器。


        不要让Apache填鸭式地服务客户端,这不仅仅会导致慢,也会导致DDoS攻击变得简单。硬件负载均衡器通常可以做缓冲,所以Apache可以快速地完成,让负载均衡器通过缓存响应客户端的请求,也可以在应用服务器前端使用Nginx. Squid 或者事件驱动模式下的Apache。


        打开gzip压缩。对于现在的CPU而言这样做的代价很小,但是可以节省大部分流量。如果想节省CPU周期,可以使用缓存,或者诸如Nginx这样的轻量级服务器保存压缩过的页面版本。


        不要为用于长距离连接的Apache配置启用Keep-Alive选项,因为这会使得重量级的Apache进程存活很长时间。可以用服务器端的代理来处理保持连接的工作,从而防止Apache被客户端拖垮。配置Apache到代理之间的连接使用Keep-Alive是可以的,因为代理只会使用很少的Apache连接去获取数据。


        这些策略可以使Apache进程存话时间变得很短,所以会有比实际需求更多的进程。无论如何,有些操作依然可能导致Apache进程存活时间太长,并且占用大量资源。举个例子,一个请求查询延时非常大的外部资源,例如远程的Web服务,就会出现Apache进程存话时间太长的问题。这种问题通常是无解的。




新人注册,即送价值满880元现金劵

立即注册>>
客服 电话 反馈 活动 回顶部

服务热线

+852-5764-9835

1对1贴心服务,7X24小时热线