nginx: fastcgi_pass的配置

在作nginx配置過程當中,對於在與php-fpm選擇哪一種通訊模式有些疑問,故補充相關知識點並記錄於此。
說明fastcgi_pass的配置問題前,先理解幾個概念:php

CGI ( Common Gateway Interface )公共網關接口,是web服務器與外部應用程序進行通訊交互的標準接口。CGI規範定義了web服務器如何向外部應用程序發送消息,在接收到外部應用程序的信息後又如何進行處理等內容。咱們一般所說的CGI是實現了CGI標準接口的程序。只要某種語言具備標準輸入、輸出、環境變量(如C、perl、php),就能夠用來編寫CGI程序。
web服務器通常只處理靜態文件請求(如jpg、html),當接收到動態腳本請求(如php),web服務器主進程就會fork一個新的進程來啓動CGI程序(如php-cgi,啓動過程當中須要讀取配置文件,加載擴展等),啓動後根據請求提交的參數進行相應的處理(如解析php),並將處理結果(如輸出標準的html)返回給web服務器,web服務器再將內容發送給客戶端,而後關閉CGI進程。
CGI減小了web服務器與外部應用程序的關聯,讓他們更爲獨立,可是每次請求都須要fork一個新進程去啓動CGI程序,處理完以後進程隨之關閉,這種方式效率十分低下,過多的進程會消耗資源和內存。
FastCGI 像是一個常駐型的CGI程序,能夠一直運行着,不會每次請求都fork一個進程。它支持分佈式運算,能夠跟web服務器部署在不一樣的主機中,接受來自其餘web服務器的請求。
FastCGI進程管理器是須要單獨啓動的,啓動後生成一個FastCGI主進程和多個CGI的解釋器進程。web服務器接收到動態腳本請求時,會把請求交給FastCGI主進程,由主進程分配給一個空閒的子進程進行解析處理,處理完成後將結果返回給web服務器,客戶端再將結果發送給客戶端。處理完成後FastCGI子進程不會關閉,而是繼續等待主進程分配任務。
這樣它就能夠將CGI子進程保持在內存中並所以得到高效的性能。

fastcgi.png

php-fpm fpm(fastcgi process manager)是fastcgi進程管理器的簡稱。它是php中的fastCGI協議的具體實現,負責管理一個進程池,處理來自web服務器的請求,有效控制內存和進程,能夠平滑重載php的配置(經過生成新的子進程能夠實現php.ini修改後的平滑重啓)。它在PHP5.3以後,開始內置於PHP。

Nginx處理PHP請求就是經過與php-fpm進程間通訊實現的。nginx與php-fpm進程間的通訊有兩種方式,用哪一種取決你的php-fpm的配置:html

  • TCP

TCP是IP加端口,能夠用於跨服務器。配置以下:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass = 127.0.0.1:9000nginx

  • UNIX Domain Socket

不通過網絡,只能用於nginx和php-fpm在同一個服務器場景。配置以下:
php-fpm.cnf: listen = /run/php/php-fpm.sock
nginx.conf: listen = unix:/run/php/php-fpm.sock
其中php-fpm.sock是一個文件,由php-fpm生成web

UNIX Domain Socket可用於兩個沒有親緣關係的進程,是目前比較普遍使用的IPC機制,這種通訊方式是發生在系統內核裏而不會在網絡中傳播,它不會走到TCP的那一層,直接以文件形式,以stream socket通訊,避免頻繁建立TCP短連接而致使TIME_WAIT鏈接過多的問題。
nginx1.png服務器

若是是TCP Socket則須要走到IP層,對於非同一臺服務器上,TCP就須要走得更多。
TCP Socket(本地迴環)
nginx2.png網絡

TCP Socket(nginx與php-fpm在不一樣的服務器)
nginx3.pngsocket

相關文章
相關標籤/搜索