Apache 调教记

其实 VPS 开始运转之后 Apache 的设置我一直没有多留心,本着够用就好的态度这些乱七八糟勉强能用的配置也就陪伴着我的站点度过了将近一年,直到上个月 VPS 两次被普通的扫描器刷到 OOM ,我才下定决心好好整理下 Apache 的配置,顺便部署好 Fail2ban ,最后修理下访问日志不翼而飞的问题。

首先为了避免 Apache 干爆内存,我修改了 prefork 的设置。后来发现这档子 MPM 实在太不好使了,要么弱得一B要么干爆内存,于是乎 sudo apt-get install apache2-mpm-worker ,把 MPM 从老旧的 prefork 换成了 worker 。本来以为会一帆风顺的,结果发现 worker 不支持 mod-php ,PHP 得用 FastCGI 来呈现了。Apache 的 CGI 这方面我可是零经验啊,于是只好请教 Google ,搜来的方法一大票,却发现各个都不管用,php 照样被当成普通文件处理了。最后在 http://www.krzywanski.net/archives/343 终于找到了个确实能用的配置方法。另请参阅:http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidfixpathinfo ,没准有用。

在 Apache 的 MPM 换成 worker 以后发现 Apache 自身的内存占用确实小了不少,但是同时 serve 150 个 client 却不在话下。不过 PHP 的进程仍然很吃内存,一个就占掉 30-40MB ,不过好在现在 Apache 不必再为一些 404 页面而白白浪费内存了。

目前 MPM 按照以下配置工作,不知道是否合适,不行的话以后再看情况调整:

<Module mpm_worker_module>
    StartServers            3
    ServerLimit            10
    MinSpareThreads        10
    MaxSpareThreads        25 
    ThreadLimit           200
    ThreadsPerChild        25
    MaxClients            150
    MaxRequestsPerChild 10000
</IfModule>

另外,为了防止个别发了飙的扫描器,还是配置个 Fail2ban 比较好。安装之后修改下 /etc/fail2ban/fail2ban.conf 和 /etc/fail2ban/jail.conf 基本上就可以用了,不过要记住 Debian 系的系统上最好用 polling 而非 gamin 来获取日志,另外 findtime 和 maxretry 需要好好考虑考虑(现在的扫描器都很狡猾了,findtime 不见得能取得很小)。

一般情况下 apache-noscript 滤镜已经能提供足够好的保护。但是对于那些发了风的 WordPress 插件与主题后门扫描器,你还需要一个叫 apache-404 的额外滤镜:http://blog.barbarycodes.com/2010/10/06/automated-banning-of-script-kiddies-with-fail2ban/ 。不过一开始我发现这货的效果并不是很明显(一个都没抓着),而我的正则又很烂,看不出啥门道来,于是只好把滤镜改成如下简单粗暴的样子:

[Definition]
#failregex = (?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) .+ 404 [0-9]+ "
failregex = [[]client []] (File does not exist\: \/var\/www\/blog.dword1511.info\/wp-content\/)
ignoreregex =

这下世界清静多了。顺便提一下 Fail2ban 的邮件功能相当贴心,你可以知道过滤器误动作没,抓到了哪些脚本小子。不过 Gmail 好像容易把它发的邮件判成 spam ,第一次手的时候需要手动检查一下。

Apache 的日志不翼而飞的问题也很简单,启用 Virtual Hosts 以后就无所谓默认的主机了,默认的 access.log 里面自然是啥都没有,同时 Virtual Hosts 的配置文件里面我又没有指定 CustomLog ,于是就两手空空啥都没有。最后,Apache 的访问日志格式也被我改了一下,分享之:

LogFormat "%{%m-%d %H:%M}t %h,%s:%U \"%{User-Agent}i\"" mylog
LogFormat "%{%m-%d %H:%M}t %h,%s:%V%U \"%{User-Agent}i\"" mylogvh

Update:

如果要上传大文件的话,除了要修改 php.ini 里面的 post_max_size 和 max_file_uploads 以外,还需要在 Apache 的配置里加上“ FcgidMaxRequestLen xxxxxxxxx ”。

发表评论

电子邮件地址不会被公开。 必填项已用*标注