什么是 FastCGI
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通信的接口。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支持,其中就有PHP。 FastCGI是從CGI發展改進而來的。傳統CGI接口方式的主要缺點是性能很差,因為每次HTTP服務器遇到動態程序時都需要重新啟動腳本解析器來執行解析,然后結果被返回給HTTP服務器。這在處理高并發訪問時,幾乎是不可用的。另外傳統的CGI接口方式安全性也很差,現在已經很少被使用了。 ? FastCGI接口方式采用C/S結構,可以將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。這種方式可以讓HTTP服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。
Nginx+FastCGI運行原理
Nginx不支持對外部程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調用。FastCGI接口在Linux下是socket,(這個socket可以是文件socket,也可以是ip socket)。為了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接納到請求,然后派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本并讀取返回數據;接著,wrapper再將返回的數據通過FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個運作過程。詳細的過程。
fastCGI默認解釋
通過location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來處理,而這里的IP地址和端口就是FastCGI進程監聽的IP地址和端口。 ? fastcgi_param指令指定放置PHP動態程序的主目錄,也就是$fastcgi_script_name前面指定的路徑,這里是/usr/local/nginx/html目錄,建議將這個目錄與Nginx虛擬主機指定的根目錄保持一致,當然也可以不一致。 fastcgi_params文件是FastCGI進程的一個參數配置文件,在安裝Nginx后,會默認生成一個這樣的文件,這里通過include指令將FastCGI參數配置文件包含了進來。
優化nginx主配置文件HTTP字段下參數配置
在配置完成Nginx+FastCGI之后,為了保證Nginx下PHP環境的高速穩定運行,需要添加一些FastCGI優化指令。下面給出一個優化實例,將下面代碼添加到Nginx主配置文件中的HTTP層級。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
server {</pre>
參數解釋;
$ fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; # 為FastCGI緩存指定一個文件路徑、目錄結構等級、關鍵字區域存儲時間和非活動刪除時間
path 緩存文件存放(臨時)目錄
levels 緩存層次
keys_zone 緩存空間名和共享內存大小
inactive 失效時間, 1d = 1天
max_size 最大緩存空間(硬盤占用)
$ fastcgi_connect_timeout 300; # nginx和fastCGI連接的超時時間
fastcgi_read_timeout 300; # Nginx從FastCGI服務器讀取響應信息的超時時間
?
fastcgi_buffers 4 64k; # 設定用來讀取從dastCGI服務器收到的響應信息的超時時間
?
fastcgi_temp_file_write_size 128k; # fastCGI臨時文件的大小
?
fastcgi_cache_methods GET HEAD;#指定緩存的請求方式
?
fastcgi_cache_key "
host$request_uri"; #指定緩存文件的標識,這個標識會 MD5 轉碼存儲在緩存域的目錄下
?</pre>
優化fastCGI的location字段下的參數
location ~ .*.(php|php5)?host$request_uri; #指定緩存文件的標識,這個標識會 MD5 轉碼存儲在緩存域的目錄下
?
}</pre>