11.fastcgi相关参数调优(配合PHP引擎动态服务)
fastcgi参数是配合Nginx向后请求PHP动态引擎服务的相关参数,要想较好的理解相关的参数细节,需要对前面章节介绍的Nginx Fastcgi客户端配合php-fpm(fastcgi服务端)的原理十分熟悉,具体的逻辑图
此处讲解的参数均为Nginx Fastcgi客户端向后请求PHP动态引擎服务(php-fpm(fastcgi服务端))的相关参数,属于Nginx的配置参数。Nginx Fastcgi常见参数的说明。
Nginx Fastcgi常见参数列表说明:
Nginx Fastcgi 相关参数 说明 fastcgi_connect_timeout 表示Nginx服务器和后端FastCGI服务器连接的超时时间,默认值
为60s,这个参数值通常不要超过75s,因为建立的连接越多消耗的
资源就越多
fastcgi_send_timeout 设置Nginx允许FastCGI服务端返回数据的超时时间,即在规定时间
之内后端服务器必须传完所有的数据,否则,Nginx将断开这个连接,
默认值为60s
fastcgi_read_timeout 设置Nginx从FastCGI服务端读取响应信息的超时时间,表示连接
建立成功后,Nginx等待后端服务器的响应时间,是Nginx已经进入
后端的排队之中等待处理的时间。
fastcgi_buffer_size 这是Nginx fastcgi的缓冲区大小参数,设定用来读取从Fastcgi服务
端收到的第一部分响应信息的缓冲区大小,这里的第一部分通常会
包含一个小的响应头部,默认情况,这个参数的大小是由
fastcgi_buffers指定的一个缓冲区的大小
fastcgi_buffers 设定用来读取从FastCGI服务端收到响应信息的缓冲区大小以及
缓冲区数量.默认值fastcgi_buffers 8 4k|8k;
指定本地需要多少和多大的缓冲区来缓冲FastCGI的应答请求。
如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个
64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的
部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为
内存中数据处理速度要快于硬盘。一般这个值应该为站点中PHP
脚本所产生的页面大小的中间值,如果站点中PHP脚本所产生的页面
大小为256K,那么可以把这个值设置为"1616k","464k"等。
fastcgi_busy_buffers_size 用于设置系统很忙时可以使用的fastcgi_buffers大小,官方推荐的
大小为fastcgi_buffers*2
默认值fastcgi_busy_buffers_size 8k|16k;
fastcgi_temp_file_write_size fastcti临时文件的大小,可设置128-256k
fastcgi_cache_oldbly_nginx 表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可
以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也
可能会引起其它问题,要根据具体情况选择
fastcgi_cache_path 示例: fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2
keys_zone=ngx_fcgi_cache:512min active=1d max_size=40g;
fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成
256*256个子目录,keys_zone是这个缓存空间的名字,cache是用
多少内存(这样热门的内容nginx直接放内存,提高访问速度),
inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要
注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到
fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后
可以在不同的分区,不过还是建议放同一分区
fastcgi_cache_valid 示例:fastcgi_cache_valid 200 302 1h
用来指定应答代码的缓存时间,实例中的值将200和302应答缓存
一个小时
示例: fastcgi_cache_valid 301 1d; #将301应答缓存1天
示例: fastcgi_cache_valid any 1m#其他应答缓存1分钟
fastcgi_cache_min_uses 示例:fastcgi_cache_min_uses 1;
设置请求几次之后响应被缓存 fastcgi_cache_use_stale 示例: fastcgi_cache_use_stale error timeout invalid_header
http_500; #定义哪些情况下用过期缓存
fastcgi_cache_key 示例: fastcgi_cache_key $request_method://$host$request_uri;
fastcgi_cache_key http://$host$request_uri;
定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,
Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,
Nginx会从后往前取相应的位数做为目录。注意一定要加上
$request_method做为cache key,否则如果HEAD类型的先请求会
导致后面的GET请求返回为空
http标签参数
12.配置Nginx gzip压缩实现性能优化
12.1 Nginx gzip压缩模块提供了压缩文件内容的功能, 用户请求的内容在发送出用户客户端之前,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快了数据传输效率,提升了用户访问体验
12.2 Nginx gzip压缩的优点
提升网站用户体验: 由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验提升了,网站口碑就好了。
节约网站带宽成本:由于数据是压缩传输的,因此,此举节省了网站的带宽流量成本,不过压缩时会稍微消耗一些CPU资源,这个一般可以忽略
12.3 需要和不需要压缩的对象
纯文本内容压缩比很高,因此,纯文本的内容最好要压缩,例如:html, js, css, xml,shtml等格式的文件
被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩可能反而变大
图片,视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU,内存资源
12.4参数介绍及配置说明
此压缩功能很类似早期Apache服务的mod_defalte压缩功能,Nginx的gzip压缩功能依赖与
ngx_http_module模块,默认已安装
对应的压缩参数说明如下:
#压缩配置
gzip on; #<== 开启gzip压缩功能
gzip_min_length 1k; #<== 设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K。如果小于1k
可能会越压缩越大
gzip_buffers 4 16k;
#<== 压缩缓存区大小.表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1; #<== 压缩版本(默认1.1,前端squid2.5时使用1.0)用于设置识别HTTP协议版本,默认时1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 2;
#<==压缩比例.用来指定GZIP压缩比, 1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源
gzip_types text/plain application/x-javascript text/css application/xml
#<==用来指定压缩的类型,“text/html”类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型
gzip_vary on;
#<==vary header支持。该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据
完整的配置如下:
gzip on;
gzip_min_length 1K;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
不同的Nginx版本中,gzip_types的配置可能会不同,上述配置示例适合nginx 1.6.3对应的文件类型查看安装目录下的mime.types文件
13.配置Nginx expires缓存实现性能优化
13.1 Nginx expires功能介绍
简单地说,Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除为止。
深入一点理解,expires的功能就是允许通过Nginx配置文件控制HTTP的"Expires"和"Cache-Control"响应头部内容,告诉客户端浏览器是否缓存和缓存多久以内的内容。这个expires模块控制Nginx服务器应答时的Expires头内容和Cache-Control头的max-age指令。缓存的有效期可以设置为相对源文件的最后修改时刻或者客户端的访问时刻
这些HTTP头向客户端表名了内容的有效性和持久性。如果客户端本地有内容,则内容就可以从缓存(除非已经过期)而不是从服务器读取,然后客户端会检查缓存中的副本,看看是否过期或者失败,以决定是否重新从服务器获取内容更新.
13.2 Nginx expires作用介绍
在网站的开发和运营中,对于视频,图片,css,js等网站元素的更改机会较少,特别是图片,这时可以将图片设置在客户浏览器本地缓存365天或3650天,而将CSS,JS,html等代码缓存10~30天,这样用户第一次打开页面后,会在本地浏览器按照过期日期缓存相应的内容,下次用户再打开类似的页面,重复的元素就无需下载了,从而加快了用户访问速度,由于用户的访问请求和数据减少了,因此节省了服务器端大量的带宽。此功能通Apache的expires
13.4 Nginx expires配置详解
前面已经介绍了expires的功能原理,接下来就来配置Nginx expires的功能,这里以location标签为例进行讲解,通过location URI规则将需要缓存的扩展名列出来,然后指定缓存时间,如果针对所有内容设置缓存,也可以不同location。Nginx默认安装了expires功能
1) 根据文件扩展名进行判断,添加expires功能示例
范例1:
location ~ .*\.(gif | jpg | jpeg | png | bmp | swf)$
{
expires 3650d;
}
该范例的意思是当用户网站 URL 结尾的文件扩展名为上述指定的各种类型的图片时,设置缓存3650天,即10年。
范例2:
location ~.*\.(js | css)$
{
expires 30d;
}
特别注意,location内容一般放到虚拟主机配置中,即server标签中。
2)根据URI中的路径(目录)进行判断,添加expires功能范例,添加expires功能范例
范例3:
location ~ ^/(images|javascript|js|css|flash|media|static) / {
expires 360d;
}
该范例的意思是当用户访问网站URI中包含上述路径(例:images,js,css,这些在服务器端是程序目录)时,把访问的内容设置缓存356天,即1年
3)单个文件添加expires功能的范例
下面的命令会给robots.txt机器人文件设置过期时间(这里为7天),在这7天不记录404错误日志
location ~(robots.txt) {
expires 7d;
break;
}
13.5 Nginx expire功能缺点及解决方法
当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?解决办法如下。
第一:对于经常需要变动的图片等文件,可以缩短对象缓存时间,例如:例如经常变动的只缓存1天
第二:当网站改版或更新内容时,可以在服务器将缓存的对象改名
13.6企业网站可能不希望被缓存的内容
广告图片,用于广告服务,都缓存了就不好控制展示了
网站流量统计工具(js代码),都缓存了流量统计就不准了
更新很频繁的文件(google的logo),这个如果按天,缓存效果还是很显著的