使用X-sendfile解决discuz 论坛大文件下载时lighttpd 进程本身内存暴涨的问题
朋友的一个论坛采用discuz,为了提高性能,我从apapche2改到了lighttpd fastcgi php改造的效果还是满意的,缺点就是过一段时间以后lighttpd进程本身的内存就暴涨,本来应该在20M左右,居然能涨到超过600M ,继而服务器响应迟缓,放狗搜了一圈,发现了问题的所在。
原来朋友的论坛,定期发行一份杂志,杂志大大小在6-7M之间,而lighttpd fastcgi php为基础的discuz论坛的处理下载总结起来一句话,一个请求过来,整个把要下载的文件缓存的内存中,下载完成后再释放掉缓存,比如说有用户使用多线程下载工作,开了10个线程下载同一个pdf,pdf大小是10M,那么这时候lighttpd进程的内存瞬间就暴涨到100M。
我们都知道lighttpd本身处理静态文件的能力是很强的,很多下载网站都是使用它,包括我所在的几个游戏公司,提供的客户端http下载也大都是使用它,问题的关键是在论坛程序中,被提供下载的pdf文件每次都不是由lighttpd本身去处理的,每一个请求过来,都要通过fastcgi 中php的几个文件操作方式将文件读入,然后返回给lighttpd发送到用户,整个过程等于是放屁之前除了不脱裤子还多穿了一层,当然不会爽快淋漓了!
知道了问题的原因,开始想解决的办法,去lighttpd的官方网站逛了一圈,发现fastcgi有一个 allow-x-send-file参数,仔细研究了下,终于找到了解决的办法。
解决的办法有两个
1. 增设专门的服务器存储附件,将附件的下载挪到另外一台服务器上
2.在discuz论坛处理附件的php程序上动一个手脚,使之在处理附件的时候在开始附件下载的时候打出一个X-sendfile的头出来,并且修改lighttpd的配置,打开其fastcgi中的allow-x-send-file选项,让lighttpd每次处理一个带X-sendfile头部的文件时直接当成静态文件自己去读,并缓存起来给所有的请求共享,而不是来一个请求读一个放在内存中。
上两张图,一个是lighttpd配置文件中打开 all-x-send-file,一个是hack discuz的附件处理php文件,对附件打上 x-sendfile的头。
修改discuz附件处理的php程序第164行
文章作者:suibing
本文地址:http://www.suibing.com/149.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!
