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++ 反转句子中的每个单词需要对我的代码片段进行代码优化
环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools(代码片段