阅读 73

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


    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 ,但是事实上它没有问题

启用缓存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   # 取消注释

增加配置


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"
 

访问测试

[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的语法

其中是下列之一:
? access
? now(等价于access )
? modification      

plus关键字是可选的。必须是整数,
是下列之一:
? 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版本之前

10.*.*.*>
      ServerName 10.*.*.*

      ServerAlias 10.*.*.*

      

          Order Allow,Deny

          Deny from all

      



#10.0.0.*>
#
#       DocumentRoot htdocs
#       ServerName www.test.com
#
#

2.4.1版本以后

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


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

这时使用域名可以访问,使用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

It works!

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

It works!

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 "-//IETF//DTD HTML 2.0//EN"> <head> <span style="color: rgba(128, 0, 128, 1)">400</span> Bad Request head>

Bad Request

Your browser sent a request that this server could not understand.

Connection closed by foreign host.

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

 

原文:https://www.cnblogs.com/zh-dream/p/14858157.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐