PHP-FPM 與 Nginx 的通信機制總結

PHP-FPM 介紹

CGI 協議與 FastCGI 協議

每種動態語言( PHP,Python 等)的代碼文件需要通過對應的解析器才能被服務器識別,而 CGI 協議就是用來使解釋器與服務器可以互相通信。PHP 文件在服務器上的解析需要用到 PHP 解釋器,再加上對應的 CGI 協議,從而使服務器可以解析到 PHP 文件。

由于 CGI 的機制是每處理一個請求需要 fork 一個 CGI 進程,請求結束再kill掉這個進程,在實際應用上比較浪費資源,于是就出現了CGI 的改良版本 FastCGI,FastCGI 在請求處理完后,不會 kill 掉進程,而是繼續處理多個請求,這樣就大大提高了效率。

PHP-FPM 是什么

PHP-FPM 即 PHP-FastCGI Process Manager, 它是 FastCGI 的實現,并提供了進程管理的功能。進程包含 master 進程和 worker 進程兩種;master 進程只有一個,負責監聽端口,接收來自服務器的請求,而 worker 進程則一般有多個(具體數量根據實際需要進行配置),每個進程內部都會嵌入一個 PHP 解釋器,是代碼真正執行的地方。

Nginx 與 php-fpm 通信機制

當我們訪問一個網站(如 www.test.com)的時候,處理流程是這樣的:

  www.test.com||Nginx||
路由到 www.test.com/index.php||
加載 nginx 的 fast-cgi 模塊||
fast-cgi 監聽 127.0.0.1:9000 地址||
www.test.com/index.php 請求到達 127.0.0.1:9000||等待處理...

Nginx 與 php-fpm 的結合

在 Linux 上,nginx 與 php-fpm 的通信有 tcp socket 和 unix socket 兩種方式。

tcp socket 的優點是可以跨服務器,當 nginx 和 php-fpm 不在同一臺機器上時,只能使用這種方式。

Unix socket 又叫 IPC(inter-process communication 進程間通信) socket,用于實現同一主機上的進程間通信,這種方式需要在 nginx配置文件中填寫 php-fpm 的 socket 文件位置。

兩種方式的數據傳輸過程如下圖所示:

二者的不同:

由于 Unix socket 不需要經過網絡協議棧,不需要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數據從一個進程拷貝到另一個進程。所以其效率比 tcp socket 的方式要高,可減少不必要的 tcp 開銷。不過,unix socket 高并發時不穩定,連接數爆發時,會產生大量的長時緩存,在沒有面向連接協議的支撐下,大數據包可能會直接出錯不返回異常。而 tcp 這樣的面向連接的協議,可以更好的保證通信的正確性和完整性。

Nginx 與 php-fpm 結合只需要在各自的配置文件中做設置即可:

1) Nginx 中的配置

以 tcp socket通信為例

server {listen       80; #監聽 80 端口,接收http請求server_name  www.test.com; #就是網站地址root /usr/local/etc/nginx/www/huxintong_admin; # 準備存放代碼工程的路徑#路由到網站根目錄 www.test.com 時候的處理location / {index index.php; #跳轉到 www.test.com/index.phpautoindex on;}   #當請求網站下 php 文件的時候,反向代理到 php-fpmlocation ~ \.php$ {include /usr/local/etc/nginx/fastcgi.conf; #加載 nginx 的 fastcgi 模塊fastcgi_intercept_errors on;fastcgi_pass   127.0.0.1:9000; # tcp 方式,php-fpm 監聽的 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 文件本質上是一個文件,存在權限控制的問題,所以需要注意 nginx 進程的權限與 php-fpm 的權限問題,不然會提示無權限訪問。(在各自的配置文件里設置用戶)

通過以上配置即可完成 php-fpm 與 nginx 的通信。

在應用中的選擇

如果是在同一臺服務器上運行的 nginx 和 php-fpm,且并發量不高(不超過1000),選擇unix socket,以提高 nginx 和 php-fpm 的通信效率。
如果是面臨高并發業務,則考慮選擇使用更可靠的 tcp socket,以負載均衡、內核優化等運維手段維持效率。

若并發較高但仍想用 unix socket 時,可通過以下方式提高 unix socket 的穩定性。

1)將sock文件放在 /dev/shm 目錄下,此目錄下將 sock 文件放在內存里面,內存的讀寫更快。

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 實例上。

個人總結,若有不對,敬請指正~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280470.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280470.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280470.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android——監聽事件總結

各種監聽事件 1.按鈕 Button(1)點擊監聽btn_1.setOnClickListener(new View.OnClickListener() { (2)長按監聽btn_1.setOnLongClickListener(new View.OnLongClickListener() { 2.單選框 RadioGroupradio_gp.setOnCheckedChangeLi…

ChatGPT 大智近妖,從宇宙人生到手搓光刻機,從哄女朋友到寫年終總結我們聊得非常開心,反而讓人越來越憂心...

都說 ChatGPT 要干掉程序員,清理搜索引擎,取代Stack Overflow,還能消滅人類,這些有些言過其實了。ChatGPT 的定位是一個人工智能助理,它說,它的主要目的是通過回答用戶的問題,為用戶提供幫助。在…

如何在Windows Defender中安排掃描

Windows Defender automatically performs background scans during your PC’s idle moments, but doesn’t include an easy way to schedule a full scan. There is a way to do it, though. Windows Defender在PC空閑時自動執行后臺掃描,但是沒有包括安排完整掃…

復習深入筆記02:魔法方法/cookie,session,token/異常

魔法方法 對象生成 1.先調用__new__方法,生成空對象。控制對象生成。 2.當執行“對象類名(namelqz)”,觸發類的__init__()

比特熊故事匯獨家 | .NET 感恩專場

點擊上方藍字關注我們(本文閱讀時間:15分鐘)大家好!我是愛吃、愛玩、更愛學習技術,IT界新晉小紅人,開發者的好朋友——比特熊!比特熊:本期故事匯是.NET專場,今天一次性邀請到DOTNET領…

Ubuntu Core 給物聯網提供更多安全支持

開發四年只會寫業務代碼,分布式高并發都不會還做程序員? Canonical 是 Ubuntu 的一個桌面環境,該公司目前在云服務業務賺到了錢。因為 Ubuntu Core 為嵌入式設備帶來了 Ubuntu 18.04 長期支持(LTS)代碼庫。Ubuntu Core 的鏡像大小為 260MB&…

semantic ui要裝什么才能使用

作者:呆呆笨笨鏈接:https://www.zhihu.com/question/32233356/answer/196799506來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。本答案將以兩種方式講解如何從零開始使用 Semantic-UI,…

用戶帳戶控制設置_創建快捷方式以避免用戶帳戶控制彈出式快捷方式

用戶帳戶控制設置There are numerous applications which, when launched, result in a UAC (User Account Control) warning being displayed. There are reasons why this security measure is a good idea, but it can also be extremely irritating. ElevatedShortcut lets…

Java Observer Pattern(觀察者模式)

當對象間存在一對多關系時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬于行為型模式。 關鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們。 優…

rest_framework01:前后端分離\規范\簡單例子(查詢某本書)

web 開發模式 RESTful規范 1 數據的安全保障 url鏈接一般都采用https協議進行傳輸 注:采用https協議,可以提高數據交互過程中的安全性 2 接口特征表現 用api關鍵字標識接口url: https://api.baidu.comhttps://www.baidu.com/api注&#xff…

.NET Core如何通過SSL訪問MongoDB?

【.NET Core】| 總結/Edison Zhou大家好,我是Edison。最近有一個ASP.NET Core通過SSL證書訪問MongoDB的需求,但是在網上發現資料很少,于是調查了一番,做了如下的筆記,希望對你有用。背景在實際場景中,開發環…

SQA

一、長大一條龍SQA計劃 SQA計劃需要包含軟件工程質量保證、質量控制、數據收集和統計報告這四方面內容,計劃以時間為線索,小組內成員為對象,以下為我組的工作計劃: 時間 任務 需完成的情況 2017年10月 用戶登錄注冊后臺實現 …

在pom.xml中配置nexus上傳地址

2019獨角獸企業重金招聘Python工程師標準>>> <distributionManagement> <repository> <id>thirdparty</id> <url>http://&#xff5b;nexusIP地址&#xff5d;:8081/nexus/content/repositories/thi…

網頁背景平鋪_在大約十秒鐘內為網頁創建無縫平鋪背景

網頁背景平鋪Creating a background image for your webpage (or desktop background) isn’t challenging at all. In fact, even a newbie Photoshop user can bash one out in about ten seconds. Here’s the simplest of simple methods with surprising, great results. …

9月11日學習內容整理:正則表達式,re模塊

一、正則表達式&#xff1a;正則是很大的一個知識點&#xff0c;不會僅僅是下面這些東西 1、概念&#xff1a;正則表達式就是一種對字符串匹配的規則&#xff0c;注意是只對字符串&#xff0c;正則表達式和python沒啥關系&#xff0c; 2、表達式&#xff1a; &#xff08;1&…

rest_framework02:修改數據/校驗鉤子/read_only和write_only

修改數據 1.傳入數據&#xff0c;選中data&#xff0c;以及修改data book_ser BookSerializer(instancebook, datarequest.data) 2.校驗&#xff0c;通過則保存。 if book_ser.is_valid(): # 返回True 表示驗證通過book_ser.save() # 不是book.save() rest_framework…

MongoDB的安裝與使用

MongoDB是一款NoSql數據庫。NoSql數據庫叫非關系型數據庫&#xff0c;NoSql的全名Not only sql。是為了解決高并發、高可用、高可擴展&#xff0c;以及大數據存儲等一系列問題而產生的數據庫解決方案。NoSql&#xff0c;它不能替代關系型數據庫&#xff0c;只能作為關系型數據庫…

linux 基準測試_如何對Linux系統進行基準測試:3個開源基準測試工具

linux 基準測試Linux’s command-line utilities can do anything, including perform benchmarks – but using a dedicated benchmarking program is a simpler and more foolproof process. These utilities allow you to perform reproducible tests across different syst…

.NET 7 新增的 IParsable 接口介紹

.NET 7 是一個新版本的 .NET&#xff0c;它新增了一個名為 IParsable 的接口。這個接口可以幫助開發人員更容易地在代碼中解析字符串。IParsable 接口包含兩個方法&#xff1a;Parse 和 TryParse。Parse 方法用于將一個字符串解析為指定類型的值。如果解析失敗&#xff0c;則會…

CentOS 7安裝nginx+php+mysql環境

0x01 安裝php 1、首先得安裝第三方軟件庫 yum install epel-release 復制代碼2、安裝依賴包 yum install gcc gcc-c glibc libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-de…