apache的一般优化

Posted hopeless-dream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache的一般优化相关的知识,希望对你有一定的参考价值。

开启输出压缩

(1)编辑配置文件开启模块

# vim conf/httpd.conf                              # 将以下三行取消注释

LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule filter_module modules/mod_filter.so

其中:

mod_deflate是压缩模块,就是对要传输到客户端的代码进行gzip压缩;mod_headers模块的作用是告诉浏览器页面使用了gzip压缩,如果不开启mod_headers那么浏览器就会对gzip压缩过的页面进行下载,而无法正常显示。

(2)压缩设置

将以下配置添加到httpd.conf的最后一行,如果是云厂商的虚拟主机,可以将以下配置添加到伪静态文件.htaccess中

添加完成以后,可以进行语法检查 # httpd -t

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

    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary # 设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary # 同上,就是设置不对exe,tgz,gz。。。的文件进行压缩
    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 #这段是告诉apache对php类型的文件进行压缩

    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>

启用缓存mod_expires

这个是非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都cache在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。
这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expirationdate)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。

测试未开启缓存的情况

[root@localhost http-2.4.48]# curl -I 10.0.0.10/1.jpg
HTTP/1.1 200 OK
Date: Tue, 01 Jun 2021 08:41:59 GMT
Server: Apache/2.4.48 (Unix)
Last-Modified: Tue, 01 Jun 2021 08:41:59 GMT
ETag: W/"10e66-5c42475562580"
Accept-Ranges: bytes
Content-Length: 69222
Content-Type: image/jpeg

开启缓存功能

# vim conf/httpd.conf

LoadModule expires_module modules/mod_expires.so   # 取消注释

增加配置

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType application/x-javascript "now plus 5 day"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/png "access plus 1 minutes"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minutes"
</IfModule> 

访问测试

[root@localhost http-2.4.48]# curl -I 10.0.0.10/1.jpg
HTTP/1.1 200 OK
Date: Tue, 01 Jun 2021 08:42:20 GMT
Server: Apache/2.4.48 (Unix)
Last-Modified: Tue, 01 Jun 2021 08:42:20 GMT
ETag: W/"10e66-5c42475562580"
Accept-Ranges: bytes
Content-Length: 69222
Cache-Control: max-age=2592000
Expires: Thu, 01 Jul 2021 08:42:20 GMT
Content-Type: image/jpeg

 ExpiresDefault 和ExpiresByType的语法

其中<base>是下列之一:
• access
• now(等价于\'access \')
• modification      

plus关键字是可选的。<num>必须是整数,
<type>是下列之一:
• years //
• months//
• weeks//星期 
• days/日 
• hours/时 
• minutes/分 
• seconds/秒

注意:

如果你使用基于最后修改日期的设置,"Expires:"头将不会 被添加到那些并非来自于磁盘文件的内容。这是因为这些内容并不存在"最后修改时间"的属性。

 #GIF有效期为1个月(秒数)

ExpiresByType image/gif A2592000 
ExpiresByType image/jpeg A2592000 
ExpiresByType image/png A2592000 
ExpiresByType image/x-icon A2592000 
ExpiresByType application/x-javascript A604800 
ExpiresByType text/plain A604800

HTML文档的有效期是最后修改时刻后的一星期 

ExpiresByType text/html M604800 

注意:

以上"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。后面的时间则以秒计算。

Apache禁止目录遍历

将主配置文件 httpd.conf 中 Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 显示该目录结构。

注意:

Indexes 的作用就是当该网站目录下没有 index.html文件时,就会显示目录结构。

Apache隐藏版本信息

方法一:

修改主配置httpd.conf文件,取消下面行的注释

Include conf/extra/httpd-default.conf

修改conf/extra/httpd-default.conf

ServerTokens Prod

ServerSignature Off

重启apache后访问测试

[root@localhost http-2.4.48]# curl -I 10.0.0.10/1.jpg
HTTP/1.1 200 OK
Date: Tue, 01 Jun 2021 10:25:19 GMT
Server: Apache
Last-Modified: Tue, 01 Jun 2021 10:25:19 GMT
ETag: W/"10e66-5c42475562580"
Accept-Ranges: bytes
Content-Length: 69222
Cache-Control: max-age=2592000
Expires: Thu, 01 Jul 2021 10:25:19 GMT
Content-Type: image/jpeg

官方给出的配置说明(http://httpd.apache.org/docs/2.4/mod/core.html#serversignature)

ServerTokens Full (or not specified)
Server sends (e.g.): Server: Apache/2.4.2 (Unix) PHP/4.2.2 MyMod/1.2
ServerTokens Prod[uctOnly]
Server sends (e.g.): Server: Apache
ServerTokens Major
Server sends (e.g.): Server: Apache/2
ServerTokens Minor
Server sends (e.g.): Server: Apache/2.4
ServerTokens Min[imal]
Server sends (e.g.): Server: Apache/2.4.2
ServerTokens OS
Server sends (e.g.): Server: Apache/2.4.2 (Unix)

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

#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 23              #补丁级别
#define AP_SERVER_DEVBUILD_BOOLEAN  0  

日志分割

使用rotatelogs(apache自带的工具)每隔一天记录一个日志

(1)编辑Apache的主配置文件,更改内容如下:
注释掉如下两行:

ErrorLog logs/error_log
CustomLog logs/access_log common

然后添加如下两行:

ErrorLog "|/opt/softwares/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/opt/softwares/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined

注意:其中86400为轮转的时间单位为秒

(2.)重启Apache验证:查看logs目录下的日志文件

# systemctl restart httpd

[root@localhost http-2.4.48]# ll logs/
total 28
-rw-r--r--. 1 root root  255 May 31 06:46 access_20210531.log
-rw-r--r--. 1 root root 2759 Jun  1  2021 access_log
-rw-r--r--. 1 root root  818 May 31 06:42 error_20210531.log
-rw-r--r--. 1 root root 8458 Jun  1  2021 error_log
-rw-r--r--. 1 root root    6 May 31 06:42 httpd.pid

apache配置禁止使用IP访问

1、修改主配置文件httpd.conf,

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

2、修改conf/extra/httpd-vhosts.conf

2.4.1版本之前

<VirtualHost 10.*.*.*>
      ServerName 10.*.*.*

      ServerAlias 10.*.*.*

      <Location />

          Order Allow,Deny

          Deny from all

      </Location>

</VirtualHost>

#<VirtualHost 10.0.0.*>
#
#       DocumentRoot htdocs
#       ServerName www.test.com
#
#</VirtualHost>

2.4.1版本以后

#禁止所有非法域名
<VirtualHost *:80>
        ServerName 10.0.0.10
        ServerAlias *
        <Location />
                Order Allow,Deny
                Deny from all
        </Location>
</VirtualHost>

#允许访问的域名
<VirtualHost *:80>
        DocumentRoot htdocs
        ServerName www.test.com
        ServerAlias www.test.com
        <Directory "htdocs">
            Options Indexes FollowSymLinks
            AllowOverride all
            Order allow,deny
            Allow from all
        </Directory>
        <IfModule mod_rewrite.c>
                RewriteEngine On
                RewriteRule ^(.*)-htm-(.*)$ .php?
                RewriteRule ^(.*)/simple/([a-z0-9\\_]+\\.html)$ /simple/index.php?
        </IfModule>
        #错误日志保存位置
        ErrorLog "logs/test.error.log"
        CustomLog "logs/test.access.log" combined
</VirtualHost>

这时使用域名可以访问,使用IP就无法访问了

keepalive

TCP连接建立后,每个资源获取完成后不会断开连接,继续进行其他资源请求的进行,同时为了避免大量的连接被占据,可以从数量和时间上两个维度进行限制

1、配置参数

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 5

2、测试 使用Telnet测试访问web服务

先关闭keepalive

KeepAlive Off

使用Telnet测试

[root@localhost http-2.4.48]# telnet 10.0.0.10 80
Trying 10.0.0.10...
Connected to 10.0.0.10.
Escape character is \'^]\'. 
GET /index.html HTTP/1.1                          # 包括下面那一行 都是手动输入的,输入完按回车
Host:10.0.0.10 

HTTP/1.1 200 OK
Date: Sun, 30 May 2021 14:02:44 GMT
Server: Apache
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Sun, 30 May 2021 14:02:44 GMT
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>
Connection closed by foreign host.

现象:服务器响应完之后直接关闭了连接

开启keepalive

KeepAlive On

测试

[root@localhost http-2.4.48]# telnet 10.0.0.10 80
Trying 10.0.0.10...
Connected to 10.0.0.10.
Escape character is \'^]\'.
GET /index.html HTTP/1.1
Host:10.0.0.10

HTTP/1.1 200 OK
Date: Sun, 30 May 2021 14:02:59 GMT
Server: Apache
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Sun, 30 May 2021 14:02:59 GMT
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>
a
HTTP/1.1 400 Bad Request
Date: Sun, 30 May 2021 14:03:03 GMT
Server: Apache
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
Connection closed by foreign host.

现象:服务器响应完成之后继续等待客户端的请求直到超时为止才断开

 

以上是关于apache的一般优化的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

如何优化C ++代码的以下片段 - 卷中的零交叉

从JVM的角度看JAVA代码--代码优化

0548-apache两种工作模式介绍及配置优化

环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools(代码片段

实验以及理论:Tomcat部署以及优化