这个在上篇文章已经提到过了一个 PHP 请求的执行过程,这里在讲一次
早期的 webserver 只处理 html 等静态文件,但是随着技术的发展,出现了像 php 等动态语言。为了解决不同的语言解释器(如 php、python 解释器)与 webserver 的通信,于是出现了 cgi协议
。只要你按照 cgi协议
去编写程序,就能实现语言解释器与 webwerver 的通信。
但是,webserver每收到一个请求,都会去 fork 一个 cgi 进程,请求结束再kill掉这个进程。这样有10000个请求,就需要fork、kill php-cgi进程10000次。这样的话很浪费资源,于是,出现了 cgi 的改良版本,fast-cgi
。fast-cgi
每次处理完请求后,不会 kill 掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新 fork 一个进程了,大大提高了效率。
具体参数详情可参考官网:Module ngx_http_fastcgi_module
以下参数都在nginx的配置文件中配置,配置范围:http, server, location。
这个命令是指定将http代理到哪个fastcgi服务端接口。fastcgi_pass后面是填写fastcgi服务端地址的,这个地址可以是域地址,也可以是Uninx-域套接字。
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
这个命令是设置 fastcgi 请求中的参数,具体设置的东西可以在 PHP 的 $_SERVER
中获取到。参考最后的店fastcgi_param参数配置。
fastcgi默认的主页资源,示例:fastcgi_index index.php;这个功能和index index.html功能一样。当SCRIPT_FILENAME没有命中脚本的时候,使用的就是fastcgi_index设置的脚本。
fastcgi_index index.php;
nginx与后端fastcgi server连接超时时间。
fastcgi_connect_timeout 60s;
指定nginx向后端传送请求超时时间(指已完成两次握手后向fastcgi传送请求超时时间)。
fastcgi_send_timeout 60s;
指定nginx接受后端fastcgi响应请求超时时间 (指已完成两次握手后nginx接受fastcgi响应请求超时时间)。
fastcgi_send_timeout 60s;
指定nginx读取fastcgi响应第一部分需要用多大的缓冲区,这个值表示将使用一个64kb的缓冲区响应第一部分应答(应答头)可以设置为fastcgi_buffers缓存区大小。
fastcgi_buffer_size 4k; # 单位为k,一般为4的整数倍
指nginx需要用多大的缓冲区缓冲fastcgi的应答请求(整个应答),如果一个php脚本所产生的页面大小为256kb,那么会分配4个64kb缓冲区来缓存,如果页面大于256kb,那么大于256kb的部分会缓存到fastcgi_temp指定的路径中,但是因为内存中数据处理远快于磁盘, 所以这个值应该为站点中php所产生的页面大小的中间值, 如果站点大部分php脚本产生的页面为:256kb, 那么可以设置成成"8 16k 4 64k"。
fastcgi_buffers 8 4k; # 单位为k,一般为4的整数倍
整个数据请求需要多大的缓存区,建议设置为fastcgi_buffers值的两倍。
fastcgi_busy_buffers 8k; # 单位为K,一般为fastcgi_buffers值的2倍
写入缓存文件使用多大的数据块,默认值是fastcgi_buffer值的2倍。
fastcgi_temp_file_write_size 8k; # 单位为K,一般为fastcgi_buffers值的2倍
定义fastcgi缓存的路径及其他设置。
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
开启fastcgi_cache并为其定义一个名称,可以防止nginx 502错误,降低cpu负载,不过也会引起其他问题,根据需求来选择。
fastcgi_cache off;
为指定的应答代码指定缓存时间。
fastcgi_cache_valid 200 302 1h; # 对于状态码为200 302的网页缓存1小时
fastcgi_cache_valid any 1m; # 其他页面缓存1分钟
以某个值为key,Nginx会取这个key的md5作为缓存文件 如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录。
fastcgi_cache_key "requestmethod://requestmethod://host$request_uri";
URL至少经过多少次请求将被缓存。
fastcgi_cache_min_uses 1;
对一些错误提示code,nginx会使用到fast_cache缓存。
fastcgi_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_503 |http_403 | http_404 | off ...;
一般在nginx.conf文件同级有一个 fastcgi.conf 配置文件如下:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# 脚本文件请求的路径
fastcgi_param QUERY_STRING $query_string; # 请求参数
fastcgi_param REQUEST_METHOD $request_method;# 请求方法
fastcgi_param CONTENT_TYPE $content_type; # 请求时正文的格式,对应Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; # 请求头正文长度,对应Content-length字段
fastcgi_param SCRIPT_NAME $fastcgi_script_name;# 脚本名称
fastcgi_param REQUEST_URI $request_uri; # 请求地址不带参数
fastcgi_param DOCUMENT_URI $document_uri; # 与$uri相同
fastcgi_param DOCUMENT_ROOT $document_root;# 网站的根目录。配置文件中root值
fastcgi_param SERVER_PROTOCOL $server_protocol;# 请求使用的协议,如:HTTP/1.1
fastcgi_param REQUEST_SCHEME $scheme; # 获取http协议
fastcgi_param HTTPS $https if_not_empty; # value非空才进行设置
fastcgi_param GATEWAY_INTERFACE CGI/1.1; # cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; # nginx 版本号,可修改、隐藏
fastcgi_param REMOTE_ADDR $remote_addr; # 客户端IP
fastcgi_param REMOTE_PORT $remote_port; # 客户端端口
fastcgi_param SERVER_ADDR $server_addr; # 服务器IP地址
fastcgi_param SERVER_PORT $server_port; # 服务器端口
fastcgi_param SERVER_NAME $server_name; # 服务器名,域名在server配置中指定的server_name
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
#fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/:/tmp/:/proc/";