Nginx與PHP是如何進行互動的

2021-10-23 17:38:38 字數 3908 閱讀 2643

nginx與php的互動

fastcgi模組模組允許nginx同fastcgi協同工作,並且控制哪些引數將被安全傳遞

1、什麼是cgi傳統cgi介面方式的主要缺點是效能很差,因為每次http伺服器遇到動態程式時都需要重新啟動指令碼解析器來執行解析,然後將結果返回給http伺服器。這在處理高併發訪問時幾乎是不可用的,另外傳統的cgi介面方式安全性也很差,現在已經很少使用了。

2、什麼是 fastcgi

fastcgi是乙個可伸縮地、高速地在http server和動態指令碼語言間通訊的介面。多數流行的http server都支援fastcgi,包括apache、nginx和lighttpd等。同時fastcgi也被許多指令碼語言支援,其中就有php。fastcgi是從cgi發展改進而來的。

fastcgi介面方式採用c/s結構,可以將http伺服器和指令碼解析伺服器分開,同時在指令碼解析伺服器上啟動乙個或者多個指令碼解析守護程序。當http伺服器每次遇到動態程式時,可以將其直接交付給fastcgi程序來執行,然後將得到的結果返回給瀏覽器。

這種方式的優點:可以讓http伺服器專一地處理靜態請求或者將動態指令碼伺服器的結果返回給客戶端,這在很大程度上提高了整個應用系統的效能。

1、執行原理

nginx不支援對外部程式的直接呼叫或者解析,所有的外部程式(包括php)必須通過fastcgi介面來呼叫。fastcgi介面在linux下是socket(這個socket可以是檔案socket,也可以是ip socket)。

nginx是個輕量級的http server,必須借助第三方的fastcgi處理器才可以對php進行解析,因此其實這樣看來nginx是非常靈活的,它可以和任何第三方提供解析的處理器實現連線從而實現對php的解析(在nginx.conf中很容易設定)。

fastcgi介面方式在指令碼解析伺服器上啟動乙個或者多個守護程序對動態指令碼進行解析,這些程序就是fastcgi程序管理器,或者稱為fastcgi引擎。spawn-fcgi與php-fpm就是支援php的兩個fastcgi程序管理器。因此httpserver完全解放出來,可以更好地進行響應和併發處理。

fastcgi 的主要優點是把動態語言和http server分離開來,所以nginx與php/php-fpm經常被部署在不同的伺服器上,以分擔前端nginx伺服器的壓力,使nginx專一處理靜態請求和**動態請求,而php/php-fpm伺服器專一解析php動態請求。

php-fpm是管理fastcgi的乙個管理器,它作為php的外掛程式存在,在安裝php要想使用php-fpm時在老php的老版本(php5.3.3之前)就需要把php-fpm以補丁的形式安裝到php中,而且php要與php-fpm版本一致,這是必須的)

php-fpm其實是php源**的乙個補丁,旨在將fastcgi程序管理整合進php包中。必須將它patch到你的php源**中,在編譯安裝php後才可以使用。

php5.3.3已經整合php-fpm了,不再是第三方的包了。php-fpm提供了更好的php程序管理方式,可以有效控制記憶體和程序、可以平滑過載php配置,比spawn-fcgi具有更多優點,所以被php官方收錄了。

在./configure的時候帶 –enable-fpm引數即可開啟php-fpm。fastcgi已經在php5.3.5的core中了,不必在configure時新增 --enable-fastcgi了。老版本如php5.2的需要加此項。

配置資訊

關於fastcgi的配置檔案,目前fastcgi的配置檔案一般放在nginx.conf同級目錄下,配置檔案形式,一般有兩種:fastcgi.conf 和 fastcgi_params。不同的nginx版本會有不同的配置檔案,這兩個配置檔案有乙個非常重要的區別:

fastcgi_parames檔案中缺少下列配置:

fastcgi_param script_filename document_rootfastcgi_script_name;
我們可以開啟fastcgi_parames檔案加上上述行,也可以在要使用配置的地方動態新增。使得該配置生效。

當我們安裝nginx和php-fpm完後,

php-fpm的預設配置php-fpm.conf:

listen_address 127.0

.0.1

:9000 #這個表示php的fastcgi程序監聽的ip位址以及埠

start_servers

min_spare_servers

max_spare_servers

nginx配置執行php:

location ~ \.php$
nginx通過location指令,將所有以php為字尾的檔案都交給127.0.0.1:9000來處理,而這裡的ip位址和埠就是fastcgi程序監聽的ip位址和埠。

輸入命令

netstat -nlpt|grep php-fpm
會得到:

tcp 0 0 127.0.0.1:9000 0.0.0.0:* listen 1057/php-fpm 這裡的127.0.0.1:9000

就是監聽本機9000埠的意思。

整體工作流程:

1)、fastcgi程序管理器php-fpm自身初始化,啟動主程序php-fpm和啟動start_servers個cgi 子程序。主程序php-fpm主要是管理fastcgi子程序,監聽9000埠。fastcgi子程序等待來自web server的連線。

2)、當客戶端請求到達web server nginx是時,nginx通過location指令,將所有以php為字尾的檔案都交給127.0.0.1:9000來處理,即nginx通過location指令,將所有以php為字尾的檔案都交給127.0.0.1:9000來處理。

3)fastcgi程序管理器php-fpm選擇並連線到乙個子程序cgi直譯器。web server將cgi環境變數和標準輸入傳送到fastcgi子程序。

4)、fastcgi子程序完成處理後將標準輸出和錯誤資訊從同一連線返回web server。當fastcgi子程序關閉連線時,請求便告處理完成。

5)、fastcgi子程序接著等待並處理來自fastcgi程序管理器(執行在 webserver中)的下乙個連線。

簡單來說,當需要處理php請求時,nginx的worker程序會將請求移交給php-fpm的worker程序進行處理,也就是最開頭所說的nginx呼叫了php,其實嚴格得講是nginx間接呼叫php。

nginx和php-fpm的程序間通訊有兩種方式:

一種是tcp

一種是unix domain socket.

其中tcp是ip加埠,可以跨伺服器。而unix domain socket不經過網路,只能用於nginx跟php-fpm都在同一伺服器的場景。

用哪種取決於你的php-fpm配置:

方式1:

php-fpm.conf: listen =

127.0

.0.1

:9000

nginx.conf: fastcgi_pass 127.0

.0.1

:9000

;

方式2:

php-fpm.conf: listen =

/tmp/php-fpm.sock

nginx.conf: fastcgi_pass unix:

/tmp/php-fpm.sock;

其中php-fpm.sock是乙個檔案,由php-fpm生成,型別是srw-rw----。

nginx Location是如何進行匹配的

location三種匹配 精準匹配 一般匹配 正則表達 精準匹配優先順序最高 location patt 例子 location php location 裡面如果不寫root 會繼承系統預設的配置 location匹配流程 1優先精準匹配 返回精準匹配結果並結束 2如果沒有匹配上看是否普通匹配命中...

Nginx負載均衡如何進行配置

nginx負載均衡是乙個很神奇的技術,很多人都不能很好的掌握這個技術,今天在這裡我們向大家詳細的介紹下有關nginx負載均衡的問題。今天小試了一下nginx負載均衡,真是爽啊!nginx是什麼?nginx engine x 是乙個高效能的 http 和 反向 伺服器,也是乙個 imap pop3 s...

php注釋前面 PHP如何進行注釋

在 中進行注釋是很有必要的,規範的注釋使的源 更易於人類理解,可以幫助我們理解別人或者自己以前編寫的 那麼如何進行 注釋?本篇文章就來給大家介紹在php中進行注釋的幾種方法,希望對大家有所幫助。在php中可以進行兩種型別的注釋 單行注釋 每行必須單獨使用注釋標記,稱為單行注釋。它用於進行簡短說明。單...