mod_deflate模块介绍
官方网站:http://httpd.apache.org/docs/2.2/
apache的mod_deflate模块提供了DEFLATE输出过滤器,允许apache服务器将输出内容在发送到客户端之前根据具体的策略进行压缩,以节约网站带宽,同时提升用户访问体验。
- mod_deflate模块安装方法
检查apache mod_deflate模块是否安装
/application/apache/bin/apachectl -M #查看所有模块,如果出现(dynamic),表示该模块是DSO方式编译的,如果出现(static) ,表示该模块是编译安装的,以上两种方法不能同时配置,否则会有冲突。
/application/apache/bin/apachectl -l|grep mod_deflate.c #列出编译安装的模块
ls /application/apache/modules/ #以DSO方式编译的模块查看方法
- mod_deflate模块常规安装
配置编译时加入如下参数
[root@apache httpd-2.2.27]# ./configure –help|grep deflate
–enable-deflate Deflate transfer encoding support
#–enable-deflate提供对内容的压缩传输编码支持,一般html,js,css等内容的站点,使用此参数功能会大大提高传输速度,提升访问者访间体验。在生产环境中,这是apache调优的一个重要选顶之一
- mod_deflate DSO安装方式
cd /server/tools/httpd-2.2.27/modules/filters/
/application/apache/bin/apxs -c -i -a mod_deflate.c
ll /application/apache/modules/
上述apxs参数选项说明
- -c此选项表示需要执行编译操作.它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象dsofile。如果没有指定-o选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为so。
- -i此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
- -a此选项自动增加一个LoadModule行到conf文件中,以激活此模块
- mod_deflate模块在apache中的应用
可以在主配置中配置,也可以在虚拟主机中配置
整个配置过程十分简单,只需要把下面内容完整的复制到httpd.conf或者httpd-vhosts虚拟机主机标签的结尾保存即可使所有的虚拟主机生效。
环境1:在主httpd.conf配里中配里如下
http://httpd.apache.org/docs/2.2/mod/mod_deflate.html
<IfModule mod_deflate.c>
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml # 压缩类型
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
SetOutputFilter DEFLATE
#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio #在日志中存放压缩率标记,这个功能一般不用
#LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate #日志格式
#CustomLog logs/deflate_log.log deflate #记录压缩日志
</IfModule>
测试:访问网站通过火狐浏览器的yslow插件查看,也可以通过curl -I域名地址查看。
- mod_expires模块在apache中的应用
mod_expires模块查看、安装过程同mod_deflate模块,仅仅在编译的时候添加–enable-expires参数,或者以DSO方式指定mod_expires.c
语法:
Description: Value of the Expires header configured by MIME type
Syntax: ExpiresByType MIME-type <code>seconds
Context: server config, virtual host, directory, .htaccess #也可以为location
Override: Indexes
Status: Extension
Module: mod_expires
整个配置十分简单,只需要把下面内容完整的复制到httpd.conf结尾保存即可使所有的虚拟主机生效。
<IfModule mod_expires.c> #此行为注释,不生效,也可以不写
ExpiresActive on
ExpiresDefault “access plus 12 month”
ExpiresByType text/html “access plus 12 months”
ExpiresByType image/gif “access plus 12 month”
ExpiresByType image/jpeg “access plus 12 month”
ExpiresByType application/x-javascript “access plus 12 month”
ExpiresByType text/css “access plus 12 month”
ExpiresByType application/x-shockwave-flash “access plus 12 month”
ExpiresByType image/jpg “access plus 12 months”
ExpiresByType image/png “access plus 12 months”
ExpiresByType video/x-flv “access plus 12 months”
</IfModule>
- 不记录不需要的访问日志
#不记录图片,js,css访问日志
<FilesMatch “\.(ico|gif|jpg|png|bmp|swf)”>
SetEnv IMAG 1
</FilesMatch>
CustomLog logs/access_log combined env=!IMAG
- RS服务器不记录负载均衡器健康检查的日志
SetEnvIfRequest_URI “^/checkstatus.html” dontlog
ErrorLog”logs/error_log”
LogLevel warn
CustomLog”logs/access_log” combined env=!dontlog
- 禁止资源目录解析php程序
方法一:提示下载不解析
<Directory “/var/html/bbs/attachments”>
Optionss FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
php_flag engine off
</Directory>
方法二:返回403错误
<Directory /var/html/blog/attachments>
<file ~ “.php”>
Order allow,deny
deny from all
</files>
</Directory>
- worker/perfork模式说明及优化配置
查看当前使用的模式:默认是prefork
[root@apache ~]# /application/apache/bin/apachectl -l|egrep “worker|prefork”
[root@apache ~]# /application/apache/bin/apachectl -l|sed -n “/worker\|prefork/p”
- prefork模式(进程模式,默认)
prefork使用的是多个子进程,而每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接。一个主进程,多个子进程
工作原理:
控制进程最初建立若干个子进程,为了不在请求到来时再生成子进程,所以要根据需求不断的创建新的子进程,最大可以达到每秒32个直到满足需求为止。
安装方法:
在编译的过程中,加入参数–with-mpm=prefork如果不加也可以,因为默认的话,会采用prefork模式
优点:效率高,稳定,安全.对于线程调试困难的平台来说,调试更加容易些。
缺点:和woker模式比消耗资源多
常用配置参考:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 5000
</IfModule>
ps -ef|grep http|wc -l #此模式下查看apache的并发
- worker模式
worker模式是apache2.x新引进来的模式,是线程与进程的结合,在worker模式下会有多个子进程,每个子进程又会有多个线程,每个线程在某个确定的时间只能维持一个连接。一个主进程,多个子进程,每个子进程又有多个线程。
工作原理:
由主控制进程生成若干个子进程,而每个子进程中又包含固定的线程数,各个线程独立处理请求,同样为了不在请求到来时再生成线程,在配里文件中设置了最小和最大的空闲线程数及所有子进程中的线程总数,如果现有子进程中的线程总数不能满足并发及负载,控制进程将派生新的子进程。
子进程和线程的区别:http://blog.csdn.net/wangkehuai/article/details/7089323
安装方法:
在编译的过程中,加入参数–with-mpm=worker
优点:内存占用比prefork模式低,适合高并发、高流HTTP服务
缺点:假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”.由于线程共享内存空间,所以一个程式在运行时必须被系统识别为”每个线程都是安全的”。服务稳定性不如prefork模式
<IfModule mpm_worker_module>
StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerchild值决定的,应该大于等于maxclients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。
默认最大的子进程总数是16,如需加大时也需要显式声明ServerLimit 的值(最大值是20000)。
特别说明:
如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)
数学表达:
MaxClients<=总的进程数(ServerLimit)*线程数(ThreadsPerChild)
MaxClients%ThreadsPerChild=0
worker MPM也有不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”。
pstree -a|grep http|wc -l #此模式下查看apache的并发
- 禁止目录索引及用户重载
<Directory “/var/html”>
Options -Indexes FollowSymLinks #Indexs前加-,或去掉Indexs,禁止目录索引
AllowOverride None #禁止用户重载
Order allow,deny
Allow from all
/Directory
提示:禁止用户重载这会加快服务器响应速度,因为它不在为每个请求寻找每个目录访问控制文件(.htaccess)。也杜绝了开发人员变相修改配置的安全隐患。
- 避免使用.htaccess文件
首先是从web性能考虑。如果AllowOverride启用了支持.htaccess文件,则Apache需要在每个站点目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致web性能的下降.另外,对每一个请求,都需要读取一次.htaccess文件。
其次是安全考虑.这样会允许开发人员或者代码管理者可以修改服务器的配置,这可能会导致某些意想不到的修改,应该避免使用.htaccess文件功能,如果要实现类似的功能,可以在主配里中配置。
- 关闭无用的CGI功能配置
将配置文件中下面内容及其模块中的注释都干掉
<IfModule alias_module>
ScriptAlias /cgi-bin/ “/application/apache2.2.27/cgi-bin/”
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory “/application/apache2.2.27/cgi-bin”>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
- 使用tmpfs文件系统替代频繁访问的目录
mkdir /opt/tmp
mv /tmp/* /opt/tmp
mount -t tmpfs -o size=16m tmpfs /tmp #工作中一般给2-4G
echo “mount -t tmpfs -o size=16m tmpfs /tmp” >>/etc/rc.local
vi /etc/fstab #或者在fstab文件中挂载
tmpfs /tmp tmpfs size=2048m 0 0
- 使用CDN做网站加速
简单地讲,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,杭州的用户访问近杭州服务器上的内容,北京的访问近北京服务器上的内容。这样可以有效减少数据在网络上传输的时间,提高速度。把静态内容分布到CDN减少了用户影响时间20%或更多。
CDN技术示意图:
网宿,蓝讯(chinacache),快网
- 实现防盗链
Apache 防盗链的第一种实现方法,可以用 Rewrite 实现。首先要确认 Apache 的 rewrite module可用:能够控制 Apache httpd.conf 文件的,打开 httpd.conf,确保有这么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在相应虚拟主机配置的地方,加入下列代码:
ServerName www.etiantian.org
#防盗链配置参数
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://www.etiantian.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.etiantian.org$ [NC]
RewriteCond %{HTTP_REFERER} !^http://blog.etiantian.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://blog.etiantian.org$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.etiantian.org/img/nolink.gif [R,NC]
说明:
- www.etiantian.org、blog.etiantian.org表示网站的信任站点
- .(gif|jpg|swf)表示要保护的防止被盗连的文件的扩展名
- nolink.gif为上述扩展名的资源被盗链后的重定向页面/图片。用以输出警示信息,这张图片应该尽可能的小。
在其他的网站中,如果调用www.etiantian.org提供的图片URL,这样就会转向http://www.etiantian.org/img/nolink.gif,这个转向图片可能是版权信息的提示。
- 利用referer和rewrite防盗链说明
通过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的网站内容,才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的。需要注意的是:不是所有的用户代理(浏览器)都会设置referer变量,而且有的还可以手工修改referer,referer是可以被伪造的。上面配置,只是一种简单的防护手段。应付一般的盗链也足够了。
- 利用Cookie和rewrite实现Apache防盗链下载
常见的的网站防盗链都是通过Referer来判断用户来路的,不过这样的方法对于下载工具来说形同虚设,因为现在的下载工具早就能伪造Referer了。
Cookie配合Rewr1te模块很简单的可实现防盗链下载,首先在浏览页面的时候,会向客户端发送一个特别的Cookie,例如“Site=etiantian.org”,盗链而来的将没有这个Cookie。
1、配置Cookie和rewrite实现Apache防盗链下载
在主配置文件httpd.conf或者在虚拟主机httpd-vhosts.conf中配置如下:
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*(?:Site=etiantian.org).*$
#对于Cookie里面没有特殊记录的请求进行重定向到错误页面
RewriteRule ^.*$/error.html #将非法访问重定向到错误页面
说明:这样如果一个盗链而来的请求将会因为役有特殊Cookie而被重定向到错误页面.就算实际地址暴露也不怕。至于这个cookie的内容是什么以及有效时间完全可以由管理员自己来设定,也就是说下载工具也没法伪造,从而防止了服务器资源被盗链的危险。
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
# prefork MPM
# StartServers︰ 数目服务器进程启动
# MinSpareServers︰ 服务器进程处于空闲的最小数目
# MaxSpareServers︰ 服务器进程处于空闲的最大数目
# MaxClients︰ 最大服务器进程数允许启动
# 每︰ 最大服务的请求数服务器进程
# 工人 MPM # StartServers︰ 初始服务器进程启动
# MaxClients 数︰ 最大并发客户端连接数
# MinSpareThreads︰ 工作线程处于空闲
# MaxSpareThreads 的最小数目︰ 工作线程处于空闲
# 线程最大数目︰ 数量恒定的工作线程在每个服务器处理
# 每︰ 服务器进程服务的请求的最大数目