參考
nginx php php-fpm cgi fastcgi 等等它們之間的關係讓人糊塗,google一天發現有不少介紹的好文章,不過都是各說各的不免讓人抓狂,特此將上面幾位前輩的文章重新整理了一下,本著拿 來主義思想(汗),照搬了原作者的部分文章,並加入了自己的想法,思路清晰了不少,再次感謝前輩無私奉獻!!
nginx 為什麼要通過fastcgi來解析php
一般,web server對php的支援方式有這麼三種:
通過web server內建的模組來實現,比如apache的mod_php模組 ,但是nginx沒有這種模組。
通過cgi方式,該種方式的缺點是效能差,因為每次伺服器遇到這些指令碼都需要重新啟動指令碼解析器來執行指令碼然後將結果返回給伺服器;另一方面就是不太安全;該方發幾乎很少使用了。
fastcgi,fastcgi就是對cgi的改進,一般採用c/s結構,一般指令碼處理器會啟動乙個或者多個daemon程序,每次nginx遇到php指令碼的時候,直接交付給fastcgi的程序來執行,然後將得到的結果返回給瀏覽器。
什麼是 cgi
全稱是」公共閘道器介面」(common gateway inte***ce),web server與你的或其它機器上的程式進行「交談」的一種工具,其程式須執行在web server上。
cgi可以用任何一種語言編寫, 只要這種語言具有標準輸入、輸出和環境變數,如php,perl,tcl等。
什麼是 fastcgi
fastcgi 是乙個可伸縮、高速的在web server和指令碼語言間通迅的介面。
fastcgi 被許多指令碼語言所支援,包括 php,如果用 --enable-fastcgi 選項編譯的話。
多數流行的web server都支援 fastcgi,包括apache(mod_fastcgi和mod_fcgid),zeus,nginx和lighttpd。
fastcgi 的主要優點是把動態語言和 web server 分離開來。這種技術允許 web server 和動態語言執行在不同的主機上。這可以改進可擴充套件性和安全性而沒有大的效率損失。
php-fpm可以和任何支援外部 fastcgi 技術的 web server 一起使用(比如nginx)。
舉個列子
比如我有一台lnmp(nginx mysql php)伺服器負載很高,現在又有了三個伺服器 ,將原本的lnmp 現在分拆成三颱伺服器,按應用分成了三部分,當然了這裡沒有考慮成本,不過在結合虛擬化技的情況下,按應用分拆的好處是非常大的,除了可以給web ,db 做負載均衡與高可用是不是某天我們的php-fpm 也可以lb與ha?
www1 web server nginx
php1 php_script server php(php-fpm)
db1 mysql server mysql
php-fpm、spawn-fcgi php-cgi都是fastcgi管理器。
什麼是php-cgi
php-cgi是php自帶的fastcgi管理器。
啟動php-cgi,使用如下命令:
php-cgi -b 127.0.0.1:9000
php-cgi的不足
1、php-cgi變更php.ini配置後需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟
2、直接殺死php-cgi程序,php就不能執行了。(php-fpm和spawn-fcgi就沒有這個問題,守護程序會平滑從新生成新的子程序。)
什麼是spawn-fcgi
spawn-fcgi是乙個通用的fastcgi管理伺服器, 它是lighttpd中的一部份,很多人都用lighttpd的spawn- fcgi進行fastcgi模式下的管理工作,不過有不少缺點。而php-fpm的出現多少緩解了一些問題,但php-fpm有個缺點就是要重新編譯,這 對於一些已經執行的環境可能有不小的風險(refer),不過在php 5.3.*中可以直接使用php-fpm了。
spawn-fcgi目前已經獨成為乙個專案,更加穩定一些,也給很多web 站點的配置帶來便利。已經有不少站點將它與nginx搭配來解決動態網頁。
什麼是 php-fpm
php-fpm其實是php源**的乙個補丁,旨在將fastcgi程序管理整合進php包中,必須將它patch到你的php源**中,在編譯安裝php後才可以使用。
php5.3.* 中已經整合php-fpm了,不再是第三方的包了,php-fpm提供了更好的php程序管理方式,可以有效控制記憶體和程序、可以平滑過載php配置,比 spawn-fcgi具有更多優點,所以被php官方收錄了,在./configure的時候帶 --enable-fpm引數即可開啟php-fpm。
下面是關於啟用 fastcgi sapi 時的問題和 php-fpm 是如何解決他們的對比列表。
描述php自帶的
spawn-fcgi + spawn-php.sh + daemontools
php-fpm
php守護程序化: pid file, log file, setsid(), setuid(), setgid(), chroot()
(-)(+)
(+)程序管理。可以用 "graceful" 來停止並啟動 php worker 程序而不會丟失請求。能夠平滑地公升級配置和二進位制程式而不丟失任何請求。
php4 (-), php5 (只有 graceful)
(-)(+)
php4 (-) php5 (+) (從 5.2.2 開始)
(-)(+)
根據負載動態調整程序數
(-)(-)
todo
用不同的 uid/gid/chroot/environment 和不同的 php.ini 選項啟動 worder 程序。你不需要 safe mode 了!
(-)(-)
(+)記錄 worker 程序 stdout 和 stderr 日誌
(-)(-)
(+)如果使用優化器,在共享記憶體意外破壞的情況下緊急重啟所有的程序
(-)(-)
(+)如果 set_time_limit() 失敗,確保程序會結束
(-)(-)
(+)特色功能 error header、優化的上傳支援、fastcgi_finish_request()
至此 我已經明白了它們之間的關係了!!!
下面是php-fpm的進一步介紹!!
logs/slow.log
向php-fpm作者致敬
關於
嗨,我的名字叫 andrei nigmatulin, 我是 php-fpm 的作者。
從 2004 年開始,我就在等有什麼人讓 php fastcgi 能滿足產品環境,但我等不下去了。
php-fpm 是在數個專案種使用 php 的 fastcgi sapi 中的知識、經驗和想法的產物。
php-fpm 可以在 gpl 協議下用在公共用途。和 php-fpm 繫結的修改版的 libevent 是在 bsd 協議下發布的。
我需要得到您的反饋——新的想法和建議——來改進和優化 php fastcgi sapi。 如果您有什麼想法、意見、補充和建議,我會很高興,很原意聽取,也許還會實現他們。給給我發郵件吧。(位址在本頁的末尾)。
如果你想支援 php-fpm 的開發,可以作一些捐贈: paypal yandex.money
15/05/2007 - 第一次提交到 php-fpm.
andrei dot nigmatulin at gmail dot com
譯註:php-fpm還帶有乙個更方便的指令碼,在$prefix/sbin/php-fpm。可以用php-fpm start|graceful|restart|stop來維護。稍編輯一下就可以讓它使用配置檔案。
nginx 筆記分享 1
nginx 優點太多了google會有一大堆 這裡就不羅嗦了,下面主要講的lnmp安裝整合等等,軟體都是目前比較新的穩定版本!整個安裝過程將整理成安裝指令碼。nginx 需要一些第三方庫的支援,比如gzip模組 需要zlib庫,還有我們最常用的rewrite模組需要pcre庫,根據需要需先安裝這些庫...
XML 2 筆記分享
解析xml 生成dom物件 saxreader reader newsaxreader document document reader.read resources books.xml 獲得根節點 element rootele document.getrootelement 獲得根節點下所有bo...
hook筆記分享
見多了前端各種js的混淆,引數的加密,雖然抓包會拿到最後的結果,但是一步步分析是真的折磨人,像一些噁心的sojson混淆,可能會讓人看著各種引數而頭皮發麻。這裡分享一些常用的hook js的方法,與反爬一起進步!hook window物件的 pt 屬性的設定與取值 function set func...