网站架构优化部分
网站性能角度
fastcgi的原理图:
PHP服务优化缓存数据
1) FastCGI相关参数调优 (web + php)
fastcgi_connect_timeout 30s; --- web服务和php程序维持会话超时时间
fastcgi_send_timeout 15s; --- web服务向后端发送数据间隔超时时间
fastcgi_read_timeout 15s; --- web服务接收后端数据间隔超时时间
fastcgi_buffer_size 64k; --- 缓冲写入HTTP头部信息的大小
fastcgi_buffers 4 64k; --- 缓冲写入HTTP主体部分大小信息
fastcgi_busy_buffers_size 128k; --- 繁忙时缓冲写入数据大小信息 建议是fastcgi_buffers*2
fastcgi_temp_file_write_size 128k; --- 当缓冲区大小不够用时,临时使用指定目录存储缓冲数据(实际把数据存储到硬盘中)
#fastcgi_temp_path /data/ngx_fcgi_tmp; --- 临时存储目录信息
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
--- 定义缓存区路径信息
fastcgi_cache ngx_fcgi_cache; --- 开启缓存功能
fastcgi_cache_valid 200 302 1h; --- 缓存的有效期
fastcgi_cache_min_uses 1; --- 访问几次之后进行缓存
fastcgi_cache_use_stale error timeout invalid_header http_500;
--- 什么情况使用过期缓存信息
fastcgi_cache_key http://$host$request_uri; --- 指定生成缓存文件key值依据
问题:
如果用户第一次写入数据时,是在web01 那么他会写入内存中缓冲
如果第二次时,关闭web01,再次访问时到达了web02 那么服务器的缓存中那个缓冲的刚才第一次访问时提交的数据吗
真是的数据还是写入到后端磁盘中的,那么缓冲中是什么数据?
是响应的数据,用户再次访问时,会响应缓冲中的数据(如果是访问上次缓冲的数据的话)
浏览本地缓存配置(nginx expires缓存实现性能优化 )
浏览器缓存的说明
网站缓存资源知识说明_《缓存对于web开发有什么重要作用》
============================================================================================================================
【前言介绍】
缓存对于开发有重要作用,尤其是大负荷web系统开发中。
【缓存分类】
缓存分很多种:服务器缓存,第三方缓存,浏览器缓存等。
其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源。
让浏览器做缓存需要给浏览器发送指定的头,告诉浏览器缓存多长时间,或者坚决不要缓存。
【详细说明】
在HTTP协议报文中,是有相应字段表示缓存信息的。
1. Expires(过期时间) HTTP头信息Expires(过期时间)
此属性是HTTP控制缓存的基本手段
这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修改。
几乎所有的缓存服务器都支持Expires(过期时间)属性;
大部分Web服务器支持几种方式设置Expires属性;
· 可以设计一个绝对时间间隔:基于客户最后查看副本的时间(最后访问时间)
· 可以根据服务器上文档最后被修改的时间;
Expires 头信息:
对于设置静态图片文件(例如导航栏和图片按钮)可缓存特别有用;因为这些图片修改很少,可以给它们设置一个特别长的过期时间,
会使你的网站对用户变得相应非常快;他们对于控制有规律改变的网页也很有用。
例如:
你每天早上6点更新新闻页,你可以设置副本的过期时间也是这个时间,这样缓存服务器就知道什么时候去取一个更新版本,而不必让用户去按浏览器的刷新按钮。
过期时间头信息属性值只能是HTTP格式的日期时间,其他的都会被解析成当前时间"之前",副本会过。
记住:HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。
举例:Expires: Fri, 30 Oct 1998 14:19:41
所以使用过期时间属性一定要确认你的Web服务器时间设置正确,一个途径是通过网络时间同步协议(Network Time Protocol NTP)
虽然过期时间属性非常有用,但是它还是有些局限,
01. 是牵扯到了日期,这样Web服务器的时间和缓存服务器的时间必须是同步的,如果有些不同步,要么是应该缓存的内容提前过期了,要么是过期结果没及时更新。
02. 还有一个过期时间设置的问题也不容忽视:如果你设置的过期时间是一个固定的时间,如果你返回内容的时候又没有连带更新下次过期的时间,
那么之后所有访问请求都会被发送给源Web服务器,反而增加了负载和响应时间;
设置浏览器缓存期限信息
2. Cache-Control(缓存控制) HTTP头信息</strong></h3>
HTTP 1.1介绍了另外一组头信息属性:Cache-Control响应头信息,让网站的发布者可以更全面的控制他们的内容,并定位过期时间的限制。
有用的 Cache-Control响应头信息包括:
· max-age=[秒]
执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间。
[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。
· s-maxage=[秒]
类似于max-age属性,除了他应用于共享(如:代理服务器)缓存。
· public
标记认证内容也可以被缓存,一般来说经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
· no-cache
强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。
这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处)
· no-store
强制缓存在任何情况下都不要保留任何副本
· must-revalidate
告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,你高速缓存,你希望严格的遵循你的规则。
· proxy-revalidate
和must-revalidate类似,除了他只对缓存代理服务器起作用
举例: Cache-Control: max-age=3600, must-revalidat
给静态资源(HTML文件,图片文件等)的Repsone加上Expires/Cache-Control Header是很有效的一招。
如果HTTP Response中有Expires这样的Header的话,浏览器会Cache这个资源,理想状况下(注意,只是理想状况),
在Expire Date之前,不会再发HTTP请求给Server要这个资源,不过Expires的值只能是一个固定日期,比如 Thu 27 Nov 2008 07:00:00 GMT
不能是一个类似"从现在开始之后10年"这样一个随机浮动的值,如果要这样的效果,可以用Cache-Control这样的Header,
如果HTTP Response中有这样的Header:Cache-Control: max-age = 100,表示这个资源在cache中的最大寿命是100秒。
一般说来这种静态文件永远不应该过期,如果真的要给这个Cache加上一个期限,那我希望是一万年,Cache-Control: max-age = 31536000000
其实就应该给Expires设一个永远不会过期的时间,比如你现在有一个文件叫logo.gif,需要用一个新的logo的时候,你不要去覆盖原来的文件,
而把新的logo存成logo_v2.gif,让相关网页引用新的logo_v2.gif,这样可以让新老网页同时工作,实在犯不上为了节省存储空间覆盖原有文件。
对Apache服务器,使用mod_expires,在httpd.conf或者.htaccess中加上</p>
< FilesMatch "\\.(ico|gif|jpg|html)$“> ExpiresDefault "access plus 10 years"</FileMatch>
3. Last-Modified/If-Modified-Since
有些数据随时都在变化。
CNN.com的主页经常几分钟就更新。
Google.com的主页几个星期才更新一次 (当他们上传特殊的假日logo,或为一个新服务作广告时)。
Web服务是不变的:通常服务器知道你所请求的数据的最后修改时间,并且HTTP为服务器提供了一种将最近修改数据连同你请求的数据一同发送的方法。
如果你第二次 (或第三次,或第四次) 请求相同的数据,你可以告诉服务器你上一次获得的最后修改日期:
在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。
如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着从上一次请求后这个数据没有改变。
这一点有何进步呢?当服务器发送状态编码 304 时,不再重新发送数据。您仅仅获得了这个状态代码。
所以当数据没有更新时,你不需要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。
所有现代的浏览器都支持最近修改 (last-modified) 的数据检查。
如果你曾经访问过某页,一天后重新访问相同的页时发现它没有变化,并奇怪第二次访问时页面加载得如此之快,这就是原因所在。
你的浏览器首次访问时会在本地缓存页面内容,当你第二次访问,浏览器自动发送首次访问时从服务器获得的最近修改日期。
服务器简单地返回 304: Not Modified (没有修改),因此浏览器就会知道从本地缓存加载页面。在这一点上,Web服务也如此智能。
4. ETag/If-None-Match</strong></h3>
ETag是实现与最近修改数据检查同样的功能的另一种方法:没有变化时不重新下载数据。
其工作方式是:服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中给出)。hash 的确定完全取决于服务器。
当第二次请求相同的数据时,你需要在 If-None-Match: 头信息中包含 ETag hash,如果数据没有改变,服务器将返回 304 状态代码。
与最近修改数据检查相同,服务器仅仅发送304状态代码;第二次将不为你发送相同的数据。
在第二次请求时,通过包含 ETag hash,你告诉服务器:如果 hash 仍旧匹配就没有必要重新发送相同的数据,因为你还有上一次访问过的数据。
这几个http头可以作为meta标签发送到客户端,但是需要注意的是Http头中的设置优先级更高一些,
例如:
<meta. http-equiv=”Expires” CONTENT=” Fri, 30 Oct 1998 14:19:41″>
<meta. http-equiv=”Cache-Control” CONTENT=”no-cache”>
【知识总结】
· Expires/Cache-Control Header
是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。
只是Cache-Control比Expires可以控制的多一些,而且Cache-Control会重写Expires的规则。
· Last-Modified/If-Modified-Since和ETag/If-None-Match
是浏览器发送请求到服务器后判断文件是否已经修改过,如果没有修改过就只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;
如果修改过那就整个数据重新发给浏览器。
2)浏览器本地如何进行缓存配置
配置过程:
Syntax: expires [modified] time;
expires epoch | max | off;
Default: expires off;
Context: http, server, location, if in location
web网站环境
第一个里程:创建站点目录与首页文件
mkdir -p /html/expire/
vim index.html
<html>
<meta charset="utf-8">
<head>
<title>老男孩教育69期最牛</title>
</head>
<body>
老男孩教育69
<table border=1>
<tr> <td>01</td> <td> </td>oldboy69</tr>
</table>
<a href="http://blog.oldboyedu.com">
<img src="oldboy.jpg" />
</a>
</body>
</html>
第二个里程:编写扩展配置文件
server {
listen 80;
server_name test.oldboy.com;
root /html/expire/;
index index.html;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 1d;
}
}
配置文件:配置365天的时间,使用location进行匹配图片格式,因为我这里是jpg所以就写了一个
缓存一年的配置(其实是为了好看一些现象,没有说是配置一年的缓存)
配置注意项:
1) 对于经常需要变动的图片等文件,可以缩短对象缓存时间
2) 当网站改版或更新时,可以在服务器将缓存的对象改名
域名解析出现问题,还没有解决。
解决了:原因是因为nat模式的dns首选项和linux设置的不一样,修改为一样的即可。
但是有些诡异,因为一开始没有什么问题,后来才出现的问题。导致我很郁闷这个问题。很久才解决。
网站压缩处理 节省网站带宽
- 网站数据压缩处理方法
gzip on | off;
#<- 是否开启gzip压缩功能,默认是关闭的。
gzip_min_length 1k;
#<- 设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是20。
建议设置成大于1K,如果小于1K可能会越压越大。
gzip_buffers 32 4k | 16 8k;
#<- 压缩缓冲区大小。表示申请多少个单位为,每个单多大的内存作为压缩缓冲。
默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;
#<- 压缩数据的协议版本(前端为squid2.5时使用1.0),用于设置识别HTTP协议版本,默认是1.1,
目前大部分浏览器已经支持GZIP解压,使用默认即可。
gzip_comp_level 6;
#<- 压缩级别信息。用来指定gzip压缩比率。默认压缩级别为1
1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。
gzip_types text/plain application/x-javascript text/css application/xml;
#<- 用来指定压缩的类型,“text/html”类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。
可以根据MIME媒体资源类型文件进行指定调整。
gzip_disable
#<- 根据请求UA信息(可以是正则匹配的),禁止使用gzip压缩功能。
gzip_proxied
#<- 根据响应给代理服务器的信息,决定在响应代理服务器时,是否需要进行压缩数据
默认在响应代理服务器时是不做压缩处理的。
gzip_vary on;
#<- 是否告知响应的客户端数据已经进行压缩,显示压缩数据提示字段 Vary:Accept-Encoding
默认是关闭不提示客户端的。
注意:是在缓冲中读取,我感觉应该是在缓存中读取压缩的数据,但是是在缓冲的读取。
实际配置
gzip on;
gzip_min_length 1k;
gzip_buffers 32 4k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/css text/xml application/javascripts;
gzip_proxied any;
不要做压缩处理数据:
1)小文件数据 建议小于1K就不要压缩处理
2)图片或者视频流媒体信息,不要做压缩处理
不要压缩这些资源类型的原因
要注意:需要和不需要压缩的对象
(1)大于1k的纯文本文件html,js,css,xml,html.
(2)图片,视频等不要压缩,因为不但不会减小,在压缩时消耗cpu和内存资源。
网站管理优化有关
1)日志轮询切割管理
方法一:利用脚本进行切割日志
[root@oldboy ~]# mkdir /server/scripts/ -p
[root@oldboy ~]# cd /server/scripts/
[root@oldboy scripts]# vim cut_nginx_log.sh
cd /application/nginx/logs &&\ /bin/mv www_access.log www_access_$(date +%F -d -1day).log #<==将日志按日期改成前一天的名称
/application/nginx/sbin/nginx -s reload #<==重新加载 nginx 使得触发重新生成访问日志文件
提示:实质上脚本的功能很简单,就是日志改名,然后加载nginx,重新生成文件记录日志
方式二:系统默认logrotate实现日志切割管理功能
[root@web01 logrotate.d]# cat nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
方法二:系统默认logrotate实现日志切割功能
/var/log/nginx/*.log {
daily <-- 按天进行日志切割
missingok
rotate 52 <-- 定义保留多少个切割后的日志 7~15天
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
2)日志信息不要进行记录
负载均衡对后端节点进行健康检查时,产生日志信息可以不用进行记录
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
3)访问日志的权限设置
假如日志目录为app/logs,则授权方法如下:
chown -R root.root /app/logs
chmod -R 700 /app/logs
网站安全管理优化
1)扩展名限制程序和文件访问
location ~ ^/images/.*\.(php|php5|sh|pl|py)$
{
deny all;
}
location ~ ^/static/.*\.(php|php5|sh|pl|py)$
{
deny all;
}
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
{
deny all;
}
2)禁止访问指定目录下的所有文件和目录
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
3)限制服务器地址被非法解析
server {
listen 80;
server_name _;
#rewrite ^(.*) http://blog.oldboy.com/$1 permanent;
return 200 "网站页面被非法解析了";
}
4)防盗链解决方案
如何进行网站倒链操作
web01 正常网站 www.oldboy.com
oldboy.jpg 被盗资源
web02 盗链网站 www.daolian.com
第一个里程:编写配置文件
server {
listen 80;
server_name www.daolian.com;
root /html/daolian;
index index.html;
}
第二里程:创建站点目录及代码文件
编写代码信息
<html>
<head>
<title>老男孩教育</title>
</head>
<body bgcolor=green>
老男孩的博客!
<br>我的博客是
<a href="http://oldboy.blog.51cto.com" target="_blank">博客地址 </a>
<img src="http://www.oldboy.com/oldboy.jpg">
</body>
</html>
如何进行防盗链操作
1)根据HTTP referer实现防盗链
第一个里程:编写nginx配置文件
location ~* \.(jpg|gif|mp4|wmv)$ {
valid_referers none blocked *.oldboy.com; 定义有效referer
if ($invalid_referer) {
rewrite ^/ http://www.oldboy.com/nolink.png;
}
}
2)根据cookie进行防盗链,代码层次(属于开发人员管理)
根据cookie信息识别访问者是否真正浏览客户端
3)通过加密变换访问路径实现防盗链 淘宝/jd
实质是将盗链资源名称进行 随机变化,使盗链代码信息需要经常变化,增加盗链难度。
<php
$secret = "oldboy"; // 加密字符串,必须和lighttpd.conf里的保持一致
$uri_prefix = "/mp4/"; // 虚拟的路径、前缀,必须和lighttpd.conf里的保持一致
$file = "/test.mp4"; // 实际文件名,必须加"/"斜杠
$timestamp = time(); // current timestamp
$t_hex = sprintf("%08x",$timestamp);
$m = md5($secret.$file.$t_hex);
printf('%s',$uri_prefix,$m,$t_hex,$file,$file);//生成url地址串
?>
扩展:
ngx_http_secure_link_module 指定uri信息进行加密处理
4)将计就计方式:给尽可能被盗取资源加上底纹或logo信息
5)合理设置规划网站目录权限信息
上传数据服务 上传数据目录 设置为 web用户管理
静态解析服务 站点目录和数据权限 root f 644 目录 755
动态解析服务 站点目录和数据权限 root f 644 目录 755
6)防爬虫设置方法
小说互联网公司:进行爬虫 将别的小说网站小说页面资源进行爬取
电商公司 :进行爬虫 做比价操作
搜索引擎网站 :正常需求
如何进行防爬虫处理:
1) 君子协定
robots.txt机器人协议介绍
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
Disallow: /pinpai/*.html?*
User-agent: EtaoSpider
Disallow: /
User-agent: HuihuiSpider
Disallow: /
User-agent: GwdangSpider
Disallow: /
User-agent: WochachaSpider
Disallow: /
2) nginx配置文件中实现防爬虫处理 运维关注
location ~* \.(jpg|gif|mp4|wmv)$ {
if ($http_user_agent ~* LWP::Simple|BBBike|wget|EtaoSpider)
{
return 403;
}
}
-
设置网站登录访问功能
只有登录成功,才能访问页面信息 -
设置登录验证码信息|滑动验证 (python可以实现不用人工操作)
-
12306防爬手段 (根据提示点击图片上的形状–必须认为操作)