Linux网站架构系列之Apache调优全解

环境:

 

1. CentOS6.4 x86_64位 采用最小化安装,系统经过了基本优化篇
2. apache版本:httpd-2.4.6
3. apr版本:apr-1.4.8
4. apr-util版本:apr-util-1.5.2
5. pcre版本:pcre-7.8
6. 源码包存放位置:/server/tools
7. 源码包编译安装位置:/etc/local/软件名称

一、源码官方下,补丁及时打

正如我们在apache部署篇讲到的我们需要对下载的源码包进行验证一样,我们在挑选apache源码安装包的时候,一定要去官网,不要去乱七八糟的站点进行下载,防止源码包被别有用心的人动过手脚,导致后面对公司业务造成不必要损失。

另外为了apache的安全性和性能考虑,我们一定要多多关注apache的官网的补丁发布情况,一旦有新的补丁,我们一定要及早打上。特别是一些安全补丁,防止受到损失。

 

二、屏蔽apache版本等敏感信息

1)我们在apache主配置文件httpd.conf中,找到包含httpd-default.conf的行,并解开注释


1. [root@c64-web /]# grep "httpd-default.conf" /usr/local/apache/conf/httpd.conf
2. #Include conf/extra/httpd-default.conf
3. [root@c64-web /]# sed -i 's#\#Include conf/extra/httpd-default.conf#Include conf/extra/httpd-default.conf#g' /usr/local/apache/conf/httpd.conf

注意:编译安装的情况下,只有此行解开注释了,后面的修改才能生效。

2)打开httpd-default.conf文件,修改如下两个地方


1. [root@sunsky /]# grep Server conf/extra/httpd-default.conf|grep -v "#"
2. ServerTokens full
3. ServerSignature Off

修改为
 

1. ServerTokens Prod
2. ServerSignature Off

经过上面的修改,当你在curl-Iwww.sunsky.pw的时候,还是会出现下面的信息

 

1. Server: Apache

彻底让版本等敏感信息消失

如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下include目录下的ap_release.h文件


1. #define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
2. #define AP_SERVER_BASEPROJECT "Apache HTTP Server"  #服务的项目名称
3. #define AP_SERVER_BASEPRODUCT "Apache"        #服务的产品名
4. #define AP_SERVER_MAJORVERSION_NUMBER 2  #主要版本号
5. #define AP_SERVER_MINORVERSION_NUMBER 4  #小版本号
6. #define AP_SERVER_PATCHLEVEL_NUMBER  6  #补丁级别
7. #define AP_SERVER_DEVBUILD_BOOLEAN  0  #

上述列出的行,我已经给出了注释,大家可以修改成自己想要的,然后编译安装之后,再对httpd-default.conf文件进行修改,对方就彻底不知道你的版本号了。

三、更改apache的默认用户

我们通过更改apache的默认用户,可以提升apache的安全性。这样,即使apache服务被攻破,黑客拿到apache普通用户也不会对系统和其他应用造成破坏。这里创建的apache用户,将用于对子进程和线程的控制。


1. [root@c64-web /]# useradd -M -s /sbin/nologin apache 创建apache用户

编辑apache配置文件,修改默认的用户。
 

1. [root@c64-web /]# vim /usr/local/apache/conf/httpd.conf
2. User apache  #更改默认的daemon用户为apache用户
3. Group apache  #更改默认的daemon用户为apache用户

四、apache目录及文件权限设置

在生产环境的网站架构中,我们应把资源文件,例如用户上传的图片及附件等和程序做好分离,最好是把上传程序也分离开来。这样才能更方便我们做好授权,保证apache服务和整个服务器安全。

这里我们设置apache的网站目录属主和属组是root,权限是755,文件的权限为644。


1. lrwxr-xr-x  1 root root   23 11月  5 02:04 apache -> /usr/local/apache-2.4.6
2. drwxr-xr-x 14 root root 4096 11月  5 12:37 apache-2.4.6

并且,在对日志的授权商,我们要将属主和属组都设置为root,权限设置为700。
 

1. drwx------ 2 root root 4096 11月  5 02:46 logs

由于apache日志的记录是由apache的主进程进行操作的,而apache的主进程又是root用户启动的,所以这里设置700是不影响日志记录了。这也是日志记录的最安全的方法。

五、配置cronolog进行日志轮询

由于apache自带的日志轮询工具rotatelogs,据专家说在进行日志切割时容易丢日志,因此我们通常使用cronolog进行日志轮询。

1、下载并安装cronolog


1. [root@sunsky /]# cd /server/tools/
3. [root@sunsky tools]# tar zxf cronolog-1.6.2.tar.gz
4. [root@sunsky tools]# cd cronolog-1.6.2
5. [root@sunsky cronolog-1.6.2]# ./configure
6. [root@sunsky cronolog-1.6.2]# make&&make install

2、配置apache使用cronolog

由于实验用的apache开启了虚拟主机功能,所以以下范例配置都在虚拟主机中进行。


1. [root@sunsky cronolog-1.6.2]# vim /usr/local/apache/httpd/extra/httpd-vhosts.conf

将配置文件中的CustomLog和ErrorLog替换为下面的(由于我们要对多站点,所以这里要替换两个虚拟主机的,并且将日志存放名字做有效的区分才好)
 

1. CustomLog "|/usr/local/sbin/cronolog /app/logs/sunsky_access_%Y%m%d.log" combined
2. ErrorLog "|/usr/local/sbin/cronolog /app/logs/sunsky_error_%Y%m%d.log"

更多日志格式参考:
 

1. 按天轮询(生产环境常见用法,推荐使用):
2. CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
3. 按小时轮询(生产环境较常见用法):
4. CustomLog "|/usr/local/sbin/cronolog  /app/logs /access_www_ %Y%m%d%H.log" combined

六、错误页面优雅显示

为了提升网站的用户体验,避免404,403之类的丑陋的默认错误提示出现,我们需要对错误页面进行优化,让他们变的漂亮一点。错误页面不仅在于告诉用户访问出现了问题,而且需要引导用户到正确的页面。

错误页面优雅化显示的实现方式主要有两种,下面我们主要以404错误为例:

第一种:在apache的主配置文件httpd.conf中的<Directory></Directory>标签内添加ErrorDocument配置。


1. [root@sunsky /]# vi /usr/local/apache/conf/httpd.conf
2. &lt;Directory "/www/html"&gt;
3. AllowOverride None
4. Options None
5. Require all granted
6. ErrorDocument 404 /404.html  #将404错误跳转到/www/html下的404.html页面上
7. &lt;/Directory&gt;

第二种方法:在apache的虚拟主机配置文件httpd-vhost.conf中的<VirtualHost*:80></VirtualHost>中添加ErrorDocument配置。

 

01. &lt;VirtualHost *:80&gt;
02. ServerAdmin [email protected]
03. DocumentRoot "/www/html"
04. ServerName www.sunsky.pw
05. ServerAlias sunsky.pw
06. CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined
07. ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
08. ErrorDocument 404 http://www.sunsky.pw ;  #将404错误跳转到http://www.sunsky.pw页面上
09. &lt;/VirtualHost&gt;

从上面的两种解决方案,我们可以看出ErrorDocument的命令格式如下
 

1. ErrorDocument 错误代码 跳转到的页面或文件

另外这里需要注意,你若设置跳转到文件,必须要有这个文件才行。另外文件必须在站点目录内,不然会报错。

在跳转到文件的测试中,我用全路径和别名路径进行测试,当把404错误页面跳转文件放到其他目录的时候,不报错,但是页面跳转不过去。若跳转为未链接,则不影响。

 

七、启用压缩模块mod_deflate

网站随着用户访问量的增加和内容量的增加,网站的带宽会不断的增加,随之就是网站成本的增加。并且当内容量增大的时候,客户端如果带宽小,就会影响用户的体验。因此从这两方面考虑,网站的某些内容必须经过压缩之后再传给用户,然后在用户客户端进行解压,来实现双方共赢的效果。

apache的压缩要用到mod_deflate模块,该模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大小。当传输完毕后,客户端游览器会重新对压缩过的内容进行解压缩。如果没特殊情况的话,所以的文本内容都应该能被gzip压缩,例如:html(php),js,css,xml,txt等。特殊情况就是像一些首页上有很多广告投放的js代码,由于需要每次加载进而进行来访信息统计,所以这些广告代码拥有者网站的js不会经过gzip压缩,

mod_deflate模块,在我们前篇部署的时候已经编译安装进去了。

那么如果没有安装,如何安装呢?并且如果不知道到是否安装了,如何查看呢?

1、mod_deflate模块检查及安装

由于apache2.2.x和2.4.x这两个版本在检查mod_deflate模块是否安装方法方法是不同的。最后,我无奈做了很多测试,下面建议大家这样来检查。


1. [root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
2. deflate_module (static)  #此种结果为编译安装时装的
3. [root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
4. deflate_module (shared)  #此种结果为DSO方式安装的

安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法

a)编译时安装方法

编译的时候跟上--enable-deflate即可实现安装

b)DSO方式安装


1. [root@c64-web /]# cd /server/tools/httpd-2.4.6/modules/filters/  #切到apache源码包mod_deflate所在的目录下
2. [root@c64-web filters]# /usr/local/apache/bin/apxs -c -i -a mod_deflate.c  #以dso的方式编译安装到apache中
3. [root@c64-web filters]# ll /usr/local/apache/modules/mod_deflate.so   #检查mod_deflate是否安装,成功安装这里会显示出该文件
4. -rwxr-xr-x 1 root root 76697 11月  5 07:50 /usr/local/apache/modules/mod_deflate.so

扩展:使用DSO方式安装,apxs后跟的参数详解
 

1. -c  此选项表明需要执行编译操作。它首先会编译c源程序(.c)files为对应的目标代码文件(.c),然后连接这些目标代码和files中其余的目标代码文件(.c和.a),以生成动态共享对象dsofile。如果没有指定-s选项,则此输出文件名由files中的第一个文件名推测得出,也就是默认mod_name.so。
2. -i  此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录。
3. -a  此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
4. 压缩模块配置

2、配置压缩参数

注意如果我们是编译安装时已经编译进去的,此时我们需要先将httpd.conf主配置文件中


1. LoadModule deflate_module     modules/mod_deflate.so

此行解锁后再进行下面操作,不然下面的操作会报错。

我们需要在虚拟机的<VirtualHost*:80></VirtualHost>中添加如下配置即可实现压缩


01. <ifmodule mod_deflate.c>
02. DeflateCompressionLevel 9      #压缩等级,越大效率越高,消耗CPU也越高
03. SetOutputFilter DEFLATE           #启用压缩
04. AddOutputFilterByType DEFLATE text/html text/plain text/xml     #仅压缩限制特定的MIME类型文件:
05. AddOutputFilterByType DEFLATE application/javascript
06. AddOutputFilterByType DEFLATE text/css
07. AddOutputFilterByType DEFLATE image/gif image/png  image/jpe image/swf image/jpeg image/bmp
08. #DeflateFilterNote ratio     #在日志中放置压缩率标记,下面是记录日志的,这个功能一般不用
09. #LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
10. #CustmLog logs/deflate_log.log deflate
11. </ifmodule>

下面是朋友公司的另外一种压缩配置,有兴趣的朋友们也可以操作操作。

 

01. <ifmodule mod_deflate.c>
02. DeflateCompressionLevel 9
03. SetOutputFilter DEFLATE
04. DeflateFilterNote Input instream #声明输入流的byte数量
05. DeflateFilterNote Output outstream  #声明输出流的byte数量
06. DeflateFilterNote Ratio ratio   #声明压缩的百分比
07. #LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate      #声明日志类型
08. #CustomLog logs/deflate_log.log deflate    #声明日志类型
09. AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript  #仅压缩限制特定的MIME类型文件
10. </ifmodule>

执行上面的添加后,我们对apache进行优雅重启
 

1. [root@c64-web /]# /usr/local/apache/bin/apachectl graceful

下面访问我们的网站,然后用火狐或者google游览器的YSLOW插件进行压缩效果的查看

050914778.png

怎么样,是不是已经进行压缩了啊!

我们在企业生产环境中时,在启用mod_deflate时,一定要注意,对于太小的文件和某些格式的图片不要对它们进行压缩,有可能越压越大。

下面给出大家几乎是所有的AddOutputFilterByTypeDEFLATE后跟的压缩文件类型,大家可以参照选择。


1. text/plain text/html text/php text/xml text/css text/javascript
2. application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png  image/jpe image/swf image/jpeg image/bmp

八、mod_expires缓存功能

虽然我们上面通过mod_deflate模块启用了压缩,从很大程度上节约了企业带宽,降低了企业成本。可是由于现在越来越多的图片、脚本、css和flash被嵌入到页面中,当客户访问站点势必会做很多次的http请求,因此我们还可以通过mod_expires缓存模块来设置ExpiresHeader来缓存这些文件。Expires是通过header报文来指定特定类型的文件在游览器中的缓存时间的。平时,我们大多数的图片,flash在发布之后都是不需要经常修改的,因此做了缓存之后,游览器第一次从服务器下载之后,就不需要再从服务器下载这些文件而是直接从游览器缓存中读取了。这样客户访问页面的速度就会大大加快,企业的带宽压力也得到了缓解。

1、mod_expires模块检查及安装

检查mod_expires模块是否安装的方法如下:


1. [root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
2. expires_module (static)  #此种结果为编译安装时装的
3. [root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
4. expires_module (shared)  #此种结果为DSO方式安装的

安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法

a)编译方式安装

编译的时候跟上--enable-expires即可实现安装

b)DSO方式安装


1. [root@c64-web /]# cd /server/tools/httpd-2.4.6/modules/filters/  #切到apache源码包mod_expires所在的目录下
2. [root@c64-web filters]# /usr/local/apache/bin/apxs -c -i -a mod_expires.c  #以dso的方式编译安装到apache中
3.

猜你喜欢

转载自blog.csdn.net/weixin_45537987/article/details/106781033