1. 程式人生 > >http server原理,nginx與php之間是如何工作的

http server原理,nginx與php之間是如何工作的

Nginx (“engine x”) 是一個高效能的 HTTP 和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本0.1.0釋出於2004年10月4日。其將原始碼以類BSD許可證的形式釋出,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名。— 百度百科

當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子程序關閉連線時,請求便告處理完成,等待下次處理。