Nginx 之 fastcgi 常用参数详解

太叔景曜
2023-12-01

fastcgi 是什么

这个在上篇文章已经提到过了一个 PHP 请求的执行过程,这里在讲一次

早期的 webserver 只处理 html 等静态文件,但是随着技术的发展,出现了像 php 等动态语言。为了解决不同的语言解释器(如 php、python 解释器)与 webserver 的通信,于是出现了 cgi协议。只要你按照 cgi协议去编写程序,就能实现语言解释器与 webwerver 的通信。

但是,webserver每收到一个请求,都会去 fork 一个 cgi 进程,请求结束再kill掉这个进程。这样有10000个请求,就需要fork、kill php-cgi进程10000次。这样的话很浪费资源,于是,出现了 cgi 的改良版本,fast-cgifast-cgi 每次处理完请求后,不会 kill 掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新 fork 一个进程了,大大提高了效率。

fastcgi 常用参数

具体参数详情可参考官网:Module ngx_http_fastcgi_module

以下参数都在nginx的配置文件中配置,配置范围:http, server, location。

1、fastcgi_pass

这个命令是指定将http代理到哪个fastcgi服务端接口。fastcgi_pass后面是填写fastcgi服务端地址的,这个地址可以是域地址,也可以是Uninx-域套接字。

fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;

2、fastcgi_param

这个命令是设置 fastcgi 请求中的参数,具体设置的东西可以在 PHP 的 $_SERVER 中获取到。参考最后的店fastcgi_param参数配置。

3、fastcgi_index

fastcgi默认的主页资源,示例:fastcgi_index index.php;这个功能和index index.html功能一样。当SCRIPT_FILENAME没有命中脚本的时候,使用的就是fastcgi_index设置的脚本。

  fastcgi_index  index.php;

4、fastcgi_connect_timeout

nginx与后端fastcgi server连接超时时间。

  fastcgi_connect_timeout 60s;

5、fastcgi_send_timeout

指定nginx向后端传送请求超时时间(指已完成两次握手后向fastcgi传送请求超时时间)。

 fastcgi_send_timeout 60s;

6、fastcgi_read_timeout

指定nginx接受后端fastcgi响应请求超时时间 (指已完成两次握手后nginx接受fastcgi响应请求超时时间)。

 fastcgi_send_timeout 60s;

7、fastcgi_buffer_size

指定nginx读取fastcgi响应第一部分需要用多大的缓冲区,这个值表示将使用一个64kb的缓冲区响应第一部分应答(应答头)可以设置为fastcgi_buffers缓存区大小。

fastcgi_buffer_size 4k; # 单位为k,一般为4的整数倍

8、fastcgi_buffers

指nginx需要用多大的缓冲区缓冲fastcgi的应答请求(整个应答),如果一个php脚本所产生的页面大小为256kb,那么会分配4个64kb缓冲区来缓存,如果页面大于256kb,那么大于256kb的部分会缓存到fastcgi_temp指定的路径中,但是因为内存中数据处理远快于磁盘, 所以这个值应该为站点中php所产生的页面大小的中间值, 如果站点大部分php脚本产生的页面为:256kb, 那么可以设置成成"8 16k 4 64k"。

fastcgi_buffers 8 4k;  # 单位为k,一般为4的整数倍

9、fastcgi_busy_buffers_size

整个数据请求需要多大的缓存区,建议设置为fastcgi_buffers值的两倍。

fastcgi_busy_buffers 8k; # 单位为K,一般为fastcgi_buffers值的2倍

10、fastcgi_temp_file_write_size

写入缓存文件使用多大的数据块,默认值是fastcgi_buffer值的2倍。

fastcgi_temp_file_write_size 8k; # 单位为K,一般为fastcgi_buffers值的2倍

11、fastcgi_cache_path

定义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];

12、fastcgi_cache

开启fastcgi_cache并为其定义一个名称,可以防止nginx 502错误,降低cpu负载,不过也会引起其他问题,根据需求来选择。

fastcgi_cache off;

13、fastcgi_cache_valid

为指定的应答代码指定缓存时间。

fastcgi_cache_valid 200 302 1h; # 对于状态码为200 302的网页缓存1小时
fastcgi_cache_valid any 1m; # 其他页面缓存1分钟

14、fastcgi_cache_key

以某个值为key,Nginx会取这个key的md5作为缓存文件 如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录。

fastcgi_cache_key "requestmethod://requestmethod://host$request_uri";

15、fastcgi_cache_min_uses

URL至少经过多少次请求将被缓存。

fastcgi_cache_min_uses 1;

16、fastcgi_cache_use_stale

对一些错误提示code,nginx会使用到fast_cache缓存。

fastcgi_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_503 |http_403 | http_404 | off ...;

fastcgi_param参数配置

一般在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/";
 类似资料: