CGI與FastCGI nginx+PHP-FPM

本文轉載自CGI與FastCGIphp

1.當咱們在談到cgi的時候,咱們在討論什麼

最先的Web服務器簡單地響應瀏覽器發來的HTTP請求,並將存儲在服務器上的HTML文件返回給瀏覽器,也就是靜態html。事物老是不 斷髮展,網站也愈來愈複雜,因此出現動態技術。可是服務器並不能直接運行 php,asp這樣的文件,本身不能作,外包給別人吧,可是要與第三作個約定,我給你什麼,而後你給我什麼,就是握把請求參數發送給你,而後我接收你的處 理結果給客戶端。那這個約定就是 common gateway interface,簡稱cgi。這個協議能夠用vb,c,php,python 來實現。cgi只是接口協議,根本不是什麼語言。下面圖能夠看到流程
html

2.WEB服務器與cgi程序交互

WEB服務器將根據CGI程序的類型決定數據向CGI程序的傳送方式,通常來說是經過標準輸入/輸出流和環境變量來與CGI程序間傳遞數據。 以下圖所示:
python

CGI程序經過標準輸入(STDIN)和標準輸出(STDOUT)來進行輸入輸出。此外CGI程序還經過環境變量來獲得輸入,操做系統提供了許 多環境變量,它們定義了程序的執行環境,應用程序能夠存取它們。Web服務器和CGI接口又另外設置了一些環境變量,用來向CGI程序傳遞一些重要的參 數。CGI的GET方法還經過環境變量QUERY-STRING向CGI程序傳遞Form中的數據。 下面是一些經常使用的CGI環境變量:nginx

變量名 描述
CONTENT_TYPE 這個環境變量的值指示所傳遞來的信息的MIME類型。目前,環境變量CONTENT_TYPE通常都是:application/x-www-form-urlencoded,他表示數據來自於HTML表單。
CONTENT_LENGTH 若是服務器與CGI程序信息的傳遞方式是POST,這個環境變量即便從標準輸入STDIN中能夠讀到的有效數據的字節數。這個環境變量在讀取所輸入的數據時必須使用。
HTTP_COOKIE 客戶機內的 COOKIE 內容。
HTTP_USER_AGENT 提供包含了版本數或其餘專有數據的客戶瀏覽器信息。
PATH_INFO 這個環境變量的值表示緊接在CGI程序名以後的其餘路徑信息。它經常做爲CGI程序的參數出現。
CQUERY_STRING 若是服務器與CGI程序信息的傳遞方式是GET,這個環境變量的值即便所傳遞的信息。這個信息經跟在CGI程序名的後面,二者中間用一個問號'?'分隔。
REMOTE_ADDR 這個環境變量的值是發送請求的客戶機的IP地址,例如上面的192.168.1.67。這個值老是存在的。並且它是Web客戶機須要提供給Web服務器的惟一標識,能夠在CGI程序中用它來區分不一樣的Web客戶機。
REMOTE_HOST 這個環境變量的值包含發送CGI請求的客戶機的主機名。若是不支持你想查詢,則無需定義此環境變量。
REQUEST_METHOD 提供腳本被調用的方法。對於使用 HTTP/1.0 協議的腳本,僅 GET 和 POST 有意義。
SCRIPT_FILENAME CGI腳本的完整路徑
SCRIPT_NAME CGI腳本的的名稱
SERVER_NAME 這是你的 WEB 服務器的主機名、別名或IP地址。
SERVER_SOFTWARE 這個環境變量的值包含了調用CGI程序的HTTP服務器的名稱和版本號。例如,上面的值爲Apache/2.2.14(Unix)

3.一個例子

說了這麼多,你也許感受煩了,寫個小程序可能會更好的理解。 lighttpd + CGI,用c語言寫cgi程序 。web

lighttpd 配置 cgi, 打開cgi.conf, cgi.assign = (".cgi" => "") 設置 cgi 模塊的擴展名和解釋器。就本語句而言,表示cgi模塊的擴展名是「.cgi」且該 cgi 模塊不須要特別的解釋器來執行。由於用c來寫的是可執行文件。apache

下面是 test.c 代碼:小程序

#include "stdio.h"
#include "stdlib.h"
#include <string.h>

int mian()
{
     char *data;
     data = getenv("QUERY_STRING");
     puts(data);
     printf("Hello cgi!");

     return 0;
}

生成可執行文件放到你的服務器配置程序的目錄下瀏覽器

gcc test.c -o test.cgi

訪問:http://localhost/test.cgi?a=b&c=d 結果爲:服務器

a=b&c=d
Hello cgi!

經過環境變量"QUERY_STRING" 獲取get 方式提交的內容,若是想獲取post 提交的內容能夠經過getenv("CONTENT-LENGTH"),Web服務器在調用使用POST方法的CGI程序時設置此環境變量,它的文本值表示Web服務器傳送給CGI程序的輸入中的字符數目。上面例子展現了cgi 程序與web服務器的交互。併發

4.cgi 與 fastcgi

記得曾在xp 配置 apache + php ,會在apache 配置下面一段:

LoadModule php5_module C:/php/php5apache2_2.dll

當PHP須要在Apache服務器下運行時,通常來講,它能夠模塊的形式集成, 此時模塊的做用是接收Apache傳遞過來的PHP文件請求,並處理這些請求, 而後將處理後的結果返回給Apache。若是咱們在Apache啓動前在其配置文件中配置好了PHP模塊, PHP模塊經過註冊apache2的ap_hook_post_config掛鉤,在Apache啓動的時候啓動此模塊以接受PHP文件的請求。

Apache 的Hook機制是指:Apache 容許模塊(包括內部模塊和外部模塊,例如mod_php5.so,mod_perl.so等)將自定義的函數注入到請求處理循環中。 換句話說,模塊能夠在Apache的任何一個處理階段中掛接(Hook)上本身的處理函數,從而參與Apache的請求處理過程。 mod_php5.so/ php5apache2.dll就是將所包含的自定義函數,經過Hook機制注入到Apache中,在Apache處理流程的各個階段負責處理php請 求。

有人測試nginx+PHP-FPM在高併發狀況下可能會達到Apache+mod_php5的5~10倍,如今nginx+PHP-FPM使用的人愈來愈多。

相關文章
相關標籤/搜索