1. 程式人生 > >nginx + fast-cgi + yaf 相關筆記

nginx + fast-cgi + yaf 相關筆記

使用yaf框架,往往安裝後啟動php/hhvm + 啟動nginx/Lighttpd,接著就是分層開發了,那幾者的關係是什麼呢?

做個筆記, 感謝 https://segmentfault.com/a/1190000007322358

 

幾個概念:

nginx:webserver,用於接受請求,分發,中文官網:http://www.nginx.cn/doc/index.html

php-fpm (php fast-cgi process manager):某種實現了fast-cgi協議的程序管理器

cgi: Common Gateway Interface 滿足這種協議的程式即可實現和webserver的通訊,

fast-cgi: 協議的升級版本

基本版本是webserver每收到一個請求,都會去fork一個cgi程序,請求結束再kill掉這個程序。這樣有10000個請求,就需要fork、kill php-cgi程序10000次

升級版本fast-cgi是每次處理完請求後,不會kill掉這個程序,而是保留這個程序,使這個程序可以一次處理多個請求

php-fpm的具體實現是程序管理器包含 master 程序和 worker 程序兩種程序。master 程序只有一個,負責監聽埠,接收來自 Web Server 的請求,而 worker 程序則一般有多個(具體數量根據實際需要配置),每個程序內部都嵌入了一個 PHP 直譯器,是 PHP 程式碼真正執行的地方。

 

cgi 協議主要是規範了輸入和輸出形式

 

處理請求的通用流程:

1. nginx.conf配置webserver引數, 請求PHP類應用可配置fastcgi_pass,指明監聽埠或socket地址

2. php-fpm.conf中listen地址與nginx.conf fastcgi_pass欄位配置一致,表明php-fpm worker程序監聽目標

3. 啟動後,請求先到達nginx server埠,分發到對應位置,若配置了fastcgi-pass,則被轉到對應埠或socket,php-fpm master程序監聽到,再建立fork worker程序實際執行,執行結束返回給nginx。

 www.example.com
        |
        |
      Nginx
        |
        |
路由到www.example.com/index.php
        | | 載入nginx的fast-cgi模組 | | fast-cgi監聽127.0.0.1:9000地址 | | www.example.com/index.php請求到達127.0.0.1:9000 | | php-fpm 監聽127.0.0.1:9000 | | php-fpm 接收到請求,啟用worker程序處理請求 | | php-fpm 處理完請求,返回給nginx | | nginx將結果通過http返回給瀏覽器 

後續:

由此再看yaf 框架,C實現,使用了webserver和php-fpm的話,實現了分層,按它的框架可快速實現請求處理(來源:http://www.laruence.com/manual/yaf.sequence.html

 

幾點反思:

實際需要實現分發效果到話,搭建nginx即可,無需框架,理解框架的作用是根據模組名分發URL

請求報錯,日誌顯示fast-cgi相關到話,可理解為PHP直譯器與nginx通訊存在問題,check相關配置