一、安装

# 解压缩
tar jxvf httpd-2.2.2.tar.bz2
cd httpd-2.2.0

# vi server/mpm/worker/worker.c
找到下面几行,并改成如下的数值,其目的是在源码中修改apache可支持的最大线程数和最大客户端数目。
# define DEFAULT_SERVER_LIMIT 256
# define MAX_SERVER_LIMIT 40000
# define DEFAULT_THREAD_LIMIT 256
# define MAX_THREAD_LIMIT 40000


# 编译和安装 apr 1.2
cd srclib/apr
./configure --prefix=/home/liuchao/local/apr
make
make install

# 编译和安装 apr-util 1.2
cd ../apr-util
./configure --prefix=/home/local/apr-util --with-apr=/home/local/apr
make
make install

优化编译选项及配置apache可加载的模块
patch -p1 < ../mod_limitipconn-0.22/apachesrc.diff
/usr/local/apache2.2.3/bin/apxs -c -i -a mod_limitipconn.c
/usr/local/apache2.2/bin/apxs -c -i -a mod_evasive20.c

更改2Glogs
export CFLAGS="-O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
然后编译cronolog即可
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

./configure --prefix=/usr/local/apache2.2.3 --enable-mods-shared=all --enable-so --with-mpm=worker --enable-deflate --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache --enable-proxy --enable-rewrite --enable-charset-lite --enable-suexec --with-suexec-bin=/usr/sbin/suexec --disable-ipv6 -disable-dav --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

# 编译及安装
gmake && make install

二、优化apache配置选项

在主配置文件httpd.conf注释下一行,这样做的目的是把apache的功能配置分成小文件,便于修改和移植
Include conf/Includes/*.conf

修改MPM(多道处理器)参数
# cd /usr/local/apache2.2
# vi conf/extra/httpd-mpm.conf
找到如下选项,并改成对应的数值

<IfModule mpm_worker_module> 
          ServerLimit           64
          ThreadLimit          128
          StartServers           8
          MaxClients          8192
          MinSpareThreads       64
          MaxSpareThreads       256
          ThreadsPerChild       128
          MaxRequestsPerChild    0
</IfModule>

      ServerLimit              64
      ThreadLimit              64
      StartServers              8
      MaxClients             4096
      MinSpareThreads          64
      MaxSpareThreads         256
      ThreadsPerChild          64
      MaxRequestsPerChild     500

测试过的配置:<IfModule mpm_worker_module>
         ServerLimit          32
         ThreadLimit          64
         StartServers          8
         MaxClients         2048
         MinSpareThreads      64
         MaxSpareThreads      256
         ThreadsPerChild       64
         MaxRequestsPerChild   0
</IfModule>

修改apache2.2子进程所有者
# vi /usr/local/apache2.2/conf/httpd.conf
把daemon改为nobody
User nobody
Group nobody

一般说来,可以不需要的模块包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已经过时了
#LoadModule includes_module libexec/mod_include.so
#不需要将没有缺省index文件的目录下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#尽量不使用CGI:一直是Apache安全问题最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全认证可以大大提高访问速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so
最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件应用的关联
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so

可用可不用的有:
#比如:需要在~/username/下调试php可以将
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要将以前的URL进行转向或者需要使用CGI scrīpt-alias
LoadModule alias_module libexec/mod_alias.so


三、配置模块

1.配置静态页面压缩输出模块deflate

使用mod_deflate模块

在httpd.conf中加入以下设置:

SetOutputFilter DEFLATE
DeflateFilterNote ratio
SetEnvIfNoCase Request_URI /.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI /.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI /.pdf$ no-gzip dont-vary

或者

DeflateFilterNote ratio
AddOutputFilterByType DEFLATE text/*
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscrīpt

两种配置方法的作用差不多,其目的主要是把一些不必要压缩的文件禁止压缩。

2.配置mod_cache模块

# cd /usr/local/apache2.2/conf/Includes
# vi mod_cache.conf
在配置文件里添加如下语句

<IfModule mod_cache>
LoadModule disk_cache_module modules/mod_disk_cache.so
<IfModule mod_disk_cache>
CacheRoot /
CacheSize 256
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
</IfModule>

LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_mem_cache>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>
</IfModule>

vi /usr/local/apache2/conf/httpd.conf
在末尾添加上:

CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1

设置虚拟目录
然后保存退出。启动apache

参数的解释:
mod_cache:
CacheEnable: 启动 mod_cache,其后接两个参数。第一个参数指定快取的种类,应设为 mem (记忆体快取) 或 disk (磁碟快取) 之其一;第二个参数指定使用快取的 URI 路径,如果对整个网站 (或虚拟主机) 进行快取,简单指定为根目录(/) 即可。
CacheForceCompletion: 这个值指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是 60(%)。
CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。
CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。
计算方式是:
expire period (过期时距) = 最后更新后至今的时间间距 * CacheLastModifiedFactor

expire date = 目前时间 + expire period
不过无论如何,过期时间不能超过 CacheMaxExpire 的设定值。

现在。如果用squid对该服务器进行反向代理的话,就可以通过cache 实现web的加速了

3.配置mod_expires模块

mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。

mod_expires的安装配置:
<IfModule mod_expires>
      ExpiresActive on
      ExpiresByType image/gif "access plus 1 month"
      ExpiresByType text/css "now plus 1 month"
      ExpiresDefault "now plus 1 day"
</IfModule>

注释:
所有的.gif文件1个月以后过期
所有的文件缺省1天以后过期

4.配置dosevasive模块
/usr/local/apache2.2/bin/apxs -i -a -c mod_dosevasive20.c

编辑httpd.conf,加入以下内容:

LoadModule dosevasive20_module modules/mod_dosevasive20.so
<IfModule mod_dosevasive20>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>

5.配置mod_limitipconn模块

mod_limitipconn.c是一个非官方的apache防止多线程下载模块,可以用来作为WEB文件的下载限制,但是它是使用ExtendedStatus On形式,工作在应用层。当同一个IP的连接到达限制的时候,apache对get请求发送:

HTTP/1.1 503 Service Temporarily Unavailable

从而使用户不能下载,但并不能阻止这种攻击,仍旧允许连接的。

# /usr/local/apache2.2/bin/apxs -c -i -a mod_limitipconn.c

修改apache配置文件:

# vi /usr/local/apache/conf/httpd.conf


同时需要设置以下参数在 httpd.conf 中 , 也可以在单个虚拟服务器中。
 
ExtendedStatus On

修改配置文件:

1 全局控制:

  在httpd.conf加上以下几行:

  <IfModule mod_limitipconn>
          <Location />     # 所有虚拟主机的/目录
            MaxConnPerIP 3       # 每IP只允许3个并发连接
            NoIPLimit image/*    # 对图片不做IP限制
      </Location>

  <Location /mp3>    # 所有主机的/mp3目录
    MaxConnPerIP 1           # 每IP只允许一个连接请求   
    OnlyIPLimit audio/mpeg video      # 该限制只对视频和音频格式的文件
      </Location >
</IfModule>

2 局部限制,你也可以在虚拟主机的配置文件里设置IP限制,方法是完全一样:

  < VirtualHost xx.xxx.xx.xx >
    ServerAdmin chenlf@chinalinuxpub.com
    ServerName server.domain.com
          ServerAlias *.domain.com
          UseCanonicalName OFF
          VirtualDocumentRoot /htdoc/domain/%1
  < IfModule mod_limitipconn.c >
        < Location / >      # 所有虚拟主机的/目录
      MaxConnPerIP 5           # 每IP只允许3个并发连接
            NoIPLimit image/*        # 对图片不做IP限制
        < /Location >
        < Location /mp3 >      # 所有主机的/mp3目录
      MaxConnPerIP 2           # 每IP只允许一个连接请求   
      OnlyIPLimit audio/mpeg video # 该限制只对视频和音频格式的文件
        < /Location >
  < /IfModule >
  ErrorLog /home/my/logs/error_log
  CustomLog /home/my/logs/access_log common
< /VirtualHost >


重启apache,用多线程的下载工具下载时,大于3个线程,其余的将得到信息:
HTTP/1.1 503 Service Temporarily Unavailable

或者根据User_Agent判断,把已知的多线程工具都给deny 掉
in httpd.conf
.....
BrowserMatch "NetAnt" badguy
BrowserMatch "GetRight" badguy
BrowserMatch "JetCar" badguy
BrowserMatch "Mass Downloader" badguy
BrowserMatch "ReGet" badguy
BrowserMatch "DLExpert" badguy
BrowserMatch "FlashGet" badguy
BrowserMatch "Offline Explorer" badguy
BrowserMatch "Teleport" badguy
...........

order deny,allow
deny from env=badguy
allow from all

注意httpd里面应该有 mod_setenvif模块。
在你的apache的conf文件里面加入
LoadModule limitipconn_module lib/apache/mod_limitipconn.so
ExtendedStatus On

6.安装modsecurity(mod_security 可以加强apache的安全性,特别是在防sql 注入上有很好的效果。)
下载站点:http://www.modsecurity.org/download/ 

# /usr/local/httpd220/bin/apxs -cia mod_security.c
打开httpd.conf查看是否有如下文字加入

在httpd.conf中添加下列一段mod_security的配置文件

LoadModule security_module      modules/mod_security.so
<IfModule mod_security>
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterDefaultAction "deny,log,status:500"
#SecFilterForceByteRange 32 126
#SecFilterScanPOST On
SecAuditLog logs/audit_log
###
SecFilter "/././"
#####
SecFilter /etc/*passwd
SecFilter /bin/*sh

#for css attack
SecFilter "<( | *scrīpt"
SecFilter "<(.| +>"
#for sql attack
SecFilter "delete[ ]+from"
SecFilter "insert[ ]+into"
SecFilter "select.+from"
SecFilter "union[ ]+from"
SecFilter "drop[ ]"
</IfModule>

四、滚卷log

编译前设置export CFLAGS="-O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
使其支持2G以上文件。

ErrorLog "|/usr/local/sbin/cronolog    /usr/local/apache2.2/logs/error_%Y%m%d.log"
CustomLog "|/usr/local/sbin/cronolog    /usr/local/apache2.2/logs/access_%Y%m%d.log" combined
用gzip压缩每天的日志:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday +%w`/access_log
日志的定期删除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r /bin/rm -f


运行语法检查命令检查语法,出现错误后继续调整。
# ./bin/apachectl -t

html网页跳转

<title>index.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="refresh" content="0;url=http://210.51.8.179:81">
使apache的日志文件里不记录图片文件
     找到:  
      LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/"" combined
      LogFormat "%h %l %u %t /"%r/" %>s %b" common
      LogFormat "%{Referer}i -> %U" referer
      LogFormat "%{User-agent}i" agent
    再后面加上图片文件的类型
      SetEnvIf Request_URI /.gif$ gif-image
      SetEnvIf Request_URI /.GIF$ gif-image
      SetEnvIf Request_URI /.jpg$ gif-image
      SetEnvIf Request_URI /.JPG$ gif-image
      SetEnvIf Request_URI /.png$ gif-image
      SetEnvIf Request_URI /.js$    gif-image   
      SetEnvIf Request_URI /.bmp$ gif-image
      SetEnvIf Request_URI /.css$ gif-image
      SetEnvIf Request_URI /.mid$ gif-image
      SetEnvIf Request_URI /.swf$ gif-image
      SetEnvIf Request_URI /.mmf$ gif-image
      SetEnvIf Request_URI /.wma$ gif-image
      SetEnvIf Request_URI /.midi$ gif-image
    日志
      CustomLog /usr/local/apache/logs/access.log combined env=!gif-image

使用两个
ProxyPassReverse / http://%{HTTP_HOST}:8088/
RewriteEngine on                                         
RewriteCond     %{REQUEST_URI} !.*/.(gif|png|jpg)$
RewriteRule ^/(.*) http://%{HTTP_HOST}:8088/ $1 [P]

Linux下检测Apache进程数量并自动重启的脚本

在/etc/crontab里,定时执行检测脚本,检测系统的Apache,和Mysql进程是否超出标准,超标的话,自动重启,没有的话,记录进程数据.

Crontab的内容(每30分钟执行一次,并将结果记录在/var/log/chksys.log)

0,30 * * * * root /usr/local/chksys.sh >> /var/log/chksys.log

/usr/local/chksys.sh代码:

#!/bin/bash
#check apache,mysql thread and auto reboot system
#Powered by ipaddr(aspbiz)

#config
MaxApacheThread=300
MaxMysqlThread=250

NeedReboot=0

ApacheThread=`ps -A|grep http|wc -l`
MysqlThread=`ps -A|grep mysql|wc -l`

if [ $ApacheThread -gt $MaxApacheThread ]
then
NeedReboot=1
fi

if [ $MysqlThread -gt $MaxMysqlThread ]
then
NeedReboot=1
fi

if [ $NeedReboot -eq 1 ]
then
echo "-----------------------------"
echo $(date +"%y-%m-%d %H:%M:%S"
echo "-----------------------------"
echo "Apache:$ApacheThread;Mysql:$MysqlThread."
echo "System is busy,reboot"
reboot
else
echo "-----------------------------"
echo $(date +"%y-%m-%d %H:%M:%S"
echo "-----------------------------"
echo "Apache:$ApacheThread;Mysql:$MysqlThread."
echo "System is normal"
fi