实战apache调优上
实战apache调优上
生产环境中,部署了apache之后,我们应该从安全还是性能角度,在apache服务上线之前,对其做诸多的优化调试才行。
1 隐藏apache版本信息
2 设置错误页面-开启压缩和缓存功能
3 开启长连接功能
实验环境:
操作系统: CentOS 7.5
apache版本:httpd-2.4.37
源码包编译安装位置: apache: /usr/local/apache2.4-xuegod
httpd-2.4.37程序包下载地址:
https://mirrors.aliyun.com/apache/httpd/httpd-2.4.37.tar.gz
1 隐藏apache版本信息
[root@cga36 ~]# curl -I www.taobao.com #可以看到淘宝使用的是apache
HTTP/1.1 302 Found
Server: Tengine
Date: Wed, 05 Dec 2018 08:37:04 GMT
扩展:Tengine web服务器是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
模拟黑客根据查看出来版本号可以,查找漏洞:Apache/2.4.3 漏洞,所以我们必须隐藏版本号
1.1 源码编译安装Apache
[root@localhost ~]# tar zxvf httpd-2.4.37.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/httpd-2.4.37/
[root@localhost httpd-2.4.37]# vim include/ap_release.h
40 #define AP_SERVER_BASEVENDOR "Apache Software Foundation"
41 #define AP_SERVER_BASEPROJECT "Apache HTTP Server"
42 #define AP_SERVER_BASEPRODUCT "Apache"
44 #define AP_SERVER_MAJORVERSION_NUMBER 2
45 #define AP_SERVER_MINORVERSION_NUMBER 4
46 #define AP_SERVER_PATCHLEVEL_NUMBER 37
47 #define AP_SERVER_DEVBUILD_BOOLEAN 0
#define AP_SERVER_BASEVENDOR "kezi web-server"
#define AP_SERVER_BASEPROJECT "kezi web-server "
#define AP_SERVER_BASEPRODUCT "sss"
#define AP_SERVER_MAJORVERSION_NUMBER 99
#define AP_SERVER_MINORVERSION_NUMBER 999
#define AP_SERVER_PATCHLEVEL_NUMBER 9
#define AP_SERVER_DEVBUILD_BOOLEAN 1
注释:
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
#define AP_SERVER_BASEPROJECT "Apache HTTP Server" #服务的项目名称
#define AP_SERVER_BASEPRODUCT "Apache" #服务的产品名
#define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
#define AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
#define AP_SERVER_PATCHLEVEL_NUMBER 6 #补丁级别
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #
注:上述列出的行,大家可以修改成自己想要的,然后编译安装之后,再对httpd-default.conf文件进行修改,对方就彻底不知道你的版本号了。
安装apache依赖包:
[root@localhost httpd-2.4.37]# yum install apr-util apr-util-devel apr apr-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
开始编译
[root@localhost httpd-2.4.37~]# ./configure --prefix=/usr/local/apache2.4 --enable-so --enable-rewrite --enable-ssl --enable-deflate --enable-expires
[root@localhost httpd-2.4.37~]#make -j 4
[root@localhost httpd-2.4.37~]#make install
配置参数用途:
--prefix=/usr/local/apache2.4 #指定安装路径
--enable-so #支持动态加载模块
--enable-rewrite #支持网站地址重写
--enable-ssl #支持ssl加密,比如: https 443
--enable-deflate #支持页面传输前进行压缩
--enable-expires #支持设置网页缓存的时间
启动Apache
[root@localhost ~]# cp /usr/local/apache2.4/bin/apachectl /etc/init.d/apachectl
[root@localhost ~]# /etc/init.d/apachectl start
[root@localhost ~]# netstat -anutp |grep 80
tcp6 0 0 :::80 :::* LISTEN 18692/httpd
测试:隐藏Apache版本信息
[root@localhost ~]# curl -I 10.27.17.37
HTTP/1.1 200 OK
Date: Tue, 03 Sep 2019 02:43:14 GMT
Server: sss
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html
再次隐藏系统类型和模块的版本号
接下来再次修改:
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf
改:489 #Include conf/extra/httpd-default.conf
为:489 Include conf/extra/httpd-default.conf
2)打开httpd-default.conf文件,修改如下两个地方:
[root@localhost ~]# vim /usr/local/apache2.4-xuegod/conf/extra/httpd-default.conf
改:
55 ServerTokens Full
65 ServerSignature On
为:
ServerTokens Prod #不显示服务器操作系统类型
ServerSignature Off #不显示web服务器版本号和模块版本。现在默认值就是off了,不用修改
。在apache2.4之前的版本,默认值是On,需要改成Off的
[root@localhost ~]# /etc/init.d/apachectl-xuegod graceful
[root@localhost ~]# curl -I 10.27.17.37
Server: sss
设置Apache开机启动
在设置Apache开机启动时,还要再在apachectl文件的头部的注释中加两条命令
[root@localhost ~]# vim /etc/init.d/apachectl
#!/bin/sh
# chkconfig: 2345 64 36
# description: apache
[root@localhost ~]# chkconfig --add apachectl-xuegod
[root@localhost ~]# chkconfig --list apachectl-xuegod
修改运行apache的默认用户
我们通过更改apache的默认用户,可以提升apache的安全性。这样,即使apache服务被攻破,黑客拿
到apache普通用户也不会对系统和其他应用造成破坏。这里创建的apache用户,将用于对子进程和线
程的控制。
[root@root@localhost ~]# useradd -M -s /sbin/nologin apache
编辑Apache配置文件,修改默认的用户:
[root@xuegod63 ~]# vim /usr/local/apache2.4/conf/httpd.conf
改:165 User daemon
166 Group daemon
为:
165 User apache
166 Group apache
[root@localhost ~]# /etc/init.d/apachectl-xuegod graceful
[root@localhost ~]# ps -aux | grep http #已经是apache用户身份了。
对日志的授权,我们要将属主和属组都设置为root:
[root@localhost conf]# ll -sd /usr/local/apache2.4/logs/
[root@localhost conf]# ll /usr/local/apache2.4-xuegod/logs/
total 16
-rw-r--r-- 1 root root 1449 Sep 3 11:04 access_log
-rw-r--r-- 1 root root 4893 Sep 3 11:04 error_log
-rw-r--r-- 1 root root 6 Sep 3 11:04 httpd.pid
Apache目录及文件权限设置
在生产环境的网站架构中,我们应把资源文件的权限合理的配置好,但不能给777权限
目录755 文件644。 特殊upload 设置 为daemon.root
例:用户上传的图片及附件等和程序做好分离。这样才能更方便我们做好授权,保证apache服务和整
个服务器安全。
这里我们设置Apache的网站目录属主和属组是apache:
[root@localhost ~ ]# ll -sd /usr/local/apache2.4/htdocs/
[root@localhost ~]# chown apache:apache /usr/local/apache2.4/htdocs/ -R
1、正常情况,我们的源目录中,所有的文件,应该是root.root的权限
2、所有的文件应该是644
3、所有的目录应该是755的权限
工作进程用户需要写入的时候,这个目录的权限应该是daemon.root的权限。
保护Apache日志、设置好Apache日志文件权限
使用Cronolog分割Apache日志
配置yum 源
[root@localhost conf]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
下载并安装Cronolog:
[root@localhost ~]# yum install epel-release -y
[root@localhost ~]# yum install cronolog -y
配置Apache使用cronolog
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf
将配置文件中的CustomLog和ErrorLog替换
改:302 CustomLog "logs/access_log" common
为:
302 CustomLog "|/usr/sbin/cronolog /usr/local/apache2.4/logs/access_%Y%m%d.log" combined
改:273 ErrorLog "logs/error_log"
为:273 ErrorLog "|/usr/sbin/cronolog /usr/local/apache2.4/logs/error_%Y%m%d.log"
更多日志格式参考:
按天轮询(生产环境常见用法,推荐使用):
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
按小时轮询(生产环境较常见用法):
CustomLog "|/usr/local/sbin/cronolog /app/logs /access_www_ %Y%m%d%H.log" combined
[root@localhost ~]# /etc/init.d/apachectl-xuegod graceful
2 设置错误页面、开启压缩和缓存功能
2.1 错误页面优雅显示
错误页面优雅化显示的实现方式主要有两种,下面我们主要以404错误为例:
方法一:
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf #在根目录的标签中添加以下红色标记内容。
222 <Directory "/usr/local/apache2.4-xuegod/htdocs"> #在这行下面添加如下内容:
223 ErrorDocument 404 /404.html
注:#将404错误跳转到/usr/local/apache2.4/htdocs下的404.html页面上。
重启:
[root@localhost ~]# /etc/init.d/apachectl restart
选项位置:
工具-》Internet选项-》高级-》显示友好的HTTP错误信息
创建404测试页
[root@localhost ~]# echo "hello kezi" > /usr/local/apache2.4/htdocs/404.html
方法二:直接跳转到一个http链接上
[root@localhost ~# vim /usr/local/apache2.4/conf/httpd.conf #添加以下红色内容
改: 222 ErrorDocument 404 /404.html
为: ErrorDocument 404 http://www.xuegod.cn
#将404错误跳转到http://www.baidu.cn页面上
[root@localhost ~]# /etc/init.d/apachectl restart
2.2 启用压缩模块mod_deflate
Apache的压缩要用到mod_deflate模块,该模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进
行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大
小。当传输完毕后,客户端游览器会重新对压缩过的内容进行解压缩。如果没特殊情况的话,所有的文本内容都应该能被
gzip压缩,例如:html(php),js,css,xml,txt等。特殊情况就是像一些首页上有很多广告投放的js代码,由于需要
每次加载进而进行来访信息统计,所以这些广告代码拥有者网站的js不会经过gzip压缩,
1、mod_deflate模块检查及安装
[root@localhost bin]#/usr/local/apache2.4/bin/apachectl -M | grep deflate
deflate_module (static) #弹出此种结果,则为编译安装时装的。
[root@localhost ~]# /usr/local/apache2.4-xuegod/bin/apachectl -M | grep deflate
deflate_module (shared) #弹出此种结果,则为DSO方式安装的。
安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法
a)编译时安装方法
编译的时候跟上--enable-deflate即可实现安装
b)DSO方式安装。
扩展:DSO: Dynamic shared object动态共享对象 。DSO模块可以在编译服务器之后编译,也可以用Apache扩展工具
(apxs)编译并增加
使用DSO方式安装,/usr/local/apache2.4/bin/apxs后跟的参数详解
-c 此选项表明需要执行编译操作。
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录。
-a 此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
[root@localhost ~]# cd /usr/local/src/httpd-2.4.37/modules/filters/ #切到apache源码包
mod_deflate所在的目录下
[root@localhost filters]# /usr/local/apache2.4/bin/apxs -c -i -a /usr/local/src/httpd-
2.4.37/modules/filters/mod_deflate.c #以dso的方式编译安装到apache中.
[root@localhost filters]# ll /usr/local/apache2.4/modules/mod_deflate.so
#成功安装这里会显示出该文件mod_deflate.so
报错:
httpd: Syntax error on line 105 of /usr/local/apache2.4/conf/httpd.conf: Cannot load modules/mod_deflate.so
into server: /usr/local/apache2.4/modules/mod_deflate.so: undefined symbol: inflate
解决方法:
[root@localhost filters]# vim /usr/local/apache2.4d/conf/httpd.conf
在: 105 LoadModule deflate_module modules/mod_deflate.so 上面一行,插入以下内容:
LoadFile /usr/lib64/libz.so
[root@localhost filters]# /usr/local/apache2.4/bin/apachectl -M | grep deflate
deflate_module (shared) #可以看出来已经加载
2.4 压缩模块配置
1、配置压缩参数
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf
105 LoadModule deflate_module modules/mod_deflate.so #此行解锁后再进行下面
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf #在以下内容后,插入:
170 </IfModule> 之后添加以下内容:
<Ifmodule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
</Ifmodule>
注:一般压缩等级使用6或8
DeflateCompressionLevel 9 #压缩等级,越大效率越高,消耗CPU也越高。
SetOutputFilter DEFLATE #启用压缩
DeflateFilterNote Input instream #声明输入流的byte数量
DeflateFilterNote Output outstream #声明输出流的byte数量
DeflateFilterNote Ratio ratio #声明压缩的百分比
#LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate #声明日志类型
#CustomLog logs/deflate_log.log deflate #声明日志类型
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript #仅压缩,限制
特定的MIME类型文件
</ifmodule>
注:
1、如果是虚拟机,需要在<VirtualHost*:80></VirtualHost>中添加配置即可实现压缩
2、图片和视频本身就是压缩格式,一般不需要压缩的。有些小图片和视频压缩后还会变大。
[root@localhost ~]# /etc/init.d/apachectl graceful
# graceful 重新启动Apache服务器,但不会中断原有的连接。用于修改了配置文件后进行重新读取配置文件。
创建测试文件:
[root@localhost ~]# cp /etc/passwd /usr/local/apache2.4/htdocs/passwd.html
测试数据传输过程中是否启用了压缩:
下面访问我们的网站,然后用火狐、google或360游览器的YSLOW插件,查看压缩效果。
2.5 mod_expires: 设置网页缓存时间
虽然我们上面通过mod_deflate模块启用了压缩,从很大程度上节约了企业带宽,降低了企业成本。可是由于现在越来越多
的图片、脚本、css和flash被嵌入到页面中,当客户访问站点势必会做很多次的http请求,因此我们还可以通过
mod_expires缓存模块来设置ExpiresHeader来缓存这些文件。
Expires是通过header报文来指定特定类型的文件在游览器中的缓存时间的。平时,我们大多数的图片,flash在发布之后
都是不需要经常修改的,因此做了缓存之后,游览器第一次从服务器下载之后,就不需要再从服务器下载这些文件而是直
接从游览器缓存中读取了。这样客户访问页面的速度就会大大加快,企业的带宽压力也得到了缓解。
mod_expires模块检查及安装
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -M | grep expires
expires_module (static) #此种结果为编译安装时装的
[root@localhost~]# /usr/local/apache2.4/bin/apachectl -M | grep expires
expires_module (shared) #此种结果为DSO方式安装的
安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法
a)编译方式安装
编译的时候跟上--enable-expires即可实现安装
b)DSO方式安装
[root@localhost htdocs]# cd /usr/local/src/httpd-2.4.37/modules/metadata/ #切到apache源码包mod_expires所在
的目录下
[root@localhost metadata]# ls mod_expires.c
mod_expires.c
#以dso的方式编译安装到apache中
[root@localhost metadata]# /usr/local/apache2.4/bin/apxs -c -i -a /usr/local/src/httpd-
2.4.37/modules/metadata/mod_expires.c
#检查mod_deflate是否安装,成功安装这里会显示出该文件
[root@localhost metadata]# ll /usr/local/apache2.4/modules/mod_expires.so
配置缓存参数
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf #确认这一行是开启的。
113 LoadModule expires_module modules/mod_expires.so
缓存的用法有3种,分别问对全局,对目录,对虚拟主机。缓存的用法有3种,分别问对全局,对目录,对虚拟主机。
1对全局
对全局的配置就是在apache主配置文件httpd.conf的中加入如下参数即可
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf #在最后添加以
在170 </IfModule> 下面插入以下内容:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
2、对目录
对目录的配置就是在apache主配置文件中<Directory></Directory>标签内,最后加入如下参数即可
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf
245 <Directory "/usr/local/apache2.4/htdocs">
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
</Directory>
c)对虚拟主机
对虚拟主机的配置就是在Apache的虚拟主机配置文件httpd-vhost.conf中添加如下参数即可
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf
<VirtualHost *:80>
ServerAdmin 888@qq.com
DocumentRoot "/www/html"
ServerName www.sunsky.pw
ServerAlias sunsky.pw
CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined
ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
</VirtualHost>
以上三种配置任何一种配置之后,对Apache服务器进行优化重启,然后用火狐或者google游览器的
扩展缓存参数
ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"
有效期可以通过增加“<num><type>”子句进一步调整
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"
3 开启长连接功能
3.1 Apache的keepalive和keepalivetimeout
打开长链接:
KeepAlive Off/On 保持连接,会减少三次握手,但是会消耗内存,是否打开,取决于单位时间内是否进行多次连接(三次
握手),一个连接有多次请求的,建议打开,并适当调整KeepAliveTimeout时间
在APACHE的httpd.conf中,KeepAlive指的是保持连接活跃,如果将KeepAlive设置为On,那么来自同一客户端的请求就不
需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。
KeepAlive的连接活跃时间当然是受KeepAliveTimeOut限制的。如果第二次请求和第一次请求之间超过KeepAliveTimeOut的
时间的话,第一次连接就会中断,再新建第二个连接。
所以,一般情况下,图片较多的网站应该把KeepAlive设为On。但是KeepAliveTimeOut应该设置为多少秒就是一个值得讨论
的问题了。
如果KeepAliveTimeOut设置的时间过短,例如设置为1秒,那么APACHE就会频繁的建立新连接,当然会耗费不少的资源;反
过来,如果KeepAliveTimeOut设置的时间过长,例如设置为300秒,那么APACHE中肯定有很多无用的连接会占用服务器的资
源,也不是一件好事。
所以,到底要把KeepAliveTimeOut设置为多少,要看网站的流量、服务器的配置而定。
以下是我的配置:
[root@xuegod63 ~]# vim /usr/local/apache2.4/conf/httpd.conf
改: 511 #Include conf/extra/httpd-default.conf
为:511 Include conf/extra/httpd-default.conf #这一步,一般情况,需要修改,因为前面我们已经开启了这个选项
[root@localhost htdocs]# vim /usr/local/apache2.4/conf/extra/httpd-default.conf
修改:
改:16 KeepAlive Off
为:16 KeepAlive On #如果已经为On,开启长链接功能。那么就不需要再开启了
改:29 KeepAliveTimeout 5
为:29 KeepAliveTimeout 30
注:考虑到我的网站上有不少的图片,所以将KeepAlive设为On,一般的页面两次请求间隔不会超过30秒,所以这样设置,
至尽运行状况良好。如果是艺术品网站, 需要看的时间长,那么就设置长一些。
23 MaxKeepAliveRequests 100
默认:100
一个建立好的Keep-Alive连接,允许发送的请求的个数。一旦建立连接,要么就是个数达到了断开,要么就是等
KeepAliveTimeout时间到了断开连接。
MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的
数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。"
这个数字的设置,必须考虑在一个时间段内,同一个用户访问你的服务会发多少请求。要结合KeepAliveTimeout参数来考
虑。
举个例子,用户需要间隔时间不大于KeepAliveTimeout的时间内,连续请求10个文件,那么这个参数就应该设置成10,如
果用户在连续时间里不断请求访问,则这个数值得设置得更多。否则就重新建立连接下载。一旦用户连续进行了10个请求
后,并且这个用户肯定在完成这些请求后的5秒内不会再请求,甚至要在之后的很长时间后请求,那么这个
KeepAliveTimeout时间就可以设置得很短,以便尽早断开这种用户,把资源让个其他用户。
10 Timeout 60
"TimeOut指令用于设置Apache等待以下三种事件的时间长度:
1. 接受一个GET请求耗费的总时间。
2. POST或PUT请求时,接受两个TCP包之间的时间。
3. 应答时TCP包传输中两个ACK包之间的时间。
比如:apache需要把jsp文件传给后端tomcat服务器,而tomcat服务器关了,这时这个链接需要等待的超时时间,由
TimeOut控制。但对于绝大多数情况来说仍是足够的。