Nginx與Apache解析php文件的區別

一、Apache是如何解析php文件的

我們常說的lamp架構是linux、apache、mysql、php,我們知道任何架構或者網站離不開數據庫的支持,那麼php和apache又是如何協同工作的呢?

php是apache的一個外掛程序,必須依靠web服務器纔可以運行。當客戶端瀏覽器觸發事件--->php程序提交到apache服務器---->apache服務器根據php程序的特點判斷是php程序,並從內存或者硬盤中提取訪問所需要的應用程序,將其提交給php引擎程序--->php引擎程序解析並讀取數據庫生成相應的頁面--->php引擎將html頁面返回給web服務器,web服務器再將頁面返回給客戶端。

大致上這就是apache和php交互工作的過程。apache單獨不能處理php代碼,php(php 應用程序服務器)不能單獨存在的,需要以apache爲依託。也可以說php是apache功能模塊的一種擴展,php作爲apache的外掛,用於解 析php代碼。經過解析的動態網頁此時就不存在<?php ?>了。當apache服務啓動的同時也啓動了php。也就是說php必須和apache安裝在同一臺服務器上,不可以分割。需要注意的是,mysql與apache無關,只是在響應php代碼中的sql操作的時候才被訪問。不需要與apache安裝在同一臺服務器上,可以單獨存在,只需php遠程連接即可。

php作爲一個動態的、共享的模塊被apache調用,在啓動apache時,自動加載。

二、nginx是如何解析php文件的呢?

要想搞清楚nginx是如何與php協同工作的,先來了解一下cgi和fastcgi兩個協議。CGI:common gateway interface,是web server與後臺編程語言交互的一種協議。有了這個協議,開發者可以使用任何語言處理 Web Server 發來的請求,動態的生成內容。但 CGI 有一個致命的缺點,那就是每處理一個請求都需要 fork 一個全新的進程,隨着 Web 的興起,高併發越來越成爲常態,這樣低效的方式明顯不能滿足需求。就這樣,FastCGI 誕生了,CGI 很快就退出了歷史的舞臺。FastCGI,顧名思義爲更快的 CGI,它允許在一個進程內處理多個請求,而不是一個請求處理完畢就直接結束進程,性能上有了很大的提高。

PHP-CGI是PHP自帶的FASTCGI管理器,但有很多的缺點。FPM同樣也是fastcgi的實現,相比php-cgi有很多的優點。到了PHP5.3.3已經集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置,只需要在./configure時,加上--enable-fpm。

FPM 是一個 PHP 進程管理器,包含 master 進程和 worker 進程兩種進程:master 進程只有一個,負責監聽端口,接收來自 Web Server 的請求,而 worker 進程則一般有多個 (具體數量根據實際需要配置),每個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。

從 FPM 接收到請求,到處理完畢,其具體的流程如下:

1.FPM 的 master 進程接收到請求

2.master 進程根據配置指派特定的 worker 進程進行請求處理,如果沒有可用進程,返回錯誤,這也是我們配合 Nginx 遇到502錯誤比較多的原因。

3.worker 進程處理請求,如果超時,返回504錯誤

4.請求處理結束,返回結果

FPM 從接收到處理請求的流程就是這樣了,那麼Nginx 又是如何發送請求給fpm 的呢?這就需要Nginx 層面來說明了。

我們知道,Nginx 不僅僅是一個Web 服務器,也是一個功能強大的Proxy 服務器,除了進行http 請求的代理,也可以進行許多其他協議請求的代理,包括本文與fpm 相關的fastcgi 協議。爲了能使Nginx 理解fastcgi 協議,Nginx 提供了fastcgi 模塊來將http 請求映射爲對應的 fastcgi 請求。

Nginx 的fastcgi 模塊提供了fastcgi_param 指令來主要處理這些映射關係,除此之外,非常重要的就是 fastcgi_pass 指令了,這個指令用於指定 fpm 進程監聽的地址,Nginx 會把所有的 php 請求翻譯成 fastcgi 請求之後再發送到這個地址。

location ~ \.php$ {

include fastcgi_params;

fastcgi_pass unix:/tmp/www.sock;

#fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;

}

在這個配置文件中,/tmp/www.sock  是php-fpm監聽的socket文件,nginx通過location將所有的php文件,即http請求都交給fpm處理,實現了nginx和php的協同工作。

換言之,nginx就是作了fastcgi的一個代理,用fastcgi的方式結合使用了php。所以,需要開啓php-fpm服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章