墨氺 2019-04-16
Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于对FastCGI的动态程序进行缓存。但是大多数同学存在对proxy_cache比较熟悉,对fastcgi_cache相对陌生的情况。但事实是Fastcgi参数的优化在很大程度上提高了整个应用系统的性能。今天小编帮助大家打破“陌生”,一起探索Ngnix中的Fastcgi参数性能优化~
FastCGI,全称快速通用网关接口(FastCommonGatewayInterface),可以看作是常驻型的CGI,执行速度更快。由于服务器不能直接运行php、asp等文件,因此需要引入一个第三方程序,并和它有个约定:我把请求参数发送给你,然后我接收你的处理结果再给客户端,这就是CGI。
Nginx的Fastcgi cache是用来缓存用户请求,当用户下次再进行同样的访问的时候直接将缓存结果返回给用户,避免了Nginx再向上游请求结果的过程,使服务性能大幅度提升,如果服务是静态可缓存的话使用这个模块能够明显缩短用户请求时间同时节省服务器资源,大大提升服务的QPS。
Fastcgi缓存的优缺点
通过缓存php、asp生成的动态内容,来减少了nginx与php、asp的通信次数,从而减轻php、asp和后段数据库的压力,响应时间由几百毫秒降低到几十毫秒。
虽然效果显著,但是fastcgi_cache有个致命缺点,在缓存失效时间之内,即使更新了数据库信息,访问内容也不会发生变化。
Fastcgi缓存的适用场景
就优化性能参数设置,下面会从两个模块分别说明:
1)http区域设置的缓存参数
fastcgi_temp_path path [level1 [level2 [level3]]]; fastcgi_cache_path path [levels=m:n] keys_zone=name:size [inactive=time] [max_size=size]
参数解释:
# path 缓存文件存放(临时)目录 # levels 缓存层次 # keys_zone 缓存空间名和共享内存大小 # inactive 失效时间, 1d = 1天 # max_size 最大缓存空间(硬盘占用)
【推荐配置】
fastcgi_temp_path /tmp/temp fastcgi_cache_path /var/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:256m inactive=1d max_size=1g; #共享内存大小和最大缓存空间由具体应用重新评估设置
注: fastcgi_temp_path 和 fastcgi_cache_path 指定的路径必须在同一分区
2)server模块设置的缓存参数
fastcgi_connect_timeout=300; #fastcgi连接超时时间 fastcgi_send_timeout=300; #fastcgi请求超时时间 fastcgi_rend_timeout=300; #接收fastcgi应答超时时间 fastcgi_buffer_size=64k; #读取fastcgi应答需要多大缓冲区 fastcgi_buffers 4 64k; #指定本地需要多少个和多大的缓冲区来缓冲fastcgi应答请求 fastcgi_busy_buffers_size 128k; #默认值是fastcgi_buffer的2倍 fastcgi_temp_file_write_size 128k; #写入缓存文件使用多大的数据块 fastcgi_cache #表示开启FastCGI缓存并为其指定一个名称。 fastcgi_cache_valid #指定缓存状态及失效时间 fastcgi_cache_min_uses #指定缓存成为过期数据 fastcgi_cache_use_stale #定义哪些情况下用过期缓存 fastcgi_cache_key #指定缓存文件的标识,这个标识会 MD5 转码存储在缓存域的目录下 ffastcgi_cache_methods #指定缓存的请求方式
【推荐配置】
fastcgi_connect_timeout=300 fastcgi_send_timeout=300; fastcgi_rend_timeout=300; fastcgi_buffer_size=64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_cache fcgi; fastcgi_cache_valid 200 302 301 1h; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeout invalid_header http_500; fastcgi_cache_key "$request_method://$host$request_uri"; fastcgi_cache_methods GET HEAD;
1、页面访问空白
原因:这是由于 fastcgi_cache_key 中没有设置$request_method,将 GET 和 HEAD 的请求存储到了同一个 key 中。
解决:配置完毕后,访问偶尔出现空白页面,清空缓存目录后,重新访问恢复。
2、页面缓存失败,一直 MISS
原因:默认情况下,请求的 header 中包含“Expires”, “Cache-Control”, “Set-Cookie”等,页面将不会被缓存。
解决:添加参数 fastcgi_ignore_headers Cache-Control Expires SetCookie;重载nginx服务即可。