fastcgi介绍:

CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

原理:

1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
 
FastCGI模块(FastCGI)

 

·摘要

这个模块允许nginx同FastCGI协同工作,并且控制哪些参数将被安全传递。 例:

location / {  fastcgi_pass   localhost:9000;  fastcgi_index  index.php;   fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;  fastcgi_param  QUERY_STRING     $query_string;  fastcgi_param  REQUEST_METHOD   $request_method;  fastcgi_param  CONTENT_TYPE     $content_type;  fastcgi_param  CONTENT_LENGTH   $content_length;}

一个在缓存中的实例:

http {  fastcgi_cache_path   /path/to/cache  levels=1:2                       keys_zone=NAME:10m                       inactive=5m;   server {    location / {      fastcgi_pass    http://127.0.0.1;      fastcgi_cache   NAME;      fastcgi_cache_valid   200 302  1h;      fastcgi_cache_valid   301      1d;      fastcgi_cache_valid   any      1m;      fastcgi_cache_min_uses  1;      fastcgi_cache_use_stale error  timeout invalid_header http_500;    }  }}

0.7.48以后,缓存遵循后端服务器的Cache-Control, Expires等,0.7.66版本以后,"Cache-Control:"private"和"no-store"头同样被遵循。

·指令

fastcgi_buffer_size

语法:fastcgi_buffer_size the_size ; 默认值:fastcgi_buffer_size 4k/8k ; 使用字段:http, server, location 这个参数指定将用多大的缓冲区来读取从FastCGI服务器到来应答的第一部分。 通常来说在这个部分中包含一个小的应答头。 默认的缓冲区大小为fastcgi_buffers指令中的每块大小,可以将这个值设置更小。

fastcgi_buffers

语法:fastcgi_buffers the_number is_size; 默认值:fastcgi_buffers 8 4k/8k; 使用字段:http, server, location 这个参数指定了从FastCGI服务器到来的应答,本地将用多少和多大的缓冲区读取,默认这个参数等于分页大小,根据环境的不同可能是4K, 8K或16K。

fastcgi_cache

语法:fastcgi_cache zone|off; 默认值:off 使用字段:http, server, location 为缓存实际使用的共享内存指定一个区域,相同的区域可以用在不同的地方。

fastcgi_cache_key

语法:fastcgi_cache_key line 默认值:none 使用字段:http, server, location 设置缓存的关键字,如:

fastcgi_cache_key localhost:9000$request_uri;

fastcgi_cache_path

语法:fastcgi_cache_path path [levels=m:n] keys_zone=name:size [inactive=time] [max_size=size] 默认值:none 使用字段:http clean_time参数在0.7.45版本中已经移除。 这个指令指定FastCGI缓存的路径以及其他的一些参数,所有的数据以文件的形式存储,缓存的关键字(key)和文件名为代理的url计算出的MD5值。 Level参数设置缓存目录的目录分级以及子目录的数量,例如指令如果设置为:

fastcgi_cache_path  /data/nginx/cache  levels=1:2   keys_zone=one:10m;

那么数据文件将存储为:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

缓存中的文件首先被写入一个临时文件并且随后被移动到缓存目录的最后位置,0.8.9版本之后可以将临时文件和缓存文件存储在不同的文件系统,但是需要明白这种移动并不是简单的原子重命名系统调用,而是整个文件的拷贝,所以最好在fastcgi_temp_path和fastcgi_cache_path的值中使用相同的文件系统。 另外,所有活动的关键字及数据相关信息都存储于共享内存池,这个值的名称和大小通过key_zone参数指定,inactive参数指定了内存中的数据存储时间,默认为10分钟。 max_size参数设置缓存的最大值,一个指定的cache manager进程将周期性的删除旧的缓存数据。

fastcgi_cache_methods

语法:fastcgi_cache_methods [GET HEAD POST]; 默认值:fastcgi_cache_methods GET HEAD; 使用字段:main,http,location 无法禁用GET/HEAD ,即使你只是这样设置:

fastcgi_cache_methods  POST;

fastcgi_cache_min_uses

语法:fastcgi_cache_min_uses n 默认值:fastcgi_cache_min_uses 1 使用字段:http, server, location 指令指定了经过多少次请求的相同URL将被缓存。

fastcgi_cache_use_stale

语法:fastcgi_cache_use_stale [updating|error|timeout|invalid_header|http_500] 默认值:fastcgi_cache_use_stale off; 使用字段:http, server, location 在某些网关错误、超时的情况下,nginx都将传送过期的缓存数据。

fastcgi_cache_valid

语法:fastcgi_cache_valid [http_error_code|time] 默认值:none 使用字段:http, server, location 为指定的http返回代码指定缓存时间,例如:

fastcgi_cache_valid  200 302  10m;fastcgi_cache_valid  404      1m;

将响应状态码为200和302缓存10分钟,404缓存1分钟。 默认情况下缓存只处理200,301,302的状态。 同样也可以在指令中使用any表示任何一个。

fastcgi_cache_valid  200 302 10m;fastcgi_cache_valid  301 1h;fastcgi_cache_valid  any 1m;

fastcgi_connect_timeout

语法:fastcgi_connect_timeout time 默认值:fastcgi_connect_timeout 60 使用字段:http, server, location 指定同FastCGI服务器的连接超时时间,这个值不能超过75秒。

fastcgi_index

语法:fastcgi_index file 默认值:none 使用字段:http, server, location 如果URI以斜线结尾,文件名将追加到URI后面,这个值将存储在变量$fastcgi_script_name中。例如:

fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

请求"/page.php"的参数SCRIPT_FILENAME将被设置为"/home/www/scripts/php/page.php",但是"/"为"/home/www/scripts/php/index.php"。

fastcgi_hide_header

语法:fastcgi_hide_header name 使用字段:http, server, location 默认情况下nginx不会将来自FastCGI服务器的"Status"和"X-Accel-..."头传送到客户端,这个参数也可以隐藏某些其它的头。 如果必须传递"Status"和"X-Accel-..."头,则必须使用fastcgi_pass_header强制其传送到客户端。

fastcgi_ignore_client_abort

语法:fastcgi_ignore_client_abort on|off 默认值:fastcgi_ignore_client_abort off 使用字段:http, server, location 如果当前连接请求FastCGI服务器失败,为防止其与nginx服务器断开连接,可以用这个指令。

fastcgi_ignore_headers

语法:fastcgi_ignore_headers name [name...] 使用字段:http, server, location 这个指令禁止处理一些FastCGI服务器应答的头部字段,比如可以指定像"X-Accel-Redirect", "X-Accel-Expires", "Expires"或"Cache-Control"等。

fastcgi_intercept_errors

语法:fastcgi_intercept_errors on|off 默认值:fastcgi_intercept_errors off 使用字段:http, server, location 这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。 你必须明确的在error_page中指定处理方法使这个参数有效,正如Igor所说“如果没有适当的处理方法,nginx不会拦截一个错误,这个错误不会显示自己的默认页面,这里允许通过某些方法拦截错误。

fastcgi_max_temp_file_size

语法:fastcgi_max_temp_file_size 0 默认值:? 使用字段:? 根据源代码关闭FastCGI缓冲。

fastcgi_no_cache

语法:fastcgi_no_cache variable [...] 默认值:None 使用字段:http, server, location 确定在何种情况下缓存的应答将不会使用,示例:

  fastcgi_no_cache $cookie_nocache  $arg_nocache$arg_comment;  fastcgi_no_cache $http_pragma     $http_authorization;

如果为空字符串或者等于0,表达式的值等于false,例如,在上述例子中,如果在请求中设置了cookie "nocache",缓存将被绕过。

fastcgi_next_upstream

语法:fastcgi_next_upstream error|timeout|invalid_header|http_500|http_503|http_404|off 默认值:fastcgi_next_upstream error timeout 使用字段:http, server, location 指令指定哪种情况请求将被转发到下一个FastCGI服务器: ·error — 传送中的请求或者正在读取应答头的请求在连接服务器的时候发生错误。 ·timeout — 传送中的请求或者正在读取应答头的请求在连接服务器的时候超时。 ·invalid_header — 服务器返回空的或者无效的应答。 ·http_500 — 服务器返回500应答代码。 ·http_503 — 服务器返回503应答代码。 ·http_404 — 服务器返回404应答代码。 ·off — 禁止请求传送到下一个FastCGI服务器。 注意传送请求在传送到下一个服务器之前可能已经将空的数据传送到了客户端,所以,如果在数据传送中有错误或者超时发生,这个指令可能无法修复一些传送错误。

fastcgi_param

语法:fastcgi_param parameter value 默认值:none 使用字段:http, server, location 指定一些传递到FastCGI服务器的参数。 可以使用字符串,变量,或者其组合,这里的设置不会继承到其他的字段,设置在当前字段会清除掉任何之前的定义。 下面是一个PHP需要使用的最少参数:

  fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;  fastcgi_param  QUERY_STRING     $query_string;

PHP使用SCRIPT_FILENAME参数决定需要执行哪个脚本,QUERY_STRING包含请求中的某些参数。 如果要处理POST请求,则需要另外增加三个参数:

  fastcgi_param  REQUEST_METHOD   $request_method;  fastcgi_param  CONTENT_TYPE     $content_type;  fastcgi_param  CONTENT_LENGTH   $content_length;

如果PHP在编译时带有--enable-force-cgi-redirect,则必须传递值为200的REDIRECT_STATUS参数:

fastcgi_param  REDIRECT_STATUS  200;

fastcgi_pass

语法:fastcgi_pass fastcgi-server 默认值:none 使用字段:http, server, location 指定FastCGI服务器监听端口与地址,可以是本机或者其它:

fastcgi_pass   localhost:9000;

使用Unix socket:

fastcgi_pass   unix:/tmp/fastcgi.socket;

同样可以使用一个upstream字段名称:

upstream backend  {  server   localhost:1234;} fastcgi_pass   backend;

fastcgi_pass_header

语法:fastcgi_pass_header name 默认值:none 使用字段:http, server, location

fastcgi_read_timeout

语法:fastcgi_read_timeout time 默认值:fastcgi_read_timeout 60 使用字段:http, server, location 前端FastCGI服务器的响应超时时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,或者在错误日志中出现前端服务器响应超时错误,可能需要调整这个值。

fastcgi_redirect_errors

语法:fastcgi_redirect_errors on|off 指令重命名为fastcgi_intercept_errors。

fastcgi_send_timeout

语法:fastcgi_send_timeout time

默认值:fastcgi_send_timeout 60

使用字段:http, server, location 指令为上游服务器设置等待一个FastCGI进程的传送数据时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,那么可以修改这个值,如果你在上有服务器的error log里面发现一些超时错误,那么可以恰当的增加这个值。 指令指定请求服务器的超时时间,指完成了2次握手的连接,而不是完整的连接,如果在这期间客户端没有进行数据传递,那么服务器将关闭这个连接。

fastcgi_split_path_info

语法:fastcgi_split_path_info regex 使用字段:location 可用版本:0.7.31以上,示例:

location ~ ^(.+\.php)(.*)$ {...fastcgi_split_path_info ^(.+\.php)(.*)$;fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;...}

请求"/show.php/article/0001"的参数SCRIPT_FILENAME将设置为"/path/to/php/show.php",参数PATH_INFO为"/article/0001"。

fastcgi_store

语法:fastcgi_store [on | off | path] 默认值:fastcgi_store off 使用字段:http, server, location 制定了存储前端文件的路径,参数on指定了将使用root和alias指令相同的路径,off禁止存储,此外,参数中可以使用变量使路径名更明确:

fastcgi_store   /data/www$original_uri;

应答中的"Last-Modified"头将设置文件的最后修改时间,为了使这些文件更加安全,可以将其在一个目录中存为临时文件,使用fastcgi_temp_path指令。 这个指令可以用在为那些不是经常改变的后端动态输出创建本地拷贝的过程中。如:

location /images/ {  root                 /data/www;  error_page           404 = /fetch$uri;} location /fetch {  internal;   fastcgi_pass           fastcgi://backend;  fastcgi_store          on;  fastcgi_store_access   user:rw  group:rw  all:r;  fastcgi_temp_path      /data/temp;   alias                  /data/www;}

fastcgi_store并不是缓存,某些需求下它更像是一个镜像。

fastcgi_store_access

语法:fastcgi_store_access users:permissions [users:permission ...] 默认值:fastcgi_store_access user:rw 使用字段:http, server, location 这个参数指定创建文件或目录的权限,例如:

fastcgi_store_access  user:rw  group:rw  all:r;

如果要指定一个组的人的相关权限,可以不写用户,如:

fastcgi_store_access  group:rw  all:r;

fastcgi_temp_path

语法:fastcgi_temp_path path [level1 [level2 [level3]]] 默认值:fastcgi_temp_path fastcgi_temp 使用字段:http, server, location 指令指定存储从别的服务器传送来的数据临时文件路径,同样可以指定三级目录已经哈希存储,level的值指定为哈希设置多少标记,例如,在下列配置中:

fastcgi_temp_path  /spool/nginx/fastcgi_temp 1 2;

临时文件类似如下:

/spool/nginx/fastcgi_temp/7/45/00000123457

·传送到FastCGI服务器的相关参数

请求头是以参数的形式传送到FastCGI服务器,以具体应用和脚本运行在FastCGI服务器上,这些参数通常以环境变量的形式取得,例如,"User-agent"头以HTTP_USER_AGENT参数传递,除此之外还有一些其他的http头,都可以用fastcgi_param指令自由传递。

·变量

$fastcgi_script_name

这个变量等于一个以斜线结尾的请求URI加上fastcgi_index给定的参数。可以用这个变量代替SCRIPT_FILENAME 和PATH_TRANSLATED,以确定php脚本的名称。 如下例,请求"/info/":

 fastcgi_index  index.php;  fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

SCRIPT_FILENAME等于"/home/www/scripts/php/info/index.php"。

fastcgi的介绍,原理及配置的更多相关文章

  1. 实战Nginx与PHP(FastCGI)的安装、配置与优化

    一.什么是 FastCGIFastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接口.多数流行的HTTP server都支持FastCGI,包括Apache.Nginx和l ...

  2. 【转】实战Nginx与PHP(FastCGI)的安装、配置与优化

    原文连接:http://ixdba.blog.51cto.com/2895551/806622 原文作者:南非蚂蚁 转载注明以上信息 一.什么是 FastCGIFastCGI是一个可伸缩地.高速地在H ...

  3. Nginx与PHP(FastCGI)的安装、配置

    摘自:http://www.linuxde.net/2012/03/9130.html 一.什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接 ...

  4. 【收藏】实战Nginx与PHP(FastCGI)的安装、配置与优化

    拜读南非蚂蚁大牛的文章真是有所收获 http://ixdba.blog.51cto.com/2895551/806622 一.什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP s ...

  5. MySQL主从复制的原理及配置

    [http://www.jb51.net/article/50053.htm]   MySQL 数据库的高可用性架构:         集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单 ...

  6. MySQL的复制原理及配置

    MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题. 一.复制的原理 MySQL 复制基于主服 ...

  7. MySQL主从复制的原理及配置方法(比较详细)

    MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题 一.复制的原理 MySQL 复制基于主服务 ...

  8. [转]Oracle 11g RAC SCAN ip的原理及配置

    原文地址:http://tiany.blog.51cto.com/513694/1421917/ Oracle 11g RAC SCAN ip的原理及配置   Oracle 11g RAC网格即插即用 ...

  9. MySQL 主从复制(实时热备)原理与配置

    MySQL是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失.为了保证MySQL数据库的可靠性,就要会一些提高可靠性的技术.MySQL主从复制可以做到实时热备数据.本文介绍MySQL主从复制原理 ...

  10. SpringCloud之RabbitMQ消息队列原理及配置

    本篇章讲解RabbitMQ的用途.原理以及配置,RabbitMQ的安装请查看SpringCloud之RabbitMQ安装 一.MQ用途 1.同步变异步消息 场景:用户下单完成后,发送邮件和短信通知. ...

随机推荐

  1. python中numpy对函数进行矢量化转换

    在对numpy的数组进行操作时,我们应该尽量避免循环操作,尽可能利用矢量化函数来避免循环. 但是,直接将自定义函数应用在numpy数组之上会报错,我们需要将函数进行矢量化转换. def Theta(x ...

  2. dp中表示无限取的写法

    dp[i][j]=dp[i-a[i][j]+dp[i-a[i]][j-1]; 其中前一项j不变表示j这一项无限取

  3. MySQL5.6生产库自动化安装部署

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1846671 自动化运 ...

  4. HDU1548:A strange lift(Dijkstra或BFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...

  5. js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象

    1.Factory基本写法 <!DOCTYPE html><html lang="en"><head>    <meta charset= ...

  6. abstract、override、new、virtual、sealed使用和示例

    abstract修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽 ...

  7. 获取Pid

    Java程序中获取当前进程的进程ID 标签: javainterfacesystemcompilationjvmjni 2011-12-29 16:31 15182人阅读 评论(2) 收藏 举报  分 ...

  8. ArcGIS制图表达Representation-制图表达使用须知

    ArcGIS制图表达Representation-制图表达使用须知 by 李远祥 前面章节也介绍了一些制图表达的适用范围和场景,如果有觉得需要使用制图表达去完成其工作的话,还需要注意制图表达的一些技术 ...

  9. for语句输出图形

    一.输出以下图形 ******************************** 用for...for...嵌套循环,内循环控制每一行的个数(即列数),外循环控制行数 class ForDraw { ...

  10. Unity编程标准导引-Unity中的基本概念-2.1界面概览

    Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...