天天看點

nginx 與fastcgi、及動态語言配合的工作原理

一、什麼是 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的整個運作過程。詳細的過程,如圖1所示。

nginx 與fastcgi、及動态語言配合的工作原理

圖1 Nginx+FastCGI運作原理

三、spawn-fcgi與PHP-FPM

前面介紹過,FastCGI接口方式在腳本解析伺服器上啟動一個或者多個守護程序對動态腳本進行解析,這些程序就是FastCGI程序管理器,或者稱之為FastCGI引擎, spawn-fcgi與PHP-FPM就是支援PHP的兩個FastCGI程序管理器。

下面簡單介紹spawn-fcgi與PHP-FPM的異同。

spawn-fcgi是HTTP伺服器lighttpd的一部分,目前已經獨立成為一個項目,一般與lighttpd配合使用來支援PHP,但是ligttpd的spwan-fcgi在高并發通路的時候,會出現記憶體洩漏甚至自動重新開機FastCGI的問題。

Nginx是個輕量級的HTTP server,必須借助第三方的FastCGI處理器才可以對PHP進行解析,是以Nginx+spawn-fcgi的組合也可以實作對PHP的解析,這裡不過多講述。

PHP-FPM也是一個第三方的FastCGI程序管理器,它是作為PHP的一個更新檔來開發的,在安裝的時候也需要和PHP源碼一起編譯,也就是說PHP-FPM被編譯到PHP核心中,是以在處理性能方面更加優秀;同時它在處理高并發方面也比spawn-fcgi引擎好很多,是以,推薦Nginx+PHP/PHP-FPM這個組合對PHP進行解析。

FastCGI 的主要優點是把動态語言和HTTP Server分離開來,是以Nginx與PHP/PHP-FPM經常被部署在不同的伺服器上,以分擔前端Nginx伺服器的壓力,使Nginx專一處理靜态請求和轉發動态請求,而PHP/PHP-FPM伺服器專一解析PHP動态請求。

四、安裝php與php-fpm

五、配置Nginx來支援PHP

Nginx的安裝特别簡單,前面已經對此進行了詳細介紹,這裡不再進行講述。下面重點介紹Nginx如何通過php-fpm的FastCGI程序對PHP進行解析處理。

由于Nginx本身不會對PHP進行解析,是以要實作Nginx對PHP的支援,其實是将對PHP頁面的請求交給fastCGI程序監聽的IP位址及端口。如果把php-fpm當做動态應用伺服器,那麼Nginx其實就是一個反向代理伺服器。Nginx通過反向代理功能實作對PHP的解析,這就是Nginx實作PHP動态解析的原理。

這裡假定Nginx的安裝目錄為/usr/local,則Nginx配置檔案的路徑為/usr/local/nginx/conf/nginx.conf。下面是在Nginx下支援PHP解析的一個虛拟主機配置執行個體。

  1.         server {  
  2.  include port.conf;  
  3.  server_name www.ixdba.net ixdba.net;  
  4.   location / {  
  5.  index index.html index.php;  
  6.  root /web/www/www.ixdba.net;  
  7.  }  
  8.  location ~ \.php$ {  
  9.             root           html;  
  10.             fastcgi_pass   127.0.0.1:9000;  
  11.             fastcgi_index  index.php;  
  12.             fastcgi_param  SCRIPT_FILENAME  html$fastcgi_script_name;  
  13.             include        fastcgi_params;  
  14.         }  
  15. }  

通過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服務。

/usr/local/nginx/sbin/nginx

到此為止,Nginx+PHP已經配置完成。

六、測試Nginx對PHP的解析功能

這裡在/usr/local/nginx/html目錄下建立一個phpinfo.php檔案,内容如下:

<?php phpinfo(); ?>

然後通過浏覽器通路http://www.ixdba.net/index.html,預設會在浏覽器顯示“Welcome to Nginx!”表示Nginx正常運作。

接着在浏覽器中通路http://www.ixdba.net/phpinfo.php,如果PHP能夠正常解析,會出現PHP安裝配置以及功能清單統計資訊。