Apache 优化与安全
Posted 我一个月改一次名
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache 优化与安全相关的知识,希望对你有一定的参考价值。
前言
一、Apache 页面优化概述
- 在企业中,部署Apache后,只会采用默认的配置,这样会引发网站很多问题,换言之默认配置是针对以前较低的Apache服务器配置的,已经不适用当今互联网时代;
- 为了适应企业实际需求,就需要考虑如何提升 Apache 的性能与稳定性,这就需要进行Apache优化。
优化的内容:
- 配置网页压缩功能
- 配置网页缓存
- 工作模式的选择与参数优化
- 配置隐藏版本号
- 配置防盗链
- 等
【在进行优化配置之前,需要服务器已经安装好了 Apache 服务】
二、配置网页压缩功能
- 网页压缩功能需要重新生成 httpd.conf 主配置文件。然后生成 deflate 压缩模块
2.1 gzip 介绍
- 配置 Apache 的网页压缩功能,是使用 gzip 压缩算法来对Web网页内容进行压缩后再传输到客户端浏览器;
作用:
- 降低了网络传输的字节数,加快网页加载的速度节省流量;
- 改善用户的浏览体验;
- gzip与搜索引擎的抓取工具有着更好的关系;
2.2 Apache 的压缩模块
Apache 实现网页压缩的功能模块包括 :
- mod_gzip 模块
- mod_deflate 模块
Apache 1.x 版本:没有内建网页压缩技术,但可使用第三方 mod_gzip
模块执行压缩;
Apache 2.x 版本:在开发的时候,内建了 mod_deflate
这个模块,取代 mod_gzip。
mod_gzip 模块与mod_deflate 模块比较:
- 两者均使用 gzip 压缩算法,运作原理类似;
- mod_deflate 压缩速度略快, 而 mod_gzip 的压缩比略高;
- mod_gzip 对服务器CPU的占用要高一些;
- 高流量的服务器,使用 mod_deflate 可能会比 mod_gzip 加载速度更快。
2.3 配置 Apache 服务器的网页压缩功能
步骤:
- 1 . 查看是否安装了 mod_deflate 模块
- 2 . 修改 httpd 配置文件,启用压缩功能
- 3 . 进行访问测试,查看压缩信息
2.3.1 检查是否安装 mod_deflate 模块
没配置过默认是未安装,需要进行安装
apachectl -t -D DUMP_MODULES | grep "deflate"
#apachectl -t -D DUMP_MODULES 表示查看 apache 加载的模块
2.3.2 重新编译安装 Apache 添加 mod_deflate 模块
如果没有安装 mod_deflate 模块,需要停止 apache 服务,然后进行重新编译安装模块,安装好之后会生成新的配置文件。然后再重新配置 httpd.conf 配置文件。
systemctl stop httpd.service
cd /usr/local/httpd/conf
mv httpd.conf httpd.conf.bak #备份
#需要安装一个 zlib-devel 软加包
yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
cd /opt/httpd-2.4.29/
./configure \\
--prefix=/usr/local/httpd \\
--enable-so \\
--enable-rewrite \\
--enable-charset-lite \\
--enable-cgi \\
--enable-deflate #在apache中开启mod_deflate 模块
#这么多配置可以写在一行, \\ 表示换行再进行输入
make && make install
重新执行配置 ./configure … 并编译安装 make && make install
2.3.3 配置 mod_deflate 模块启用
vim /usr/local/httpd/conf/httpd.conf
#52行;修改
Listen 192.168.31.101:80
#105行;取消注释;开启mod_deflate 模块
LoadModule deflate_module modules/mod_deflate.so
#198行;取消注释,修改
ServerName www.duan.com:80
#末行添加
<IfModule mod_deflate.c>
#代表对什么样的内容启用gzip压缩
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript text/jpg text/png
DeflateCompressionLevel 9 #代表压缩级别,范围为1~9
SetOutputFilter DEFLATE #代表启用deflate 模块对本站点的输出进行gzip压缩
</IfModule>
修改配置文件,vim /usr/local/httpd/conf/httpd.conf
取消注释mod_deflate 模块,在没配置安装 deflate 前,配置文件中没有这一行配置。
修改站点地址
2.3.4 检查安装情况,启动服务
#验证配置文件的配置是否正确
apachectl -t
#检查 mod_deflate 模块是否已安装
apachectl -t -D DUMP_MODULES | grep "deflate"
#已安装的正确结果
deflate_module (shared)
systemctl start httpd.service
netstat -natp | grep httpd
能看到 deflate 模块已经安装好了,重新开启httpd服务。
Linux 常用命令
cpu负载,uptime
内存容量,free -m
硬盘空间,df -h
网卡流量,ifconfig ens33
安装的软件包数量,rpm -qa | wc -l
账户数量,/etc/passwd
当前登录的账户数量,who
进程数量,ps aux
端口号, lsof -i :80
输错密码的主机,/var/log/secure
2.3.5 测试 mod_deflate 压缩是否生效
cd /usr/local/httpd/htdocs
#先将图片文件传到/usr/local/httpd/htdocs 站点目录下
vim index.html
<html>
<body>
<h1>Welcome my website</h1>
<img src="timg.jpg" height="400" width="500"/>
</body>
</html>
站点配置完 index.html 文件后,在浏览器中通过域名访问。
查看页面请求信息,响应码必须是200才能看
Content-Encoding 是HTTP中用来对采用哪种编码格式传输正文进行协定的一对头部字段。
如果想在Windows 的IE 浏览器中看这个请求头,需要在 C:\\Windows\\System32\\drivers\\etc\\hosts 文件中 添加 IP与域名对应关系,
默认没有权限保存,修改文件属性给用户加权限即可。
添加一行记录,这时候就能保存,在浏览器中就能访问 www.duan.com了。
然后 win7 的话需要安装 .NET Framework 4 ,Win10 需要安装 fiddler 软件包,然后再浏览器中进行查看请求响应信息。
三、配置网页缓存
- 通过 mod_expire 模块配置 Apache,使网页能在客户端浏览器缓存一段时间(把页面缓存到本地的机器当中),以避免重复请求;
- 启用 mod_expire 模块后,会自动生成页面头部信息中的 Expires 标签和Cache-Control 标签,客户端浏览器根据标签决定下次访问是在本地机器的缓存中获取页面,不需要向服务器再次发出请求(直接从本地缓存中获取),从而降低客户端的访问频率和次数,达到减少不必要的流量 和 增加访问速度的目的。
3.1 检查是否安装 mod_expires 模块
配置缓存模块和网页压缩步骤查不多,先安装模块,再修改 httpd 配置文件。
apachectl -t -D DUMP_MODULES | grep "expires"
3.2 重新编译安装 Apache 添加 mod_expires模块
systemctl stop httpd.service
cd /usr/local/httpd/conf
mv httpd.conf httpd.conf.bak1
yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
cd /opt/httpd-2.4.29/
./configure \\
--prefix=/usr/local/httpd \\
--enable-so \\
--enable-rewrite \\
--enable-charset-lite \\
--enable-cgi \\
--enable-deflate \\
--enable-expires #加入mod_expires 模块
make && make install
重新执行配置 ./configure … 并编译安装 make && make install
不安装 make install 是不会重新生成 httpd.cong 配置文件的。
安装之后就有生成了httpd配置文件
3.3 配置 mod_expires 模块启用
vim /usr/local/httpd/conf/httpd.conf
#52行;修改
Listen 192.168.31.101:80
#111行;取消注释;开启mod_expires 模块
LoadModule expires_module modules/mod_expires.so
#198行;取消注释,修改
ServerName www.duan.com:80
#末行添加
<IfModule mod_expires.c>
#打开网页缓存功能
ExpiresActive On
#设置缓存60秒
ExpiresDefault "access plus 60 seconds"
</IfModule>
在配置文件中修改监听地址与端口号,修改服务器地址,放开 缓存配置注释行
Listen 192.168.31.101:80
ServerName www.duan.com:80
末行添加
3.4 检查安装情况,启动服务,验证缓存
#验证配置文件的配置是否正确
apachectl -t
#检查 mod_deflate 模块是否已安装
apachectl -t -D DUMP_MODULES | grep "expires"
#已安装的正确结果
deflate_module (shared)
systemctl start httpd.service
这时候清除缓存重新访问网站,可以在响应头中看到配置的缓存信息。
四、隐藏 Apache 版本号
没配置隐藏前能看到版本信息
Apache的版本信息,透露了一定的漏洞信息,从而给网站带来安全隐患,因此生产环境中要隐藏Apache版本信息。
配置方法:
vim /usr/local/httpd/conf/httpd.conf
#490行;取消注释
Include conf/extra/httpd-default.conf
vim /usr/local/httpd/conf/extra/httpd-default.conf
#55行;修改;将原本的Full改成Prod,只显示名称,不显示版本
ServerTokens Prod
#ServerTokens 表示 Server 回送给客户端的响应头域是否包含关于服务器 OS 类型和编译过的模块描述信息。
systemctl restart httpd.service
浏览器访问 http://192.168.31.101,双击200 消息查看 Server 项
httpd.conf
vim /usr/local/httpd/conf/extra/httpd-default.conf
重启 httpd 服务,清空浏览器缓存,再次访问域名,就能看到没有版本号了。
00000
五、Apache 防盗链
- 防盗链是防止别人的网站代码里面盗用我们自己服务器上的图片、文件、视频等相关资源;
- 如果别人盗用网站的这些静态资源,明显的是会增大服务器的带宽压力
- 作为网站的维护人员,要杜绝服务器的静态资源被其他网站盗用
测试盗图
比如我们查看图片的属性信息,看到图片的网址,在另一个网站中使用这个连接就能查看图片。但用的是我的服务器资源。
我现在有一台服务器 192.168.31.102 ,安装httpd 服务,查看 /etc/httpd/conf/httpd.conf 配置文件中的主站根目录主页位置
在 /var/www/html 中新建文件 index.html
<html>
<body>
<h1>
this is 192.168.31.102
</h1>
<img src="http://www.duan.com/timg.jpg"/>
</body>
</html>
然后访问该IP
这时候我修改 /var/named/lisi.com.zone 文件
并修改 windows 系统 hosts 中新增一条记录 192.168.31.102 www.lisi.com 之后,就能用 网页访问该域名了。
配置Apache 防盗链
防盗链 就是通过在源服务器上配置,将链接转到另一个链接
5.1 检查是否安装 mod_rewrite 模块
apachectl -t -D DUMP_MODULES | grep "rewrite"
其实上面的实验中已经安装好这个模块了
5.2 重新编译安装 Apache 添加 mod_rewrite模块
停止 httpd 服务,备份配置文件,添加配置,编译安装
systemctl stop httpd.service
cd /usr/local/httpd/conf
mv httpd.conf httpd.conf.bak2
yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
cd /opt/httpd-2.4.29
./configure \\
--prefix=/usr/local/httpd \\
--enable-so \\
--enable-rewrite \\
--enable-charset-lite \\
--enable-cgi \\
--enable-deflate \\
--enable-expires
make && make install
5.3 配置 mod_rewrite 模块启用
修改配置文件,配置防盗链模块,启动httpd 服务
vim /usr/local/httpd/conf/httpd.conf
#156行;取消注释
LoadModule rewrite_module modules/mod_rewrite.so
#223行
<Directory "/usr/local/httpd/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
#打开 rewrite 功能,加入 mode_rewrite 模块内容
RewriteEngine On
#设置匹配规则
#只要URL不是上面四行网址的,并且以gif|jpg|swf结尾的,都重定向到http://www.duan.com/error.png这个连接中
RewriteCond %{HTTP_REFERER} !^http://duan.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://duan.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.duan.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.duan.com/$ [NC]
#设置跳转动作
RewriteRule .*\\.(gif|jpg|swf)$ http://www.duan.com/error.png
</Directory>
systemctl start httpd.service
规则解释:
RewriteCond %{HTTP_REFERER} !^http://www.kgc.com/.*$ [NC] 的字段含义:
“%{HTTP_REFERER}” :存放一个链接的 URL,表示从哪个链接访问所需的网页。
“!^” :表示不以后面的字符串开头。
“http://www.kgc.com” :是本网站的路径,按整个字符串匹配。
“.*$” :表示以任意字符结尾。
“[NC]” :表示不区分大小写字母。
RewriteRule .*\\.(gif|jpg|swf)$ http://www.kgc.com/error.png 的字段含义:
“.” :表示匹配一个字符。
“*” :表示匹配 0 到多个字符,与“.”合起来的意思是匹配 0 到多次 前面的任意字符,如果是 1 到多次匹配可以用“+”表示。
“\\.” :在这里的“\\”是转义符,“\\.”就代表符号“.”的意思。因为“.”在指令中是属于规则字符,有相应的含义, 如果需要匹配,需要在前面加个转义符“\\”,其它规则字符如果需要匹配,也做同样处理。
“(gif|jpg|swf)” :表示匹配“gif”、“jpg”、“swf”任意一个,“$”表示结束。最后的规则是以“.gif”、“.jpg”、“.swf”结尾, 前面是1到多个字符的字符串,也就是匹配图片类型的文件。
“http://www.lic.com/error.png” :表示转发到这个路径 。
整个配置的含义是 使用本网站以外的网站域名 访问本站的图片文件时,显示 error.png 这个图片。
放开防盗链模块注释
在主站配置模块 <Directory “/usr/local/httpd/htdocs”> 中添加
要注意的是过滤的和转发的目的文件扩展名不能相同,不然就不停的转发再过滤再转发。。。(如 RewriteRule .*.(gif|jpg
|swf)$ http://www.kgc.com/error.jpg
)。
把转发的图片放到主站目录下,再用别的网站模拟盗链。生效。
总结:如果 同时需要 压缩、缓存、防盗链等功能是,可以在 ./config 安装配置时一起安装了,省的一个个添加,再编译安装修改配置文件。
配置每个功能时,不仅要放开注释,还要添加具体的配置模块,
以上是关于Apache 优化与安全的主要内容,如果未能解决你的问题,请参考以下文章
Apache网页与安全优化——防盗链和隐藏版本(理论实践相结合!)