為什麼要優化php-fpm?如何優化?
為什麼要優化php-fpm?如何優化?是無所不在的,可以說是網路 Web 應用上使用最廣泛的語言。
然而,它的高效能並不為人所知,尤其是在涉及高並發系統時。這就是為什麼對於這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。
也就是說,您可以做很多事情來改進伺服器上的 為什麼要優化php-fpm?如何優化? 效能。本文主要關注 php-fpm
方面的內容,如果您使用Nginx,這是在伺服器上的預設配置。
如果你知道 php-fpm
是什麼,請直接跳到最佳化部分。
什麼是php-fpm?
許多開發人員對DevOps 方面的知識不太感興趣,即使是那些對此感興趣的開發人員,也極少有人知道它的底層原理。有趣的是,當瀏覽器發送一個請求到運行 為什麼要優化php-fpm?如何優化? 的伺服器上時,為什麼要優化php-fpm?如何優化? 也不是最先進行處理請求的服務;而是,HTTP 伺服器,Apache 和 Nginx 是其中最主要的兩個。 「web 伺服器」決定如何與 為什麼要優化php-fpm?如何優化? 進行通信,然後傳遞請求的類型,資料和頭部資訊到 為什麼要優化php-fpm?如何優化? 進程。
上圖是為什麼要優化php-fpm?如何優化? 專案的請求-回應生命週期(圖片來源: ProinerTech)
在現代為什麼要優化php-fpm?如何優化? 應用程式中,「find file」部分即為index.php
文件,它是在伺服器設定檔中配置的用於處理所有請求的代理。
如今,Web 伺服器究竟如何連接 為什麼要優化php-fpm?如何優化? 正在進化,如果我們要深入研究所有細節,這篇文章的長度將會激增。但粗略來說, 在 Apache 作為 Web 伺服器首選的時間段,為什麼要優化php-fpm?如何優化? 是作為包含在伺服器內部的模組。
所以每當一個請求被接收,伺服器將開啟一個新的進程, 它將自動包含 為什麼要優化php-fpm?如何優化? 和執行請求。這個方法被稱為mod_php
,「為什麼要優化php-fpm?如何優化?作為一個模組」的縮寫。這種方法有其局限性,而 Nginx 和 php-fpm
克服了它。
在php-fpm
中,管理 為什麼要優化php-fpm?如何優化? 的責任在於伺服器內部的 為什麼要優化php-fpm?如何優化? 程式。換言之, Web 伺服器 (Nginx, 在本例中), 不在乎 為什麼要優化php-fpm?如何優化? 在哪和怎樣運行的,只要它知道如何發送和接收資料即可。如果需要,在這種情況下,您可以將為什麼要優化php-fpm?如何優化?視為另一台伺服器,它管理傳入請求的某些子為什麼要優化php-fpm?如何優化?進程(因此,我們將請求送到伺服器,該請求由伺服器接收並傳遞到伺服器— —太瘋狂了!:-P)。
如果你用過Nginx
,你會看到這些程式碼:
location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
對於這一行:fastcgi_pass unix:/run/php/php7.2 -fpm.sock;
,它告訴Nginx透過 php7.2-fpm.sock
的socket
與php進程通訊。因此,對於每個傳入的請求,Nginx都透過這個檔案寫入數據,在接收輸出後,將其發送回瀏覽器。
我必須再次強調,對於如何運行這不是最完整或最準確的,但對於大多數 DevOps 任務是完全準確的。
除此之外,讓我們回顧一下到目前為止所學到的東西:
- 為什麼要優化php-fpm?如何優化?不會直接接收瀏覽器發送的請求。像 Nginx 這種 Web 伺服器會先攔截它。
- Web 伺服器知道如何連接到為什麼要優化php-fpm?如何優化?進程,並將所有請求資料(貼上所有內容)傳遞到 為什麼要優化php-fpm?如何優化? 上。
- 為什麼要優化php-fpm?如何優化? 完成其職責後,會將回應傳送回 Web 伺服器,然後將其傳送回客戶端(在大多數情況下為瀏覽器)。
流程圖如下:
為什麼要優化php-fpm?如何優化? 和 Nginx 如何協同工作? (圖片來源:資料狗)
到目前為止都不錯, 那麼關鍵問題來了:為什麼要優化php-fpm?如何優化?-FPM到底是什麼呢?
為什麼要優化php-fpm?如何優化? 中的FPM
代表「快速進程管理器」, 花式解釋就是說,在伺服器上運行的為什麼要優化php-fpm?如何優化? 並不是單一進程,而是由這個FPM 進程管理器派生、控制和終止的一些為什麼要優化php-fpm?如何優化? 進程。 web伺服器將請求傳遞給的就是這個進程管理器。
為什麼要優化php-fpm?如何優化?-FPM 本身就是一個完整的兔子洞,所以如果您願意,可以隨意探索,但是對於我們的目的,這些解釋就足夠啦。 ?
為什麼要最佳化php-fpm?
一般在正常運作的情況下,為什麼要考慮最佳化呢?為什麼不將事物保持原樣。
諷刺的是,一般我為大多數用例提供建議的話。如果您的設定運作良好,且沒有特殊用例,請使用預設設定。但是,如果您希望擴展一台機器之外的能力,那麼從一台機器中擠出最大的處理能力是必不可少的,因為它可以將您伺服器的花費減少一半(甚至更多!)。
要说明的另一件事情是,Nginx是为处理巨大的工作负载而构建的。 它能够同时处理成千上万的连接,但是如果您的為什麼要優化php-fpm?如何優化?设置不合理,那么您将浪费很多资源,因为Nginx必须等待為什麼要優化php-fpm?如何優化?完成当前处理之后才可以接受下一个请求,最终Nginx不能为您的服务提供任何优势!
所以,接下来让我们看看尝试优化 php-fpm
时我们到底要优化什么。
如何优化 為什麼要優化php-fpm?如何優化?-FPM ?
php-fpm
的配置文件在不同服务器上的位置可能不同,因此您需要做一些调查来确定它的位置。在 UNIX 上,你可以使用 find 命令。在我的 Ubuntu 上,它的路径是 /etc/php/7.2/fpm/php-fpm.conf
。当然,7.2是我正在运行的 為什麼要優化php-fpm?如何優化? 版本。
下面是这个文件的前几行代码:
;;;;;;;;;;;;;;;;;;;;; ; FPM Configuration ; ;;;;;;;;;;;;;;;;;;;;; ; All relative paths in this configuration file are relative to 為什麼要優化php-fpm?如何優化?'s install ; prefix (/usr). This prefix can be dynamically changed by using the ; '-p' argument from the command line. ;;;;;;;;;;;;;;;;;; ; Global Options ; ;;;;;;;;;;;;;;;;;; [global] ; Pid file ; Note: the default prefix is /var ; Default Value: none pid = /run/php/php7.2-fpm.pid ; Error log file ; If it's set to "syslog", log is sent to syslogd instead of being written ; into a local file. ; Note: the default prefix is /var ; Default Value: log/php-fpm.log error_log = /var/log/php7.2-fpm.log
很明显:这一行 pid = /run/php/php7.2-fpm.pid
告诉我们哪个文件包含了 php-fpm
进程的进程 id。
我们还看到 /var/log/php7.2-fpm.log
是 php-fpm
存储日志的地方。
在这个文件中,像下面这样添加三个变量:
emergency_restart_threshold 10 emergency_restart_interval 1m process_control_timeout 10s
前两个设置是警告性的,它们告诉 php-fpm
进程,如果10个子进程在一分钟内失败,主 php-fpm
进程应该重新启动自己。
这听起来可能不够稳健,但是 為什麼要優化php-fpm?如何優化? 是一个短暂的进程,它会泄漏内存,所以在出现高故障时重新启动主进程可以解决很多问题。
第三个选项是 process_control_timeout
,它告诉子进程在执行从父进程接收到的信号之前需要等待这么长的时间。这个设置是非常有用的。例如,当父进程发送终止信号时,子进程正在处理某些事情的时候。十秒的时间,他们会有一个更好的机会完成任务并且优雅地退出。
令人惊讶的是,这 不是 php-fpm 的核心配置!这是因为,为了 web 请求服务,php-fpm
创建了一个新的进程池,它将具有一个单独的配置。在我的例子中,进程池的名称是 www
,我想编辑的文件是 /etc/php/7.2/fpm/pool.d/www.conf
。
让我们来看看文件的内容:
; Start a new pool named 'www'. ; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [www] ; Per pool prefix ; It only applies on the following directives: ; - 'access.log' ; - 'slowlog' ; - 'listen' (unixsocket) ; - 'chroot' ; - 'chdir' ; - 'php_values' ; - 'php_admin_values' ; When not set, the global prefix (or /usr) applies instead. ; Note: This directive can also be relative to the global prefix. ; Default Value: none ;prefix = /path/to/pools/$pool ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. user = www-data group = www-data
快速浏览一下上面代码片段的末尾,您就会明白为什么服务器进程以 www-data
的形式运行了。如果您在设置网站时遇到文件权限问题,您可能要将目录的所有者或组更改为 www-data
,从而允许為什麼要優化php-fpm?如何優化?进程写入日志文件和上传文档等。
最后,我们到达了问题的根源,流程管理器 (pm) 设置。一般情况下,默认值是这样的:
pm = dynamic pm.max_children = 5 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 200
那么,这里的 「dynamic(动态)」是什么意思呢?我认为官方文档最好地解释了这一点(我的意思是,这应该已经是您正在编辑的文件的一部分,但是我在这里复制了它,以防它不是):
; Choose how the process manager will control the number of child processes. ; Possible Values: ; static - a fixed number (pm.max_children) of child processes; ; dynamic - the number of child processes are set dynamically based on the ; following directives. With this process management, there will be ; always at least 1 children. ; pm.max_children - the maximum number of children that can ; be alive at the same time. ; pm.start_servers - the number of children created on startup. ; pm.min_spare_servers - the minimum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is less than this ; number then some children will be created. ; pm.max_spare_servers - the maximum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is greater than this ; number then some children will be killed. ; ondemand - no children are created at startup. Children will be forked when ; new requests will connect. The following parameter are used: ; pm.max_children - the maximum number of children that ; can be alive at the same time. ; pm.process_idle_timeout - The number of seconds after which ; an idle process will be killed. ; Note: This value is mandatory.
由此可见,有三个可用值:
- Static: 无论什么情况,都会保持一个固定的為什麼要優化php-fpm?如何優化?进程数量。
-
Dynamic: 我们需要指定
php-fpm
在任何给定时间点会保持活动的最小以及最大进程数量。 - ondemand: 按照需求创建和销毁进程。
那这些设置有什么影响呢?
简而言之,如果你有个小流量的网站,“dynamic”设置在大多数时间内都是一种资源的浪费。假设你的pm.min_spare_servers
设置成了3,那会有三个為什麼要優化php-fpm?如何優化?进程会被创建并保持运行,甚至是网站没有流量时。这种情况下,“ondemand” 就是个更好的选择, 可以让系统决定何时启动新的进程。
另一方面, 大流量 或者必须快速响应的网站将在这种情况下被惩罚。 最好避免创建新的 為什麼要優化php-fpm?如何優化? 进程的额外开销,使其成为池的一部分并对其进行监控。
使用 pm = static
固定子进程的数量,使最大的系统资源用于服务请求而不是管理 為什麼要優化php-fpm?如何優化?。假如你确定走这条路,注意它有其指导方针和陷阱.关于它的一篇相当密集但非常有用的文章是 这篇 。
写在最后
由于有关网络性能的文章可能会引发争论或使人们感到困惑,因此在结束本文之前,我觉得需要讲几句话。 性能调优既涉及系统知识,也涉及猜测和技巧。
即使您完全了解 php-fpm
的所有设置,也无法保证成功。 如果您不了解 php-fpm
的存在,那么您就不必浪费时间担心它。 继续做您已经在做的事情并继续下去。
同時,盡可能不讓結果變得很戲劇性。是的,您可以透過從頭開始重新編譯 為什麼要優化php-fpm?如何優化? 並刪除所有不需要的模組來獲得更好的效能,但這種方法在生產環境中不夠明智。優化某些內容的整個想法是查看您的需求是否與預設值不同(它們很少這樣做!),並根據需要進行較小的更改。
英文原文網址:https://geekflare.com/php-fpm-optimization/
推薦學習:《為什麼要優化php-fpm?如何優化?影片教學》
以上是為什麼要優化php-fpm?如何優化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
