PHP+FastCGI+Nginx動態請求處理配置,fastcginginx
Nginx不支援對外部程式的調用,所以必須通過FastCGI介面實現對外部程式的調用從而實現對用戶端動態網頁面請求的處理。
CGI的英文全稱為Common Gateway Interface(公用網關介面),是Nginx和動態指令碼程式的橋樑,Nginx通過FastCGI介面將動態請求發送給FastCGI,FastCGI中的Wrapper進程產生一個線程,將請求交給指令碼解釋程式執行,然後通過原來的socket將解釋執行後的結果原路返回給Nginx,之後Nginx將結果交給用戶端。
Nginx是通過通訊端檔案socket來將動態請求發送給wrapper,使用的是Tcp協議。wrapper通過CGI介面來接受請求。這樣web伺服器和解釋程式之間完全可以獨立開發,這樣避免瞭解釋程式直接調用伺服器的介面而導致的出錯和崩潰以及安全性問題。而且可以使Nginx專心處理靜態頁面請求和轉寄動態請求,而將指令碼解譯器安裝在另一台伺服器,使伺服器的壓力得到分攤。
CGI是作為PHP程式的補丁開發的,安裝PHP首先安裝其所依賴的庫,之後在編譯配置參數時加入對CGI的支援--enable-fpm --enable-cgi等選項。編譯PHP的擴充模組,需要用到php中的phpize工具用來產生模組編譯時間的configure檔案,如果運行phpize時無法產生configure檔案,原因有:沒有安裝autoconf軟體包。
php-fpm進程的設定檔為/usr/local/php/etc/php-fpm.conf 可以對php-fpm進行相應的配置。
Nginx配置支援fastcgi:
location ~ \.php${
root html;
fastcgi_pass unix:/tmp/fastcgi.soke //通過通訊端檔案和cgi建立聯絡,該檔案在php-fpm.conf中設定
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME html$SCRIPT_FILE_NAME;設定參數
include fastcgi_params; //匯入fastcgi參數設定檔,該檔案在nginx安裝時自動產生。
}
php使用nginx怎擷取頭?
Nginx的http模組在處理HTTP請求時對環境變數的封裝與Apache有所不同。除了支援一些與HTTP協議相關的通用的變數之外,還支援一系列Nginx自有的變數,如Nginx配置目錄下fastcgi_params.default檔案裡的$server_protocol、$nginx_version等。正如這個檔案中的樣本的用途,這些變數可以在配置fastcgi時傳遞給cgi程式,使其可以作為cgi程式的環境變數來使用。然而,即便是Nginx有了這些自有的變數也無法完全滿足所有的需求。
瞭解Jquery的朋友會發現,Jquery在實現Ajax時會通過setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’)方法自動添加一個值為“xmlhttprequest”自訂的要求標頭”X-Requested-With”來標識這是一個Ajax請求,以期處理這個請求的後端能夠通過判斷這個標識來識別請求類型。那麼這個時候PHP是如何來擷取這個自訂參數的值的呢?
熟悉Apache和PHP的人一定會第一時間想到$_SERVER["HTTP_X_REQUESTED_WITH"],不錯,這對黃金搭配早就把這個問題給完美解決了,但Nginx卻不然,這是由Nginx對其自身工作的定位決定的——Nginx只負責HTTP。在Nginx眼裡,PHP只是它的一個後端,形象點來說,它只管分發請求,而不管發給誰。這就意味著,我們無法期待Nginx像Apache一樣給我們自動完成一些自訂參數到PHP的傳遞,只有自力更生。簡單點說就是,想要直接像$_SERVER["HTTP_X_REQUESTED_WITH"]這樣來調用自訂要求標頭參數的值的話,你就必須手工將其添加到fastcgi_params的配置中,明確告知cgi程式接收,否則Nginx會將其遺棄。
配置環境變數的方法可參照fastcgi_params.default這個檔案,在前面的部落格“Nginx下虛擬機器主機環境變數的配置方法”中也提到過。針對上述例子,只需在fastcgi_params檔案中增加一行即可:
?12 # for Ajax fastcgi_param HTTP_X_REQUESTED_WITH $http_x_requested_with;
這樣,重載Nginx配置後就可以之間在PHP中調用$_SERVER["HTTP_X_REQUESTED_WITH"]來判斷請求類型了。其中需要注意以下兩點:
一、自訂要求標頭部的名稱不應該包括空白、冒號、換行和底線。
Nginx在處理用戶端請求header頭時,會將名稱中的中橫線”-”替換為底線”_”,並將所有字母小寫再加上”$http_”來作為該名稱對應的變數名。例如上述Jquery的例子中setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’),在HTTP要求標頭中為一行字串:”X-Requested-With: xmlhttprequest”,經Nginx處理後將自動產生一個名為$http_x_requested_with的變數,其值為”xmlhttprequest”。尤其注意中橫線”-”替換為底線”_”這個規則,這意味著請求參數名稱中如果含有底線,Nginx將無法正確識別。
二、$_SERVER["HTTP_X_REQUESTED_WITH"]......餘下全文>>
Nginx怎配置可以讓html尾碼的檔案當php動態檔案執行?
nginx在處理請求的時候大致會經過如下階段:
讀取請求->根據要求標頭選擇一個server->載入配置->進行location路由->請求地址修正->存取權限預檢查->存取權限檢查->存取權限提交->配置項try_files處理->內容產生->日誌輸出。
你的問題可以再進行location路由的時候進行配置,增加一個配置項,讓所有以.html結尾的請求都路由到一個loaction中,該location通過fastpass把請求轉寄到後端的php-cgi處理。
在nginx.conf中增加配置:
location ~* .*\.html${ #phpcgi的連接埠,淡然也可採用unxi-socket格式 fastcgi_pass 127.0.0.1:8900; #...其他配置}這樣,所有以html結尾的請求都會路由到phpcgi由php-cgi來處理。