FastCGI模块(ngx_http_fastcgi_module)
这个模块允许nginx同FastCGI协同工作,并且控制哪些参数将被安全传递。例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
location ~* \.php$ { root html; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_connect_timeout 2s; fastcgi_read_timeout 3s; fastcgi_send_timeout 3s; fastcgi_pass test_upstream; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/ywnds$fastcgi_script_name; include fastcgi_params; fastcgi_next_upstream error timeout; fastcgi_intercept_errors on; } |
一、缓冲相关参数
1)fastcgi_bind
1 2 3 |
Syntax: fastcgi_bind address | off; Default:— Context:http, server, location |
指令在调用connect()函数之前将解析每个上游socket到一个本地地址,可以使用在主机拥有多个网卡接口或别名,但是你只允许到外的连接来自指定的网卡或者地址的情况下。
2)fastcgi_buffer_size
1 2 3 |
Syntax: fastcgi_buffer_size size; Default:fastcgi_buffer_size 4k|8k; Context:http, server, location |
这个参数指定将用多大的缓冲区来读取从FastCGI服务器到来应答的第一部分,通常来说在这个部分中包含一个小的应答头。默认的缓冲区大小为fastcgi_buffers指令中的每块大小,可以将这个值设置更小。
3)fastcgi_buffering
1 2 3 |
Syntax: fastcgi_buffering on | off; Default:fastcgi_buffering on; Context:http, server, location |
4)fastcgi_buffers
1 2 3 |
Syntax: fastcgi_buffering on | off; Default:fastcgi_buffering on; Context:http, server, location |
这个参数指定了从FastCGI服务器到来的应答,本地将用多少和多大的缓冲区读取,默认这个参数等于分页大小,根据环境的不同可能是4K, 8K或16K。
5)fastcgi_busy_buffers_size
1 2 3 |
Syntax: fastcgi_busy_buffers_size size; Default:fastcgi_busy_buffers_size 8k|16k; Context:http, server, location |
二、缓存相关参数
1)fastcgi_cache
1 2 3 |
Syntax: fastcgi_cache zone | off; Default:fastcgi_cache off; Context:http, server, location |
为缓存实际使用的共享内存指定一个区域,相同的区域可以用在不同的地方。
1 2 3 |
Syntax: fastcgi_cache_bypass string ...; Default:— Context:http, server, location |
2)fastcgi_cache_key
1 2 3 |
Syntax: fastcgi_cache_key string; Default:— Context:http, server, location |
设置缓存的关键字,如:
1 |
fastcgi_cache_key localhost:9000$request_uri; |
3)fastcgi_cache_path
1 2 3 4 |
Syntax: 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]; Default:— Context:http |
这个指令指定FastCGI缓存的路径以及其他的一些参数,所有的数据以文件的形式存储,缓存的关键字(key)和文件名为代理的url计算出的MD5值。Level参数设置缓存目录的目录分级以及子目录的数量,例如指令如果设置为:
1 |
fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; |
那么数据文件将存储为:
1 |
/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
1 2 3 |
Syntax: fastcgi_cache_methods GET | HEAD | POST ...; Default:fastcgi_cache_methods GET HEAD; Context:http, server, location |
无法禁用GET/HEAD ,即使你只是这样设置:
1 |
fastcgi_cache_methods POST; |
4)fastcgi_cache_min_uses
1 2 3 |
Syntax: fastcgi_cache_min_uses number; Default:fastcgi_cache_min_uses 1; Context:http, server, location |
指令指定了经过多少次请求的相同URL将被缓存。
5)fastcgi_cache_use_stale
1 2 3 |
Syntax: fastcgi_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_503 | http_403 | http_404 | off ...; Default:fastcgi_cache_use_stale off; Context:http, server, location |
在某些网关错误、超时的情况下,nginx都将传送过期的缓存数据。
6)fastcgi_cache_valid
1 2 3 |
Syntax: fastcgi_cache_valid [code ...] time; Default:— Context:http, server, location |
为指定的http返回代码指定缓存时间,例如:
1 2 |
fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 404 1m; |
将响应状态码为200和302缓存10分钟,404缓存1分钟。默认情况下缓存只处理200,301,302的状态。同样也可以在指令中使用any表示任何一个。
1 2 3 |
fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 301 1h; fastcgi_cache_valid any 1m; |
7)fastcgi_no_cache
1 2 3 |
Syntax: fastcgi_no_cache string ...; Default:— Context:http, server, location |
确定在何种情况下缓存的应答将不会使用,示例:
1 2 |
fastcgi_no_cache $cookie_nocache $arg_nocache$arg_comment; fastcgi_no_cache $http_pragma $http_authorization; |
如果为空字符串或者等于0,表达式的值等于false,例如,在上述例子中,如果在请求中设置了cookie “nocache”,缓存将被绕过。
三、FastCGI相关参数
1)fastcgi_connect_timeout
1 2 3 |
Syntax: fastcgi_connect_timeout time; Default:fastcgi_connect_timeout 60s; Context:http, server, location |
指定同FastCGI服务器的连接超时时间,这个值不能超过75秒。
2)fastcgi_index
1 2 3 |
Syntax: fastcgi_index name; Default:— Context:http, server, location |
如果URI以斜线结尾,文件名将追加到URI后面,这个值将存储在变量$fastcgi_script_name中。例如:
1 2 |
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”。
3)fastcgi_hide_header
1 2 3 |
Syntax: fastcgi_hide_header field; Default:— Context:http, server, location |
默认情况下nginx不会将来自FastCGI服务器的”Status”和”X-Accel-…”头传送到客户端,这个参数也可以隐藏某些其它的头。如果必须传递”Status”和”X-Accel-…”头,则必须使用fastcgi_pass_header强制其传送到客户端。
4)fastcgi_ignore_client_abort
1 2 3 |
Syntax: fastcgi_ignore_client_abort on | off; Default:fastcgi_ignore_client_abort off; Context:http, server, location |
确定是否应该关闭与FastCGI服务器的连接,当客户端关闭连接而无需等待响应。
5)fastcgi_ignore_headers
1 2 3 |
Syntax: fastcgi_ignore_headers field ...; Default:— Context:http, server, location |
这个指令禁止处理一些FastCGI服务器应答的头部字段,比如可以指定像”X-Accel-Redirect”, “X-Accel-Expires”, “Expires”或”Cache-Control”等。
6)fastcgi_intercept_errors
1 2 3 |
Syntax: fastcgi_intercept_errors on | off; Default:fastcgi_intercept_errors off; Context:http, server, location |
这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。你必须明确的在error_page中指定处理方法使这个参数有效,正如Igor所说“如果没有适当的处理方法,nginx不会拦截一个错误,这个错误不会显示自己的默认页面,这里允许通过某些方法拦截错误。
7)fastcgi_max_temp_file_size
1 2 3 |
Syntax: fastcgi_max_temp_file_size size; Default:fastcgi_max_temp_file_size 1024m; Context:http, server, location |
根据源代码关闭FastCGI缓冲。
8)fastcgi_next_upstream
1 2 3 |
Syntax: fastcgi_next_upstream error | timeout | invalid_header | http_500 | http_503 | http_403 | http_404 | non_idempotent | off ...; Default:fastcgi_next_upstream error timeout; Context:http, server, location |
指令指定哪种情况请求将被转发到下一个FastCGI服务器:
error – 传送中的请求或者正在读取应答头的请求在连接服务器的时候发生错误。
timeout – 传送中的请求或者正在读取应答头的请求在连接服务器的时候超时。
invalid_header – 服务器返回空的或者无效的应答。
http_500 – 服务器返回500应答代码。
http_503 – 服务器返回503应答代码。
http_404 – 服务器返回404应答代码。
off – 禁止请求传送到下一个FastCGI服务器。
注意传送请求在传送到下一个服务器之前可能已经将空的数据传送到了客户端,所以,如果在数据传送中有错误或者超时发生,这个指令可能无法修复一些传送错误。
9)fastcgi_keep_conn
1 2 3 |
Syntax: fastcgi_keep_conn on | off; Default:fastcgi_keep_conn off; Context:http, server, location |
默认情况下,一个FastCGI服务器将关闭一个发送响应后的连接。然而,当此指令开启时,nginx将指示FastCGI服务器打开长连接保持。
10)fastcgi_param
1 2 3 |
Syntax: fastcgi_param parameter value [if_not_empty]; Default:— Context:http, server, location |
指定一些传递到FastCGI服务器的参数。可以使用字符串,变量,或者其组合,这里的设置不会继承到其他的字段,设置在当前字段会清除掉任何之前的定义。下面是一个PHP需要使用的最少参数:
1 2 |
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; |
PHP使用SCRIPT_FILENAME参数决定需要执行哪个脚本,QUERY_STRING包含请求中的某些参数。如果要处理POST请求,则需要另外增加三个参数:
1 2 3 |
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参数:
1 |
fastcgi_param REDIRECT_STATUS 200; |
11)fastcgi_pass
1 2 3 |
Syntax: fastcgi_pass address; Default:— Context:location, if in location |
指定FastCGI服务器监听端口与地址,可以是本机或者其它:
1 |
fastcgi_pass localhost:9000; |
使用Unix socket:
1 |
fastcgi_pass unix:/tmp/fastcgi.socket; |
同样可以使用一个upstream字段名称:
1 |
upstream backend { server localhost:1234;} fastcgi_pass backend; |
12)fastcgi_pass_header
1 2 3 |
Syntax: fastcgi_pass_header field; Default:— Context:http, server, location |
13)fastcgi_read_timeout
1 2 3 |
Syntax: fastcgi_read_timeout time; Default:fastcgi_read_timeout 60s; Context:http, server, location |
前端FastCGI服务器的响应超时时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,或者在错误日志中出现前端服务器响应超时错误,可能需要调整这个值。
14)fastcgi_send_timeout
1 2 3 |
Syntax: fastcgi_send_timeout time; Default:fastcgi_send_timeout 60s; Context:http, server, location |
指令为上游服务器设置等待一个FastCGI进程的传送数据时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,那么可以修改这个值,如果你在上有服务器的error log里面发现一些超时错误,那么可以恰当的增加这个值。指令指定请求服务器的超时时间,指完成了2次握手的连接,而不是完整的连接,如果在这期间客户端没有进行数据传递,那么服务器将关闭这个连接。
15)fastcgi_split_path_info
1 2 3 |
Syntax: fastcgi_split_path_info regex; Default:— Context:location |
示例:
1 2 3 4 |
location ~ ^(.+\.php)(.*)$ { fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; |
请求”/show.php/article/0001″的参数SCRIPT_FILENAME将设置为”/path/to/php/show.php”,参数PATH_INFO为”/article/0001″。
16)fastcgi_store
1 2 3 |
Syntax: fastcgi_store on | off | string; Default:fastcgi_store off; Context:http, server, location |
制定了存储前端文件的路径,参数on指定了将使用root和alias指令相同的路径,off禁止存储,此外,参数中可以使用变量使路径名更明确:
1 |
fastcgi_store /data/www$original_uri; |
应答中的”Last-Modified”头将设置文件的最后修改时间,为了使这些文件更加安全,可以将其在一个目录中存为临时文件,使用fastcgi_temp_path指令。这个指令可以用在为那些不是经常改变的后端动态输出创建本地拷贝的过程中。
fastcgi_store并不是缓存,某些需求下它更像是一个镜像。
17)fastcgi_store_access
1 2 3 |
Syntax: fastcgi_store_access users:permissions ...; Default:fastcgi_store_access user:rw; Context:http, server, location |
这个参数指定创建文件或目录的权限,例如:
1 |
fastcgi_store_access user:rw group:rw all:r; |
如果要指定一个组的人的相关权限,可以不写用户,如:
1 |
fastcgi_store_access group:rw all:r; |
18)fastcgi_temp_path
1 2 3 4 |
Syntax: fastcgi_temp_path path [level1 [level2 [level3]]]; Default: fastcgi_temp_path fastcgi_temp; Context: http, server, location |
指令指定存储从别的服务器传送来的数据临时文件路径,同样可以指定三级目录已经哈希存储,level的值指定为哈希设置多少标记,例如,在下列配置中:
1 |
fastcgi_temp_path /spool/nginx/fastcgi_temp 1 2; |
临时文件类似如下:
1 |
/spool/nginx/fastcgi_temp/7/45/00000123457 |
传送到FastCGI服务器的相关参数
请求头是以参数的形式传送到FastCGI服务器,以具体应用和脚本运行在FastCGI服务器上,这些参数通常以环境变量的形式取得,例如,”User-agent”头以HTTP_USER_AGENT参数传递,除此之外还有一些其他的http头,都可以用fastcgi_param指令自由传递。