1. 程式人生 > >nginx FastCGI模塊(FastCGI)配置

nginx FastCGI模塊(FastCGI)配置

log errors 系統 多個 star 服務器的響應 sta targe ble

http://www.howtocn.org/nginx:nginx%E6%A8%A1%E5%9D%97%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88:standardhttpmodules:fastcgi#fastcgi%E6%A8%A1%E5%9D%97_fastcgi

nginx官方文檔:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html

摘要

這個模塊允許nginx同FastCGI協同工作,並且控制哪些參數將被安全傳遞。
例:

[plain]
view plain copy
  1. location / {
  2. fastcgi_pass localhost:9000;
  3. fastcgi_index index.php;
  4. fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
  5. fastcgi_param QUERY_STRING $query_string;
  6. fastcgi_param REQUEST_METHOD $request_method;
  7. fastcgi_param CONTENT_TYPE $content_type;
  8. fastcgi_param CONTENT_LENGTH $content_length;
  9. }


一個在緩存中的實例:

[plain] view plain copy
  1. http {
  2. fastcgi_cache_path /path/to/cache levels=1:2
  3. keys_zone=NAME:10m
  4. inactive=5m;
  5. server {
  6. location / {
  7. fastcgi_pass http://127.0.0.1:9000;
  8. fastcgi_cache NAME;
  9. fastcgi_cache_valid 200 302 1h;
  10. fastcgi_cache_valid 301 1d;
  11. fastcgi_cache_valid any 1m;
  12. fastcgi_cache_min_uses 1;
  13. fastcgi_cache_use_stale error timeout invalid_header http_500;
  14. }
  15. }
  16. }


0.7.48以後,緩存遵循後端服務器的Cache-Control, Expires等,0.7.66版本以後,”Cache-Control:“private”和”no-store”頭同樣被遵循。

指令

fastcgi_bind

語法:fastcgi_bind address
默認值:none
使用字段:http, server, location
可用版本:大於0.8.22
示例:

fastcgi_bind  192.168.1.1;

指令在調用connect()函數之前將解析每個上遊socket到一個本地地址,可以使用在主機擁有多個網卡接口或別名,但是你只允許到外的連接來自指定的網卡或者地址的情況下。

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進程到來的應答,本地將用多少和多大的緩沖區讀取。
fastcgi_buffers可以設置為你的FastCGI返回的大部分應答大小,這樣可以處理大部分的請求,較大的請求將被緩沖到磁盤。
如果想關閉對所有請求道磁盤的緩沖,可以將fastcgi_max_temp_file_size設置為0。
fastcgi_buffer等於:fastcgi_buffer_size + the_number * is_size
如果一個fastcgi應答為12k,那麽fastcgi_buffers 64 4k將分配3個4k的buffer。這便是為什麽fastcgi_buffers有兩個參數,而fastcgi_buffer_size(用於應答頭與應答的第一部分)只有1個參數,在fastcgi_buffer_size被清空後,它們和fastcgi_buffers一起被使用。
例如:

fastcgi_buffers 256 4k; #設置buffer大小為:4k + 256 * 4k = 1028k

這意味著大於1M的應答將被緩沖到磁盤,而小於1M的將在內存中處理。
默認這個參數等於分頁大小,根據環境的不同可能是4K, 8K或16K。
在Linux系統中你可以通過下面的命令得到分頁大小:

getconf PAGESIZE

返回的單位為bytes。
指令示例:

fastcgi_buffers 256 4k; # 設置緩沖區大小為4k + 256 * 4k = 1028k

這意味著所有FastCGI返回的應答,nginx將超過1M的部分寫入磁盤,1M以內的部分寫入內存。

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請求中允許哪些http方法。
語法:fastcgi_cache_methods [GET HEAD POST];
默認值:fastcgi_cache_methods GET HEAD;
使用字段:main,http,location
這個指令指定在緩存FastCGI請求中允許哪些http方法。
無法禁用GET/HEAD ,即使你只是這樣設置:

fastcgi_cache_methods  POST; #GET和HEAD依然可用

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以上
這個指令允許為CGI specification設置SCRIPT_FILENAME (SCRIPT_NAME)和PATH_INFO變量。正則包含兩個組:

  • 處理請求的腳本路徑–對應$fastcgi_script_name。
  • 腳本參數的值–對應$fastcgi_path_info。

下面是一個示例,腳本show.php接受字符串參數: article/0001,下面的例子將處理路徑妥善分裂:

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”。

參考文檔

Original Documentation
Nginx Http FastCGI Module

nginx FastCGI模塊(FastCGI)配置