网页压缩
###只能用httpd -2.2.17.tar.gz
或则yum安装的httpd
网站的访问速度是由多方面因素所照成,这些因素包括应用程序的响应速度,
网络宽带,服务器本身性能,与客户之间的网络传输速度等等。。。
其中最重要的就是APACHE本身的响应速度,这是可以利用网页压缩提升应用程序的速度,而且不需要任何成本,只不过会让cpu占用率稍微高一点
Gzip
一种流行的压缩算法,应用十分广泛,可以减少%70以上的文件大小 ,利用apache的gzip模块来对apache服务发布的网页的内容进行压缩后在传输到客户端浏览器,这样既降低了字节数,最明显的好处是可以加快网页的加载速度。
http压缩过程
web服务器收到浏览器的http请求后,先检查浏览器是否 支持http压缩,如果浏览器支持,web’服务器将会检查请求文件的后缀名,如果请求是 html,css等静态文件,web会将压缩缓存目录中,检查是否已经存在请求文件的最新压缩文件,如果请求的文件压缩文件不在,web服务器向浏览器返回未压缩的请求文件,并在缓存目录中存放请求文件的压缩文件,如果请求的文件压缩文件已经存在,则直接返回请求为文件的压缩文件,如果请求的文件是动态文件,web服务器动态压缩内容并返回浏览器,但压缩文件不放在缓存中;
apache的压缩模块:
apache 1.x系列没有内建压缩技术使用的是额外第三方mod_gzip模块来执行压缩,而官方在apache 2.x的时候将网页压缩考虑了进去,内建了mod_deflate这个模块,取代了mod_gzip,两者运算原理相同
mod_deflate压缩速度略快,mod_gzip的压缩比率高
如果访问量小,则使用mod_gzip,大的话就是用mod_deflate
从apache 2.0.45开始mod_deflate可使用DeflateCompressionLevel指令来设置压缩级别 1(压缩速度快,质量差)到9(压缩速度最慢,压缩质量高)之间的整数,默认为6(压缩质量和速度平均)
Mod_deflate 模块
(1)检查是否安装了mod_deflate模块
[root@localhost ~]#apachectl -t -D DUMP_MODULES | grep “deflate”
(2)安装mod_deflate模块
需要先停止apache服务 重新编译 安装deflate模块
[root@localhost ~]#systemctl stop httpd
[root@localhost ~]#./configure –prefix=/usr/local/httpd –enable-so –enable-deflate –enable-rewrite –enable-charset-lite –enable-cgi
[root@localhost ~]#make && make install
[root@localhost ~]#yum -y install zlib-devel opens-devel
(3)配置mod_deflate模块启用
[root@localhost ~]#vim /usr/local/httpd/conf/httpd.conf
编辑 http.conf 文件
去掉 #LoadModule headers_module modules/mod_headers.so 前面的注释#
去掉 #LoadModule deflate_module modules/mod_deflate.so 前面的注释#
去掉 #LoadModule filter_module modules/mod_filter.so 前面的注释#
第一条和第三条默认时已经开启
第二条需要开启就ok
///末尾添加
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript application/x-httpd-php application/x-httpd-fastphp
###代表对什么样的内容启用gzip压缩
DeflateCompressionLevel 6
###代表压缩级别
SetOutputFilter DEFLATE
###启用deflate模块对本站点的输出并进行gzip压缩
(4)检测httpd.conf语法
Httpd -t
(5)检测模块是否安装
[root@localhost ~]# apachectl -t -D DUMP_MODULES | grep “deflate”
Syntax OK
Deflate_module (static)
然后启动apache服务
(6)测试mod_deflate压缩是否生效
使用:fiddler抓包工具 查看
可以看到Content-Encoding:gzip (表示压缩文件已经生效)
网页缓存
网页缓存是将一部分经常不会改变的或变动很少的页面缓存,下次浏览器在访问这些页面时不需要在去下载这些页面,从而提高了用户访问速度
Apache的mod_expires模块会自动生成页面头部信息中的Express标签和Cache-Control标签,客户端浏览器根据标签决定下次访问实在本机器的缓存中获取页面,不需要再次向服务器发出请求,从而降低了客户端访问频率和次数,达到不必要的流量和增加访问速度的目的。
(1) 检查mod_expires模块是否安装
显示deflate_expires(static)表示已经安装
[root@localhost ~]#apachectl -t -D DUMP_MODULES | grep “expires”
(2)安装mod_expires模块
[root@localhost ~]#systemctl stop httpd
[root@localhost ~]#./configure –prefix=/usr/local/httpd –enable-so –enable-deflate –enable-rewrite –enable-charset-lite –enable-cgi --enable-expires
--enable-expires 加入mod_expires
[root@localhost ~]#make && make install
(3)配置mod_expires模块启用
[root@localhost ~]#vim /usr/local/httpd/conf/httpd.conf
ExpiresActive On
ExpiresDefault “access plus 60 seconds” ###注意符号
(4)检查语法
[root@localhost ~]#httpd -t
Syntax OK
(5)检查模块是否安装
[root@localhost ~]# apachectl -t -D DUMP_MODULES | grep “expires”
Syntax OK
Expires_module(static)
[root@localhost ~]#systemctl restart httpd
(6)测试缓存是否生效
响应包头中包含了Expires项,说明已经成
防盗链
Apache除了性能可以优化,对安全性也要进行相应的配置,默认配置能够保证服务器正常提供服务,但apache作为一个软件,必然会纯在一些漏洞,尽可能浅在危险
防盗链:一般来说我们访问的网页并不是一次性的全部发送到客户端的,如果所请求页面带有图片或者其他信息,那么第一个http请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文字进行解释执行,如果发现其中还有图片,那么客户端的浏览器会再发送一条http请求,当这个请求被处理后这个图片文件才会被传达到客户端,最后浏览器的会将图片放到页面正确的位置,这样一个完整的页面要经过多次发送http请求才能够被完整的显示出来。
###基于这样的机制,就会产生盗链的问题,如果一个网站没有其中所说的图片信息,那么它完全可以链接到其他网站的图片信息上,这样,在没有任何资源的网站利用了别的网站资源来展示给浏览器,提高了自己的访问量,而大部分浏览者并不会发现,一些不良的网站为了不增成本而扩充自己的站点内容,经常盗用其他网站的链接,一方面损害了原网站的利益,另一方方面又加重了服务器的负担。
http标准协议中有专门的Referer字段记录,作用如下:
(1) 可以追溯上一个入站地址是什么
(2) 对于资源文件可以跟踪到包含显示它的网页地址是什么。
可以先利用两台linux主机进行测试保证apache没有问题,firewalld,selinux机制都要关掉
拉一张图片到根目录下在并且 在服务器上修改/usr/local/httpd/htdocs/index.html
It works!
###aaa.log图片名称,随意。
在要盗链的服务器上修改index.html
It works!
;
这时候,利用fiddler抓取数据包,可以看到先对服务器请求,最后向盗链服务器的请求
Apache防盗链配置:
(1) 检查apache是否安装了mod_rewrite模块 (如果没有安装,需要关闭apache重新编译安装将mod_rewrite加入)
(2) 安装后,需要在httpd.conf文件中启用后生效
[root@localhost conf]# vim httpd.con
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://benet.com/.$ [NC]
RewriteCond %{HTTP_REFERER} !^http://benet.com/$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.benet.com/.$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.benet.com/$ [NC]
RewriteRule ..(gif|jpg|swf)$ http://www.benet.com/abc.png
或
RewriteEngine On #启用rewrite,要想rewrite起作用,必须要写上
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !benet.com/.$ [NC]
RewriteCond %{HTTP_REFERER} !benet.com/.$ [NC]
RewriteCond %{HTTP_REFERER} !www.benet.com/.$ [NC]
RewriteCond %{HTTP_REFERER} !www.benet.com/.$ [NC]
RewriteRule ..(gif|jpg|swf)$ http://www.benet.com/abc.png [R,NC,L]
服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP
Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
红色:就是改为你提供下载页面的地址,也就是只有通过这个地址才可以下载你所提供的东东。
蓝色:就是要保护文件的扩展名(以|分开),也就是说以这些为扩展名的文件只有通过红色的地址才可以访问。
绿色:如果不是通过红色的地址访问蓝色这些为扩展名的文件时就回重定向到绿色地址上。
如果上面的都不能用: 那利用SetEnvIfNoCase 和 htaccess
SetEnvIfNoCase Referer "^http://benet.com" local_ref=1
SetEnvIfNoCase Referer "^http://www.benet.com" local_ref=1
Order Allow,Deny
Allow from env=local_ref
###再利用抓包的时候 就会看到盗链主机已经没有图片了
最后在抓包的时候显示 302 代表重定向,这时,防盗链就已经做好了
隐藏版本号
一般情况下,软件漏洞信息和特定版本是相关的,因此,软件的版本号对***者来说是很有价值的,用fiddler抓包工具可以看到apache的版本
为了防止***利用这一方面进行***,我们可以修改httpd.conf文件,使httpd-default.conf文件生效,它里面包含了是否返回版本信息的内容。
[root@localhost conf]# vim httpd.conf
Include conf/extra/httpd-default.conf ###去掉前面的#号
[root@localhost extra]# vim httpd-default.conf
ServerTokens Full ### 改成 将Full 改成Prod
ServerSignature On ### 将On改成 Off
重启Apache 访问网址进行抓包
这时,已经将版本给隐藏
ab压力测试
网站性能压力测试服务器网站调优必不可缺少的一环,只有让服务器处在高压的情况下,才能真正的体现出软件,硬件各种设置不当所暴漏的问题
测试工具目前常见有以下几种:
Ab. http_load. Webbench siege
Ab是apache自带的一个工具,非常实用,可以模拟多线程并发请求,测试服务器的负载压力,不仅可以对apache测试,还可以对nginx,tomcat,iis…..
在测试期间最好在本机测试,应为如果远程的话,可能会出现网络延迟,或者宽带不足,在调优之前,先使用ab进行测试,之后在进行比较。
(1) 查看ab工具的位置
[root@localhost ~]# which ab
/usr/local/bin/ab
[root@localhost ~]# ls /usr/local/bin
ab checkgid envvars-std htdigest httxt2dbm
apachectl dbmmanage htcacheclean htpasswd logresolve
apxs envvars htdbm httpd rotatelogs
(2)ab命令格式是:ab [options] [http://]hostname[:port]/path
“[options]”:表示ab工具的参数
-n :测试会话中的总和 默认是只执行一个
-c:并发产生的请求个数,默认是一个
-t:测试产生的最大秒数
-v:设置显示信息的详细程度
“[http://]” :表示http前缀可以省略
“hostname”:表示访问的主机
“port”:表示端口号可以省略
(2) 使用ab工具测试
[root@localhost ~]# ab -n2000 -c800 www.benet.com/index.html
Server Software: Apache
Server Hostname: www.benet.com
Server Port: 80
Document Path: /index.html
Document Length: 68 bytes
Concurrency Level: 800
Time taken for tests: 1.705 seconds
Complete requests: 2000
Failed requests: 0
Write errors: 0
Total transferred: 793980 bytes
HTML transferred: 136340 bytes
Requests per second: 1173.08 [#/sec] (mean)
Time per request: 681.965 [ms] (mean)
Time per request: 0.852 [ms] (mean, across all concurrent requests)
Transfer rate: 454.79 [Kbytes/sec] received
(4):把deflate,expires模块关掉,分别进行测试
apache工作模式
apache支持插入式并行处理模块,成为多路处理模块,在编译apache’时候也只能选择一种模块,对于UNIX系统,可以选择多个,如worker MPM prefork MPM event MPM
不同的MPM会影响到apche的速度和可伸缩性
(1)### Prefork MPM 稳定性较强
Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景 ,稳定性较强,最重要的是MaxClients设置为一个足够大的数值以潜伏在请求高峰期,同时又不能太大,根据物理内存的大小,一般都是物理内存的0.5倍
Prefork工作模式
编译安装apache如果没有指定工作模式,那默认的时候就是prefork模式,可以使用httpd -l 命令查看,
在configure配置编译参数的时候,可以使用 --with-mpm=prefork|worker|event 来指定编译为那一种MPM,当然也可以用编译为三种都支持:--enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM
[root@localhost ~]# httpd -l
表示现在就是prefork模式
(3)prefork模式由一个单独的控制进程(父进程)负责产生子进程,子进程用于监听请求并作出应答,因此内存中会一直存在一些备用的或是空闲的子进程用于响应新的请求,可加快响应速度,父进程通常以root身份运行,以便绑定80端口,子进程一般以一个低特权的用户身份运行,可以通过user group 进行配置
[root@localhost conf]# vim httpd.conf
/mpm
(4)使用lsof命令查看apache进程的情况,如果没安装需要先安装
[root@localhost ~]#yum -y install lsof
[root@localhost ~]#lsof -i:80
(5)如果要启用prefork模块需要修改配置参数
[root@localhost conf]# vim httpd.conf
Include conf/extra/httpd-mpm.conf ##将前面#号去掉
[root@localhost conf]# cd extra
[root@localhost extra]# vim httpd-mpm.conf
prefork的模式参数
(6)prefork参数调优
ServerLimit需要自己添加
调优之后在进行测试,你会看到 Time taken for tests测试请求时间略又缩短,说明优化启到了作用
- 2、Worker MPM
和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)
(1):启用worker工作模式
关闭apache重新编译
./configure –prefix=/usr/local/httpd –enable-so –enable-deflate –enable-rewrite –enable-charset-lite –enable-cgi --enable-expires --with=mpm=worker
[root@localhost ~]httpd -t
Worker.c ###代表worker模式已经启用
[root@localhost conf]# vim httpd.conf
Include conf/extra/httpd-mpm.conf ##将前面#号去掉
(2.)worker模式的配置文件也是 /usr/local/httpd/conf/extra/httpd-mpm.conf
[root@localhost ~] vim /usr/local/httpd/conf/extra/httpd-mpm.conf
默认值
区别:
- 目录优化
给指定的文件夹配置对应的访问权限是apache配置中的基础应用,也是apache使用者的必备技能之一,在apache配置文件中,给指定的目录设置基本的访问权限,主要是靠Allow,Deny,Order 三个指令配合使用来实现的
作者:zh
版权声明:本文为博主文章,转载请练习博主;