运维实战:FastCGI相关调优
作用
可以缓存fastcgi
生成的内容,很多情况是php生成的动态的内容。简单来说就是将动态页面缓存到内存或者硬盘上,如果符合条件则直接读取缓存,不再与PHP 通信,可以提升访问速度,提高用户体验。一般而言用户在打开网页速度在1-2s体验是非常好的,其页面中包含其他的资源慢一些都是可以接受。
环境介绍
服务器IP | Nginx版本 | 域名 |
192.168.123.36 | Nginx1.6.3 | www.test.com |
图 1. 基本环境
FastCGI cache配置
1.nginx.conf配置
user www www;
worker_processes 8;
worker_rlimit_nofile 51200;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
events {
worker_connections 40960;
use epoll;
}
http {
charset utf-8;
include vhosts/*.conf;
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nodelay on;
tcp_nopush on;
send_timeout 60;
client_max_body_size 8m;
keepalive_timeout 60;
server_tokens off;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
fastcgi_cache_path /cache/fastcgi_cache levels=1:2 keys_zone=CGI_Cache:10m inactive=5m max_size=1g;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
add_header X-via $server_addr;
add_header X-Cache $upstream_cache_status;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
server_names_hash_max_size 4096;
server_names_hash_bucket_size 2048;
gzip off;
gzip_min_length 1k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/css application/javascript text/xml;
error_log logs/error.log error;
server {
listen 80 default;
return 444;
}
server {
listen 80;
server_name www.test.com;
root html/test;
location / {
index index.html index.htm index.php;
}
location ~* \.(jpg|gif|jpeg|bmp|png|ico|txt|js|css)$
{
expires 7d;
}
location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache CGI_Cache;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
}
}
}
2.测试代码
<html>
<head>
<title>TEST PAGE</title>
</head>
<body>
<?php echo '<p>I AM CACHE???</p>'; ?>
</body>
</html>
3.参数详解
fastcgi_cache_path /cache/fastcgi_cache levels=1:2 keys_zone=CGI_Cache:10m inactive=5m max_size=1g;
#inactive 为非活动时间为3分钟
#levels 第一位表示使用1级子目录,冒号隔开第二位表示使用2级子目录。最多使用三级。1表示每个一级子目录的名字只能使用1个字符,内存中找多少空间存储键。
fastcgi_connect_timeout 300;
#Nginx服务器与后端FastCGI服务器连接的超时时间;
fastcgi_send_timeout 300;
#Nginx允许FastCGI服务器返回数据的超时时间,否则Nginx则断开连接;
add_header X-via $server_addr;
add_header X-Cache $upstream_cache_status;
#自定义响应报文的首部;
#$upstream_cache_status 该变量来显示缓存的状态
fastcgi_buffer_size 64k;
#Nginx FastCGI的缓冲区大小,用于读取从FastCGI收到的第一部分相应信息的缓冲大小;
fastcgi_buffers 4 64k;
#设定本地需要用多少和多大的缓冲区来缓冲FastCGGI的请求。如果一个PHP脚本所产生的页面为256KB,那么就会分配4个64KB的缓冲区来存放数据,大于256的被放置Fastcgi临时文件目录,该目录位于磁盘。
fastcgi_busy_buffers_size 128k;
#用于设置系统繁忙时候的fastcgi_buffers大小;值必须大于fastcgi_buffer,一般为其2倍;
fastcgi_temp_file_write_size 128k;
#FastCGI临时文件大小,一般设置为128 - 256 KB;
server_names_hash_max_size 4096;
server_names_hash_bucket_size 2048;
#设定用于哈希域名的内存空间,Nginx会把server中的域名哈希至内存,当客户端请求时,会把客户端的请求结果与内存空间中的域名进行比对,其速度提升显著;
fastcgi_cache CGI_Cache;
#表示使用哪个内存空间;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
#设定各个状态码的缓存周期;
ignore_invalid_headers on;
#如果有首部无法理解就直接忽略;
fastcgi_cache_min_uses 1;
#表示请求几次将其缓存;
factcgi_store on;
fastcgi_store_access user:rw group:rw all:r;
fastcgi_temp_path /data/temp;
#暂存fastcgi自己处理的结果,内存空间不够的时候才这么用,会导致性能会下降。一般不建议这么用,应该加大buffer值;
factcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
#SCRIPT_FILENAME 用户请求的脚本文件名,通过URI的方式向后端传递;
#fastcgi_cache_use_stale xxxx;
#指明Nginx在什么情况下使用过期的缓存,类似于proxy_cache中的参数;
4.测试缓存效果
如果Nginx重启失败,原因可能是没有权限创建目录。以www用户为例对目录授权,mkdir /cache/fastcgi_cache && chown -R www. /cache/fastcgi_cache
图4.1 检测 cache manager 是否存在
图4.2 第一次请求结果
图4.3 缓存结果
图4.4 再次请求查看结果 - 缓存命中