php-fpmとは何ですか?次の記事では、php-fpm について理解し、php-fpm を最適化する際に何を最適化する必要があるかを紹介します。
#php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? は広く普及しており、インターネット Web アプリケーションで最も広く使用されている言語であると言えます。
しかし、その高いパフォーマンスは、特に同時実行性の高いシステムに関してはあまり知られていません。だからこそ、そのような特定のユースケースでは、Node (はい、言語ではないことはわかっています)、Go、Elixir などの言語に引き継がれています。
とはいえ、サーバー上の php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? パフォーマンスを向上させるためにできることはたくさんあります。この記事は主にphp-fpm
に焦点を当てています。Nginx を使用している場合、これはサーバーのデフォルト構成です。
php-fpm
が何かご存知の場合は、最適化セクションに直接ジャンプしてください。
多くの開発者は DevOps の知識にあまり興味がありません。また、興味を持っている人でも、その基礎となる原理を知っている人はほとんどいません。 。興味深いことに、ブラウザが php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? を実行しているサーバーにリクエストを送信するとき、php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? がリクエストを処理する最初のサービスではなく、HTTP サーバー、Apache と Nginx が最も重要な 2 つのサービスです。 「Web サーバー」は、php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? との通信方法を決定し、リクエストのタイプ、データ、ヘッダー情報を php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? プロセスに渡します。
上の図は、php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? プロジェクトのリクエストとレスポンスのライフ サイクルです (画像ソース: ProinerTech)
最新の php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? アプリケーションでは、「ファイルの検索」 " の部分は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;
これは、php7.2-fpm.sock
のsocket
を通じて php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? プロセスと通信するように Nginx に指示します。したがって、受信リクエストごとに、Nginx はこのファイルを通じてデータを書き込み、出力を受信した後、それをブラウザーに送り返します。
これは、実行方法に関して最も完全または正確ではありませんが、ほとんどの DevOps タスクに対して完全に正確であることをもう一度強調しなければなりません。
それはさておき、これまでに学んだことを復習しましょう:
フローチャートは次のとおりです:
php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? と Nginx はどのように連携しますか? (画像出典: Data Dog)
ここまでは順調ですが、重要な質問は次のとおりです。php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか?-FPM とは正確には何ですか?
FPM
php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? では「Fast」の略です。プロセス マネージャー」という派手な説明は、サーバー上で実行されている php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? が単一のプロセスではなく、この FPM プロセス マネージャーによって派生、制御、終了される多数の php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? プロセスであることを意味します。 Web サーバーがリクエストを渡すのはこのプロセス マネージャーです。
php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか?-FPM はそれ自体がまったくのウサギの穴なので、必要に応じて自由に探索してください。ただし、私たちの目的では、これらの説明で十分です。 ?
通常、通常の操作条件では、なぜ最適化を検討する必要があるのでしょうか?現状のままにしておいてはいかがでしょうか。
具有讽刺意味的是,一般我为大多数用例提供建议的话。 如果您的设置运行良好,并且没有特殊用例,请使用默认设置。 但是,如果您希望扩展一台机器之外的能力,那么从一台机器中挤出最大的处理能力是必不可少的,因为它可以将您服务器的花费减少一半(甚至更多!)。
要说明的另一件事情是,Nginx是为处理巨大的工作负载而构建的。 它能够同时处理成千上万的连接,但是如果您的php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか?设置不合理,那么您将浪费很多资源,因为Nginx必须等待php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか?完成当前处理之后才可以接受下一个请求,最终Nginx不能为您的服务提供任何优势!
所以,接下来让我们看看尝试优化php-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.
由此可见,有三个可用值:
php-fpm
在任何给定时间点会保持活动的最小以及最大进程数量。那这些设置有什么影响呢?
简而言之,如果你有个小流量的网站,“dynamic”设置在大多数时间内都是一种资源的浪费。假设你的pm.min_spare_servers
设置成了3,那会有三个php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか?进程会被创建并保持运行,甚至是网站没有流量时。这种情况下,“ondemand” 就是个更好的选择, 可以让系统决定何时启动新的进程。
另一方面, 大流量 或者必须快速响应的网站将在这种情况下被惩罚。 最好避免创建新的 php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? 进程的额外开销,使其成为池的一部分并对其进行监控。
使用pm = static
固定子进程的数量,使最大的系统资源用于服务请求而不是管理 php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか?。假如你确定走这条路,注意它有其指导方针和陷阱.关于它的一篇相当密集但非常有用的文章是 这篇 。
写在最后
由于有关网络性能的文章可能会引发争论或使人们感到困惑,因此在结束本文之前,我觉得需要讲几句话。 性能调优既涉及系统知识,也涉及猜测和技巧。
php-fpmのすべての設定を完全に理解したとしても、成功は保証されません。
php-fpmの存在を知らなくても、心配して時間を無駄にする必要はありません。すでにやっていることを続けて、続けてください。
元のアドレス: https://geekflare.com/php-fpm-optimization/ 翻訳アドレス: https://learnku.com/php/t/34358推奨: 「
php-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか? ビデオ チュートリアル」
以上がphp-fpmとは何ですか?パフォーマンスを向上させるために最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。