fastcgi的介紹,原理及配置

fastcgi介紹:php

CGI全稱是「公共網關接口」(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行「交談」的一種工具,其程序通常運行在網絡服務器上。 CGI能夠用任何一種語言編寫,只要這種語言具備標準輸入、輸出和環境變量。如php,perl,tcl等。html

原理:前端

一、Web Server啓動時載入FastCGI 進程管理器(IIS ISAPI或Apache Module)
二、FastCGI進程管理器自身初始化,啓動多個CGI 解釋器進程(可見多個 php-cgi)並等待來自Web Server的鏈接。
三、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。Web server將CGI 環境變量和標準輸入發送到FastCGI子進程php-cgi。
四、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"。

相關文章
相關標籤/搜索