Apache网站优化

网站优化

  • 优化启用网站压缩deflate
  • 优化启用网站缓存expires
  • 禁止网站目录遍历
  • apache隐藏版本号
  • 配置httpd日志轮替切割
  • 配置防盗链
  • php服务器上安装xcache缓存

因为采用的是分布式安装,所以需要对http端和php端进行相关的优化,以便提高访问速度。

优化启用网站压缩deflate

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

优化启用网站缓存expires

这个是非常有用的优化,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

apache隐藏版本号

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  #

配置httpd日志轮替切割

随着网站的访问越来越大,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服务器上安装xcache缓存

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服务器。

Apache网站优化_第1张图片
在php服务器上安装xcache缓存,提高网站访问速度

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:一次产生的请求个数(即并发用户数)。

你可能感兴趣的:(架构,apache)