1.查看并启用mod_deflate ,压缩传输
查看mod_deflate:
[root@http ~]# apachectl -M | grep deflate
如果有显示,则表示已启用压缩;如果没有显示,则需要手动启动deflate模块:
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
定位并去除"#"
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
查看
[root@http ~]# apachectl -M |grep deflate
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.1.20. Set the 'ServerName' directive globally to suppress this message
deflate_module (shared)
mod_deflate:是压缩模块,就是对要传输到客户端的代码进行gzip压缩;mod_headers:告诉浏览器页面使用了gzip压缩,如果不开启,浏览器就会对gzip压缩过的页面进行下载,而无法正常显示。
2.在httpd.conf配置文件末尾,添加deflate参数配置
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
末尾添加:
<IfModule mod_deflate.c>
DeflateCompressionLevel 6
SetOutputFilter DEFLATE
#AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
#AddOutputFilterByType DEFLATE image/*
AddOutputFilterByType DEFLATE text/*
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
</IfModule>
参数解释:
DeflateCompressionLevel 9 #压缩程度的等级,预设可以采用6,以维持耗用处理器效能与网页压缩质量的平衡。
SetOutputFilter DEFLATE #设置输出过滤器,对输出启用压缩,必须的,就像一个开关一样,告诉apache对传输到浏览器的内容进行压缩。
AddOutputFilterByType DEFLATE text/* #设置对文件是文本的内容进行压缩,例如text/html text/css text/plain 等。
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript #对javascript文件进行压缩。
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #对php类型的文件进行压缩。
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 #同上就是设置不对pdf,avi,mp3等的文件进行压缩。
3.重启服务
[root@httpd ~]# systemctl restart httpd
这个是非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。
这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。
在http的终端上进行操作
1.修改网站配置文件,启动expires模块
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
定位并去除“#”号:
LoadModule expires_module modules/mod_expires.so
2.在配置文件末尾添加,expires配置参数
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
<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 minute"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minute"
</IfModule>
相关参数详解
ExpiresDefault和ExpiresByType指令同样能够用易懂的语法格式进行定义:
ExpiresDefault " [plus] {}"
ExpiresByType type/encoding " [plus] {}"
其中<base>是下列之一:
• access
• now (等价于'access')
• modification
[plus]关键字是可选的。
<num>必须是整数
<type>是下列之一:
• years
• months
• weeks
• days
• hours
• minutes
• seconds
例如:下列3个指令都表示文档默认的有效期是一个月
ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"
而且有效期可以通过增加"num"/"type"子句进一步调整
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"
注意,如果你使用基于最后修改日期的设置,"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
</IfModule>
"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。后面的时间则以秒计算。
3.重启服务
[root@http ~]# systemctl restart httpd
将Options Indexes FollowSymLinks中的Indexes去掉,就可以禁止Apache显示该目录结构。
Indexes的作用就是当该目录下没有index.html文件时,就显示目录结构。
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
定位:
Options Indexes FollowSymLinks
去除Indexes
重启服务
[root@http ~]# systemctl restart httpd
1.主配置文件启用httpd-default.conf
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
定位并去除“#”号:
Include conf/extra/httpd-default.conf
2.修改httpd-default.conf配置
[root@http ~]# vim /usr/local/httpd/conf/extra/httpd-default.conf
修改:
ServerTokens Prod
ServerSignature Off
3.重启httpd服务
[root@http ~]# systemctl restart httpd
如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行重新编译了。在重新编译时,修改源码包下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 #
随着网站的访问越来越大,WebServer产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如Apache的日志)整个删除,这样也丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,因此管理好这些海量的日志对网站的意义是很大的。
1.禁止默认日志保存配置
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
定位并禁用:
#ErrorLog "logs/error_log"
#CustomLog "logs/access_log" common
添加的轮替策略:
ErrorLog "|/usr/local/httpd/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/httpd/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
注:其中 86400 为轮转的时间单位为秒
2.重启服务
[root@http ~]# systemctl restart httpd
注意:
系统日志及系统服务日志,由专门日志轮替配置服务管理
配置文件为:/etc/logrotate.conf
扩展:
1.这个保证了每天一个文件夹,文件夹下每个小时产生一个log
CustomLog "|/usr/local/sbin/cronolog logs/%Y%m%d/access_log.%H" combined
2.按天轮询(生产环境常见用法,推荐使用):
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined
3.按小时轮询(生产环境较常见用法):
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d%H.log" combined
有时你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。举个例子:比如你搭了个discuz论坛,里面有些热点图片、视频;然后别人将他网站上访问
图片的地址重定向到你的discuz上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的却是你服务器的资源;解决这个问题的方法是配置下防盗链,让外来的盗不了链。
1.主配置文件启用rewrite模块
[root@http ~]# vim /usr/local/httpd/conf/httpd.conf
定位并去除"#"
LoadModule rewrite_module modules/mod_rewrite.so
2.打开虚拟主机配置文件
[root@http ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
在<VirtualHost>内部添加:
RewriteEngine On
RewriteCond %{
HTTP_REFERER} !^$
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/about/nolink.png[R,NC,L]
相关选项的解释
1.RewriteEngine On #启用rewrite,要想rewrite起作用,必须要写上.
2.RewriteCond test-string condPattern #写在RewriteRule之前,可以有一或N条,用于测试rewrite的匹配条件,具体怎么写,后面会详细说到。
3.RewriteRule Pattern Substitution #规则
4.%{
HTTP_REFERER}:服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
5.[NC]指的是不区分大小写,[R]强制重定向 redirect
6.字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
注:
RewriteCond %{
HTTP_REFERER} !^$
上面这一行意在允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。
RewriteCond %{
HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{
HTTP_REFERER} !www\.benet\.com/.*$ [NC]
设置允许访问的HTTP来源,包括网站自身。
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]
将不满足referer条件的访问重定向至nolink.png。nolink.png位于允许“盗链”的目录about中,要相当注意,不然,警告信息和图片将无法在对方网站上显示。
注意:测试时要清除济浏览器缓存.
防盗链配置的说明:
1.表示自己的信任站点。设置为:http://www.benet.com和http://benet.com
2.(gif|jpg|swf):要保护文件的扩展名(以|分开)。以这些为扩展名的文件,必须通过信任的站点网址引用,才可以访问。
3.http://www.benet.com/about/nolink.png:定义被盗链时替代的图片,让所有盗链jpg、gif、swf等文件的网页,显示网页文档根目录下的about/nolink.png文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:
RewriteRule .*\.(gif|jpg|png)$ - [F]
注:[F](强制URL为被禁止的forbidden),强制当前URL为被禁止的,即立即反馈一个HTTP响应代码403(被禁止的)。
3.重启httpd服务
[root@http ~]# systemctl restart httpd
可以使用另一方式实现防盗链 referer
注:Referer:指明了请求当前资源原始资源的URL,使用referer是可以防盗链,然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
[root@http ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "^http://www.benet.com/.*$" local_ref
SetEnvIfNoCase Referer "^http://benet.com/.*$" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif|png)">
#2.4版本以下的:
方法1:
Order Deny,Allow
Allow from env=local_ref
Deny from all
方法2:
Order Allow,Deny
Allow from env=local_ref
#2.4版本以上的方法如下:
Require all denied
Require env local_ref
</filesmatch>
php的工作模式:
php在lamp环境下共有三种工作模式:CGI模式、apache模块、FastCGI模式。CGI模式下运行 PHP,性能不是很好。作为apache的模块方式运行,相信大家都了解了。FastCGI的方式和apache模块的不同点在于:FastCGI方式PHP是一处独立的进程,所有PHP子进程都由PHP的一个叫作php-fpm的组件负责管理;而apache模块化方式运行的PHP,则是apache负责调用PHP完成工作。PHP的FastCGI方式性能要比apache模块化方式强很多,今天我们以FastCGI方式编译安装lamp为例。
FastCGI工作机制:
首先客户端发起请求,请求分为2种,一种是静态请求它可以直接由Apache直接响应返回;另一种是动态的请求,如其中包含中php或者Perl这种脚本解释性语言,则由Apache服务器通过fastcgi协议调用php服务器执行并返回给Apache由Apache返回解释执行后的结果,如果这个过程中涉及到对数据的操作,此时php服务器还会通过mysql协议调用mysql服务器。
1.上传或下载xcache安装包
网上下载:
wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz
上传的包:
xcache-3.2.0.tar.gz
2.安装xcache
[root@php ~]# tar zxf xcache-3.2.0.tar.gz
[root@php ~]# yum -y install autoconf
[root@php ~]# cd xcache-3.2.0/
[root@php xcache-3.2.0]# /usr/local/php5.6/bin/phpize // 用phpize生成configure配置文件
[root@php xcache-3.2.0]# ./configure --enable-xcache --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config
[root@php xcache-3.2.0]# make && make install
安装完成之后,在extensions后面会出现一个路径,记住它,后面会用到。
3.创建缓存文件并赋权
[root@php xcache-3.2.0]# touch /tmp/xcache
[root@php xcache-3.2.0]# chmod 777 /tmp/xcache
4.复制xcache网站目录到php(192.168.1.22)和httpd(192.168.1.20)网站根目录下
[root@php xcache-3.2.0]# cp -r htdocs/ /var/www/benet/xcache
[root@php xcache-3.2.0]# scp -rp /var/www/benet/xcache/ [email protected]:/var/www/benet/
5.修改php配置文件,添加xcache参数,重启php-fpm
[root@php ~]# vim /etc/php.ini
添加到末尾:
[xcache-common]
extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so //把xcache.so前的路径换成自己make install的最后一行路径
[xcache.admin]
xcache.admin.enable_auth = Off
[xcache]
xcache.shm_scheme ="mmap"
xcache.size=60M
xcache.count =1
xcache.slots =8K
xcache.ttl=0
xcache.gc_interval =0
xcache.var_size=64M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_ttl=0
xcache.var_maxttl=0
xcache.var_gc_interval =300
xcache.test =Off
xcache.readonly_protection = Off
xcache.mmap_path ="/tmp/xcache"
xcache.coredump_directory =""
xcache.cacher =On
xcache.stat=On
xcache.optimizer =Off
[xcache.coverager]
xcache.coverager =On
xcache.coveragedump_directory =""
6.重启PHP服务
[root@php ~]# systemctl restart php-fpm
7.访问httpd的xcache虚拟目录,验证(ab压力测试后)
http://192.168.1.20/xcache
8.ab压力测试
[root@php ~]# yum -y install httpd-tools
[root@php ~]# ab -c 160 -n 1000 http://192.168.1.20/index.php
参数
-n:在测试会话中所执行的请求个数(即总请求数)。
-c:一次产生的请求个数(即并发用户数)。