PHP-FPM與Nginx的通信機制是什么?這個問題可能是我們?nèi)粘W習或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
公司主營業(yè)務:網(wǎng)站設(shè)計制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出湘橋免費做網(wǎng)站回饋大家。每種動態(tài)語言( PHP,Python 等)的代碼文件需要通過對應的解析器才能被服務器識別,而 CGI 協(xié)議就是用來使解釋器與服務器可以互相通信。PHP 文件在服務器上的解析需要用到 PHP 解釋器,再加上對應的 CGI 協(xié)議,從而使服務器可以解析到 PHP 文件。
由于 CGI 的機制是每處理一個請求需要 fork 一個 CGI 進程,請求結(jié)束再kill掉這個進程,在實際應用上比較浪費資源,于是就出現(xiàn)了CGI 的改良版本 FastCGI,F(xiàn)astCGI 在請求處理完后,不會 kill 掉進程,而是繼續(xù)處理多個請求,這樣就大大提高了效率。
PHP-FPM 即 PHP-FastCGI Process Manager, 它是 FastCGI 的實現(xiàn),并提供了進程管理的功能。進程包含 master 進程和 worker 進程兩種;master 進程只有一個,負責監(jiān)聽端口,接收來自服務器的請求,而 worker 進程則一般有多個(具體數(shù)量根據(jù)實際需要進行配置),每個進程內(nèi)部都會嵌入一個 PHP 解釋器,是代碼真正執(zhí)行的地方。
當我們訪問一個網(wǎng)站(如 www.test.com)的時候,處理流程是這樣的:
www.test.com | | Nginx | | 路由到 www.test.com/index.php | | 加載 nginx 的 fast-cgi 模塊 | | fast-cgi 監(jiān)聽 127.0.0.1:9000 地址 | | www.test.com/index.php 請求到達 127.0.0.1:9000 | | 等待處理...
【相關(guān)文章推薦:Nginx教程】
在 Linux 上,nginx 與 php-fpm 的通信有 tcp socket 和 unix socket 兩種方式。
tcp socket 的優(yōu)點是可以跨服務器,當 nginx 和 php-fpm 不在同一臺機器上時,只能使用這種方式。
Unix socket 又叫 IPC(inter-process communication 進程間通信) socket,用于實現(xiàn)同一主機上的進程間通信,這種方式需要在 nginx配置文件中填寫 php-fpm 的 socket 文件位置。
兩種方式的數(shù)據(jù)傳輸過程如下圖所示:
二者的不同:
由于 Unix socket 不需要經(jīng)過網(wǎng)絡協(xié)議棧,不需要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數(shù)據(jù)從一個進程拷貝到另一個進程。所以其效率比 tcp socket 的方式要高,可減少不必要的 tcp 開銷。不過,unix socket 高并發(fā)時不穩(wěn)定,連接數(shù)爆發(fā)時,會產(chǎn)生大量的長時緩存,在沒有面向連接協(xié)議的支撐下,大數(shù)據(jù)包可能會直接出錯不返回異常。而 tcp 這樣的面向連接的協(xié)議,可以更好的保證通信的正確性和完整性。
Nginx 與 php-fpm 結(jié)合只需要在各自的配置文件中做設(shè)置即可:
1) Nginx 中的配置
以 tcp socket通信為例
server { listen 80; #監(jiān)聽 80 端口,接收http請求 server_name www.test.com; #就是網(wǎng)站地址 root /usr/local/etc/nginx/www/huxintong_admin; # 準備存放代碼工程的路徑 #路由到網(wǎng)站根目錄 www.test.com 時候的處理 location / { index index.php; #跳轉(zhuǎn)到 www.test.com/index.php autoindex on; } #當請求網(wǎng)站下 php 文件的時候,反向代理到 php-fpm location ~ \.php$ { include /usr/local/etc/nginx/fastcgi.conf; #加載 nginx 的 fastcgi 模塊 fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; # tcp 方式,php-fpm 監(jiān)聽的 IP 地址和端口 # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 連接方式 } }
2) php-fpm 的配置
listen = 127.0.0.1:9000 # 或者下面這樣 listen = /var/run/php-fpm.sock
注意,在使用 unix socket 方式連接時,由于 socket 文件本質(zhì)上是一個文件,存在權(quán)限控制的問題,所以需要注意 nginx 進程的權(quán)限與 php-fpm 的權(quán)限問題,不然會提示無權(quán)限訪問。(在各自的配置文件里設(shè)置用戶)
通過以上配置即可完成 php-fpm 與 nginx 的通信。
如果是在同一臺服務器上運行的 nginx 和 php-fpm,且并發(fā)量不高(不超過1000),選擇unix socket,以提高 nginx 和 php-fpm 的通信效率。
如果是面臨高并發(fā)業(yè)務,則考慮選擇使用更可靠的 tcp socket,以負載均衡、內(nèi)核優(yōu)化等運維手段維持效率。
若并發(fā)較高但仍想用 unix socket 時,可通過以下方式提高 unix socket 的穩(wěn)定性。
1)將sock文件放在 /dev/shm 目錄下,此目錄下將 sock 文件放在內(nèi)存里面,內(nèi)存的讀寫更快。
2)提高 backlog
backlog 默認位 128,1024 這個值換成自己正常的 QPS,配置如下。
nginx.conf 文件中
server { listen 80 default backlog = 1024; }
php-fpm.conf 文件中
listen.backlog = 1024
3)增加 sock 文件和 php-fpm 實例
在 /dev/shm 新建一個 sock 文件,在 nginx 中通過 upstream 模塊將請求負載均衡到兩個 sock 文件,并且將兩個 sock 文件分別對應到兩套 php-fpm 實例上。
感謝各位的閱讀!看完上述內(nèi)容,你們對PHP-FPM與Nginx的通信機制是什么大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。