nginx和php之間是怎樣通信的呢?


  FastCGI原理

  FastCGI是一個運用於Http Server和動態腳本語言間通信的接口,多數流行的Http Server都支持FastCGI,包括Apache、Nginx和lighttpd等。同時,FastCGI也被許多腳本語言支持,其中就有PHP。 FastCGI接口方式采用C/S結構,可以將HttP服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。當HttP服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給客戶端。這種方式可以讓HttP服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。

  Nginx+php-fpm實現原理

  Nginx本身不會對PHP進行解析,終端對PHP頁面的請求將會被Nginx交給FastCGI進程監聽的IP地址及端口,由php-fpm作為動態解析服務器處理,最后將處理結果再返回給nginx。其實,Nginx就是一個反向代理服務器。Nginx通過反向代理功能將動態請求轉向后端php-fpm,從而實現對PHP的解析支持,這就是Nginx實現PHP動態解析的原理。

  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 簡單配置 

location ~ \.php$ { 
    root /home/admin/web/nginx/html/; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /home/admin/web/nginx/html/$fastcgi_script_name; 
    include fastcgi_params; 
}

  當nginx接收到一個http請求時,通過配置文件找到對應的server。然后匹配server中的所有location,找到最匹配的。而在location中的命令會啟動不同的模塊去完成工作,比如rewrite模塊、index模塊。因此在nginx中模塊可以看作真正的勞動工作者。nginx的模塊是被編譯到nginx中的,屬於靜態方式。啟動nginx時,模塊被自動加載。不像apache,把模塊單獨編譯成so文件,在配置文件中指定是否加載。所以,單比模塊加載方面,nginx也比apache速度上有提升。

  那nginx是怎么調用php的呢?先看下面的nginx中關於php的配置

 

location ~ \.php$ {
    root /webpath;
    fastcgi_pass 127.0.0.1:9000;
    ...
    ...         
}

  這個location指令把以php為文件后綴的請求,交給127.0.0.1:9000處理。我想你看到這個應該猜到了,這是一個C/S架構東西。 而這里的IP地址和端口(127.0.0.1:9000)就是fastcgi進程監聽的IP地址和端口。fastcgi是一個可伸縮地、高速地在http server和動態腳本語言間通信的接口。多數流行的http server都支持fastcgi,包括apache、nginx和lighttpd等。同時,fastcgi也被許多腳本語言支持,其中就有php。

那這個fastcgi的配置IP和端口從何而來呢?在php-fpm.conf中可以看到如下:

listen = 127.0.0.1:9000  #這個表示php的fastcgi進程監聽的ip地址以及端口
pm.start_servers = 2

  php-fpm作為fastcgi的進程管理器,可以有效控制內存和進程,並且平滑重載php配置。php5.3以后,php-fpm被集成到php的core中,默認安裝,無須配置。

  fastcgi進程管理器php-fpm自身初始化,啟動主進程php-fpm和啟動start_servers個fastcgi子進程。主進程php-fpm主要是管理fastcgi子進程,監聽9000端口,fastcgi子進程等待請求。當客戶端請求到達nginx時,nginx通過location指令,將所有以php為后綴的文件都交給 127.0.0.1:9000 來處理。php-fpm選擇並連接到一個fastcgi子進程,並將環境變量和標准輸入發送到fastcgi子進程。fastcgi子進程完成處理后將標准輸出和錯誤信息返回。當fastcgi子進程關閉連接時,請求便告處理完成,等待下次處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM