Apache的相关优化

一、Apache运行环境优化

1、使用单独的主机运行Apache服务

    Apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给apache一个单独的主机以免受到其他应用的干扰。

2、给Apache服务器增加内存

所有硬件指标中,对性能影响最大的是内存,对于静态内容(图片、javascript文件、css文件等),它决定了apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,而存取硬盘上的特定文件是一件很费时的操作,大内存可以极大提高静态站点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利。

3、给Apache服务器更换高速硬盘

    硬盘的速度对Apache静态站点尤为突出,apache不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点也要不断的加载web程序(php等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高apache的性能是有积极意义的。

4、更换更好的CPU和更大的网络带宽

    最后影响Apache访问速度的是cpu和网络,cpu影响的是web程序执行速度,网络影响流量大小。

5、使用类Unix系统运行Apache服务

影响性能的另一因素是操作系统,php程序在类unix环境中的执行速度仍然比windows中要快,所以我们尽量使用Linux操作系统作为Apache服务的运行系统。

二、Apache相关功能优化

1、禁止Apache目录索引浏览功能。

Apache默认配置是当网站没有首页文件时,Apache会把整个目录结构展示给网站用户,这是非常大的隐患,必须要屏蔽掉。在主配置文件httpd.conf或者虚拟主机的配置文件httpd-vhost.conf文件中配置如下内容即可。

<Directory  /var/html>

    Options FollowSymLinks

    AllowOverride None

    Order allow, deny

    Allow from all

</Directory>

 

或者

<Directory  /var/html>

Options -Indexes FollowSymLinks

    AllowOverride None

    Order allow, deny

    Allow from all

</Directory>

 

说明:也就是把配置文件中Options Indexes FollowSymLinks

修改为:Options FollowSymLinks 或把Indexes改成 -Indexes即可

 

2、隐藏Apache的版本信息

[root@centos1 conf]# curl -I 192.168.115.105

HTTP/1.1 200 OK

Date: Sun, 20 Aug 2017 11:34:37 GMT

Server: Apache/2.4.7 (Unix)   可以看到Apache的版本号是2.4.7

Last-Modified: Sun, 20 Aug 2017 06:38:57 GMT

ETag: "14-557299ddc43ae"

Accept-Ranges: bytes

Content-Length: 20

Content-Type: text/html

 

[root@centos1 conf]# vim /usr/local/apache2/conf/extra/httpd-default.conf

ServerTokens Prod       Full改成Prod

ServerSignature Off     On改成Off

 

[root@centos1 conf]# vim /usr/local/apache2/conf/httpd.conf   

Include conf/extra/httpd-default.conf    把这一行注释去掉让httpd-default.conf文件生效

 

[root@centos1 conf]# /usr/local/apache2/bin/apachectl restart   重启生效即可

[root@centos1 conf]# curl -I 192.168.115.105

HTTP/1.1 200 OK

Date: Sun, 20 Aug 2017 11:35:40 GMT

Server: Apache    可以看到版本号已经没有了

Last-Modified: Sun, 20 Aug 2017 06:38:57 GMT

ETag: "14-557299ddc43ae"

Accept-Ranges: bytes

Content-Length: 20

Content-Type: text/html

 

3、禁止Apache用户重载功能

对于使用虚拟主机的朋友可能会觉得不方便,这样设置将会使.htaccess中的设置失效,如果实在需要,并且在有条件的情况下,请在conf配置文件中直接写入rewrite规则

<Directory  “/usr/local/apache2/htdocs”>

Options none

AllowOverride None    禁止用户重载

    Order allow, deny

    Allow from all

</Directory>

 

提示:禁止用户对目录配置文件(.htaccess进行修改)重载,这会加快服务器响应速度,因为它不在为每个请求寻找每个目录访问控制文件(.htaccess)。也杜绝了开发人员变相修改配置的安全隐患。

 

4避免使用.htaccess文件

     首先是从web性能考虑,如果AllowOverride启用了支持.htaccess文件,则Apache需要在每个站点目录中查找.htaccess文件,因此无论是否真正用到,启用.htaccess都会导致web性能的下降。另外对每一个请求,都需要读取一次.htaccess文件。

     其次是安全考虑,这样会允许开发人员或者代码管理者可以修改服务器的配置,这可能会导致某些意想不到的修改,应该避免使用.htaccess文件功能,如果要实现类似的功能,可以在主配置中配置。

 

5、禁止资源目录解析PHP程序

方法1:提示下载不解析。

<Directory ~ “ /var/www/bbs/uploads”>

    Options FollowSymLinks

    AllowOverride None

    Order allow, deny

    Allow from all

    php_flag engine off  添加这行

</Directory>

 

方法2:返回403错误

<Directory  /var/www/blog>

<Files ~ “.php”>

    Order allow, deny

    Deny from all

</Files>

</Directory>

 

6、配置Apache错误页面优雅显示(自定义错误页面)

1)配置Apache错误页面优雅显示的目的

我们在浏览某些网站时,往往浏览器显示给我的是无法找到我们要访问的页面的错误信息。这是因为我们在浏览器中输入了错误的url或者网站的管理者将之前的页面移到了其他目录。此时其他web服务器 就会给浏览器返回一个404的错误信息。浏览器在收到其他web服务器 返回的404错误信息时,就会显示相应的错误页面。很多网站都有自己个性化的404错误页面,在这个页面上我们可以看到很多很友好的提示信息,但是也有部分网站的404错误信息显示的页面就是浏览器自己默认的页面,从浏览器的默认404错误页面上我们得不到关于网站的任何信息,这样势必会导致网站用户的流失。那么我如何在apache下配置404错误页面呢。下面我们就一起来看看如何设置apache,使其能够显示携带更多信息的404错误页面。为服务器默认文件夹设置404错误页面。

2Apache错误页面优雅显示设置

打开apache的安装目录,在该目录下的conf目录中找到httpd.conf文件,在该文件中找到 “ErrorDocument 404” 字符串,一般情况下显示如下:

#ErrorDocument 500 "The server made a boo boo."

#ErrorDocument 404 /missing.html

#ErrorDocument 404 "/cgi-bin/missing_handler.pl"

#ErrorDocument 402 http://www.example.com/subscription_info.html

   首先将前面的#去掉,missing.html是出现404错误时apache要返回给浏览器的页面。我们可以在missing.html页面中添加自己个性的网页信息。当然页面的名字我们是可以随便取的。 missing.html默认应该放在网站的根目录下,但是我们可以根据自己的设置来将其放在其他目录。如/error/missing.html,那配置文件就应该作如下修改:

errordocument 404 /error/missing.html

在完成上述配置之后,重启apache,测试一下,就可以看到我们想要的效果。

 

但是IE往往事与愿违,在做了上述配置之后,IE有时还会返回自带的404错误默认页面。这是为什么呢,因为ie在检测到apache返回的错误页面小于512 个字节时,就会显示自带的404错误页面。

 

解决方法 :配置文件中404错误所指向的url地址改成绝对地址 ,如:

 errordocument 404 http://localhost/error/missing.html

 

7、配置Apache对站点文件压缩传输

在apache2.0以上(包括apache2.0)的版中gzip压缩使用的是mod_deflate模块,下面是具体配置步骤

vim /usr/local/apache2/conf/httpd.conf

LoadModule deflate_module modules/mod_deflate.so

LoadModule headers_module modules/mod_headers.so

打开httpd.conf后,先将上面两行配置前面的#号去掉,启用这两个模块,其中mod_deflate是压缩模块,就是对要传输到客户端的代码进行gzip压缩;mod_headers模块的作用是告诉浏览器页面使用了gzip压缩,如果不开启mod_headers那么浏览器就会对gzip压缩过的页面进行下载,而无法正常显示。

  在httpd.conf中加入以下代码,可以加到任何空白地方,不了解apache的朋友,如果担心加错地方,就放到http.conf文件的最后一行,如果是虚拟服务器可以写.htaccess文件里面,然后放在项目下即可。

<IfModule mod_deflate.c>

SetOutputFilter DEFLATE   

#必须的,就像一个开关一样,告诉apache对传输到浏览器的内容进行压缩

  

SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary

#设置不对后缀gifjpgjpegpng的图片文件进行压缩

   

SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary

#同上,就是设置不对exetgzgz。。。的文件进行压缩

   

SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary

 

AddOutputFilterByType DEFLATE text/*

#设置对文件是文本的内容进行压缩,例如text/html  text/css  text/plain

AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript

#这段代码你只需要了解application/javascript application/x-javascript这段就可以了,这段的意思是对javascript文件进行压缩

   

AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp

#这段是告诉apachephp类型的文件进行压缩

 

BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.x 有一些问题,所以只压缩文件类型是text/html

 

BrowserMatch ^Mozilla/4.0[678] no-gzip

# Netscape 4.06-4.08 有更多的问题,所以不开启压缩

 

BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# IE浏览器会伪装成 Netscape ,但是事实上它没有问题

</IfModule>

  本配置到这里apache中的gzip压缩就配置完成,重启apache后,新的配置就会生效。最后再用工具检查一下是否生效。不过开启gzip功能需要额外CPU资源开销。

8、启用mod_expiresmod_headers设置静态文件缓存时间

1mod_expires缓存静态文件的好处及安装方法

采用mod_expires缓存静态文件能提高服务器的性能,缩短服务的响应时间,减轻服务器负担,减少网络带宽使用量。

在安装apache的时Configure步骤中添加--enable-expires安装之后,在apache安装目录的modules目录里会有:mod_expires.so同时在httpd.conf会自动添加下面的内容

LoadModule expires_module modules/mod_expires.so

 

2)通过mod_expires设置缓存(三种格式)

#LoadModule expires_module modules/mod_expires.so

编辑Apache的httpd.conf主配置文件,将上面那行前面的”#”号删除,”mod_expires”的设定资料除了可以写在Apache的”httpd.conf”设定档中,也可以写在”.htaccess”设定档里.

 

语句格式1:

ExpiresByType 类型 描述性语言

描述性语言:modification、access、now |plus|years、months、weeks、days、hours、minutes、seconds

例如:

ExpiresByType image/png access plus 7 days

#设置png格式的缓存时间为7

 

范例一:

<IfModule mod_expires.c>

    ExpiresActive On

    ExpiresDefault “access plus 10 days”

    ExpiresByType text/css “access plus 1 second”

</IfModule>

 

语句格式2:

ExpiresByType 类型 A/M+时间(以秒为单位)

A:access表示从浏览器访问时间算起

M:modification表示文件修改时间算起

例如:

ExpiresByType image/png A604800    #设置png格式的缓存时间为7

 

范例二:

<IfModule mod_expires.c>

ExpiresActive On

ExpiresDefault A86400

ExpiresByType image/x-icon A2592000

ExpiresByType application/x-javascript A2592000

ExpiresByType text/css A2592000

ExpiresByType image/gif A604800

ExpiresByType image/png A604800

ExpiresByType image/jpeg A604800

ExpiresByType text/plain A604800

ExpiresByType application/x-shockwave-flash A604800

ExpiresByType video/x-flv A604800

ExpiresByType application/pdf A604800

ExpiresByType text/html A900

</IfModule>

 

语句格式3:

<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">

  ExpiresDefault A604800

  </FilesMatch>

#表示匹配jpg|jpeg|png|gif|swf格式的文件缓存为7

 

范例三:

<IfModule mod_expires.c>

ExpiresActive On

ExpiresDefault A0

 

#缓存 1

<FilesMatch “\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$”>

ExpiresDefault A9030400

</FilesMatch>

 

#缓存1星期

<FilesMatch “\.(jpg|jpeg|png|gif|swf)$”>

ExpiresDefault A604800

</FilesMatch>

 

#缓存3小时

<FilesMatch “\.(txt|xml|js|css)$”>

ExpiresDefault A10800

</FilesMatch>

</IfModule>

 

将下列代码加入.htaccess文件中(本次采用的为语法格式一):

<IfModule mod_expires.c>

ExpiresActive On    #开启缓存功能

ExpiresDefault A86400   #设置默认的缓存时间

 

#以下是针对不同的文件类型设置不同的缓存时间

ExpiresByType image/x-icon A2592000

ExpiresByType application/x-javascript A2592000

ExpiresByType text/css A2592000

ExpiresByType image/gif A604800

ExpiresByType image/png A604800

ExpiresByType image/jpeg A604800

ExpiresByType text/plain A604800

ExpiresByType application/x-shockwave-flash A604800

ExpiresByType video/x-flv A604800

ExpiresByType application/pdf A604800

ExpiresByType text/html A900

</IfModule>

3)使用mod_headers模块设置缓存

Expires是浏览器Cache机制的一部分,浏览器的缓存取决于Header中的四个值: Cache-Control, Expires, Last-Modified, ETag。优化这个选项,所要做的是对站内所有的文件有针对性的设置Cache-Control和Expires,我们要实现加上过期标志可以利用apache模块mod_expires和mod_headers。

通过配置.htaccess文件, 可以轻易地按文件类别设置缓存时间。对提高网站速度有一定帮助。有一个问题是我们常用的Apache主机经常不怎么支持mod_expires,没有关系,我们用另一个模块使用mod_headers。

 

同样在.htaccess文件中添加如下内容可以实现缓存:

<ifmodule mod_headers.c>

# htm,html,txt类的文件缓存一个小时

<filesmatch “\.(html|htm|txt)$”>

header set cache-control max-age=3600

</filesmatch>

 

# css, js, swf类的文件缓存一个星期

<filesmatch “\.(css|js|swf)$”>

header set cache-control max-age=604800

</filesmatch>

 

# jpg,gif,jpeg,png,ico,flv,pdf等文件缓存一年

<filesmatch “\.(ico|gif|jpg|jpeg|png|flv|pdf)$”>

header set cache-control max-age=29030400

</filesmatch>

</ifmodule>

 

以下为样本代码:

<ifmodule mod_headers.c>

<FilesMatch “\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$”>

Header set Cache-Control “max-age=604800, public”

</FilesMatch>

 

<FilesMatch “\.(xml|txt)$”>

Header set Cache-Control “max-age=18000, public, must-revalidate”

</FilesMatch>

 

<FilesMatch “\.(html|htm|php)$”>

Header set Cache-Control “max-age=3600, must-revalidate”

</FilesMatch>

#其它文件可参照设置,此略。

</ifmodule>

 

9、更改Apache的默认用户和组

在apache 部署中,我们习惯将整个项目的所有者和组设置为apache(注:apache是新建的一个用户),这样可以把整个项目的权限设置成 744,提高安全性。在如此设置的时候需要将 httpd 进程的拥有者和组设置为 apache(用户)。需要修改httpd.conf文件,修改成下面这样即可。

vim /usr/local/apache2/conf/httpd.conf

User apache

Group apache

 

/usr/local/apache2/bin/apachectl graceful

 

10、调整Apache的工作模式并修改相关参数优化

如何调整Apache工作模式及优化这里不再说明,详情见我的另一篇博客

https://blog.51cto.com/longlei/2109039

 

11、最小化设置Apache目录及文件权限

为了保证网站不遭受******上传及修改文件。

安全的权限设置如下:

(1)所有站点目录的用户和组都应该为root

(2)所有目录权限是默认的755

(3)所有文件权限是默认的644

注意:网站服务的用户不能用root

 

12、最小化设置Apache日志目录权限

假如日志目录为/var/logs,则授权方法为:

chown -R root.root /var/logs

chmod -R 700 /var/logs

 

13、配置软件轮询Apache访问日志

轮询Apache访问日志方法这里不再说明,详情见我的另一篇博客,地址如下:

https://blog.51cto.com/longlei/2103580

14、优化访问日志记录的信息

(1)定义日志级别,让问题定位更加精准

(2)定义日志的规范格式,让整个团队的日志格式统一,便于查看及排错。

(3)对日志进行分类,方便管理和查看(例如:从功能方面可分为诊断日志、统计日志、审计日志等。)

(4)日志中尽量不要记录无用信息,且重要日志记录必须完整

(5)在生产环境中解决问题并不断完善日志

(6)对日志文件进行按周或按天轮询,保证日志文件不会过大

(7)定期清理很久之前的日志文件,释放磁盘空间

15、限制指定IP访问网站

Apache 从2.2升级到 Apache2.4.x后配置文件httpd.conf 的设置方法有了大变化,以前是将 deny from all 全部改成 Allow from all 实现外网访问,现在是将 Require all denied 以及 Require local 都改为 Require all granted 就可以了。

.htaccess 如果不起作用将 LoadModule rewrite_module modules/mod_rewrite.so 前面的注释(#)去掉就可以了。

1)所有的请求都被拒绝

2.2上的配置

Order deny,allow

Deny from all

 

2.4上的配置

Require all denied

 

2)所有请求都是允许的

2.2上的配置

Order allow,deny

Allow from all

 

2.4上的配置

Require all granted

 

3Apache2.4上经常会用到的配置

Require all denied

Require all granted

Require host xxx.com

Require ip 192.168.1 192.168.2

Require local

 

举例说明

a、仅允许IP:192.168.0.1 访问

Require all granted

Require ip 192.168.0.1

 

b、仅禁止IP:192.168.0.1访问

Require all granted

Require not ip 192.168.0.1

 

c、允许所有访问

Require all granted

 

d、拒绝所有访问

Require all denied

提示:默认是 Require local 仅允许本地访问。

 

16、控制MaxClients的设置,以避免服务器产生太多的子进程而发生交换。

进程间的数据交换会占用很大内存,数据交换产生的滞后使用户总感觉”不够快”,所以用户就可能去按”停止”和”刷新”,从而带来更大的负载。一般建议小网站将MaxClients设置为12-24。

 

17HostnameLookups设置为off

尽量减少DNS查询的次数。如果你使用了”Allow from domain”或”Deny from domain”指令(也就是domain使用的是主机名而不是IP地址),则代价是要进行两次DNS查询(一次正向和一次反向,以确认没有作假)。所以,为了得到最高的性能,应该避免使用这些指令(不用域名而用IP地址也是可以的)。

18、为Directory加上FollowSymLinks

如果网站空间中没有使用 Options FollowSymLinks ,Apache就必须执行额外的系统调用以验证符号连接。例如:在请求”/index.html”时,Apache将对”/www”、”/www/htdocs”、”/www/htdocs/index.html”执行lstat()调用。而且lstat()的执行结果不被缓存,因此对每一个请求都要执行一次。

19MaxRequestsPerChild设置为非0以防止内存泄漏

MaxRequestsPerChild用于控制Apache子进程在何时销毁,默认为0,代表永不销毁子进程,这可能会存在内存泄漏的风险,建议设置为10000

20KeepAliveKeepAliveTimeOut

如果你使用的使mpm_prefork模式(Apache默认安装),那么建议你将KeepAlive设置为off;因为,开启keepalive会为每个客户端建立一个连接,prefork不会创建线程,估计100个用户同时访问你的网站,Apache就会挂了,如果你实在想开启,那么请将KeepAliveTimeOut 时间设置更短些,例如5,默认是60秒

21使用CDN做网站加速

  简单的讲,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡技术,判断用户来源就近访问cache服务器取得所需的内容,这样可以有效减少数据在网络上传输的时间,提高速度。把静态内容分布到CDN减少了用户影响时间20%或更多。