解决方案
PHP FastCGI Process Manager (PHP-FPM) 和 Nginx 是一种常见的服务器架构方案,如果您的 PHP-FPM 进程在投流期间遇到高并发请求(如 300000 个请求),会导致服务器 CPU 占用过高。
以下是一些可能的解决方案:
增加服务器的硬件资源。例如,升级使用更好的 CPU、内存和磁盘。
配置 PHP-FPM 进程池,将 max_children 和 max_requests 值增加到能够处理高并发请求的数量。在设置 max_children 上时,需要根据服务器的内存情况来进行设置,因为每个 PHP-FPM 进程占用一定的内存。
配置 Nginx 的 worker_processes 和 worker_connections 值以增加并发处理能力。
对于大型项目,最好使用缓存和其他优化技术来减轻服务器的负载,例如使用 CDN、浏览器缓存、Memcached 或 Redis 等。
值得注意的是,给 PHP-FPM 进程和 Nginx 工作进程分配太多内存会导致服务器内存不足,而给它们分配太少内存会导致请求无法正常处理。因此,您需要进行一些测试来找到最佳的配置方案。
max_children 和 max_requests
当您在PHP-FPM和Nginx服务器上遇到高并发请求时,您可以通过增加PHP-FPM进程和子进程池的max_children和max_requests参数的值,来处理这些请求。这两个参数可以在PHP-FPM池的配置文件(通常是php-fpm.conf或www.conf)中进行调整。
下面的步骤可以让你具体了解如何调整这些参数:
-
打开PHP-FPM池的配置文件(通常是php-fpm.conf或www.conf)。
-
查找并调整 max_children 参数。这是并发处理数。必须考虑服务器的可用资源,如内存、CPU和磁盘I/O。通常设置为服务器总RAM可用空间除以平均 PHP-FPM 进程占用的内存。
-
查找并调整 max_requests 参数。这是每个 PHP-FPM 进程处理请求的最大数量。此参数的目的是限制进程的生命周期并减少内存泄漏风险。一般来说,赋予该值越大,进程生命周期就越长,会消耗更多的 RAM。
-
保存配置文件更改,并重新启动 PHP-FPM 进程和 Nginx 工作进程以重新加载配置并生效。
您可以通过监控PHP-FPM池进程数和Nginx工作进程数的变化,来判断是否需要增加PHP-FPM进程和子进程池的max_children和max_requests参数的值,以便进一步优化服务器的处理能力。请注意,增加max_children值将增加服务器的并发负载,因此,您需要根据服务器的可用资源情况进行测试和调整。
worker_processes 和 worker_connections
Nginx 的 worker_processes 和 worker_connections 参数用于控制 Nginx 工作进程和每个工作进程打开的客户端连接数。通过增加这些参数的值,可以增加 Nginx 服务器的并发处理能力。
下面是具体的步骤:
-
打开 Nginx 的配置文件(通常是 nginx.conf 或者 vhost-conf 文件)
-
找到 worker_processes 和 worker_connections 参数,进行调整。其中,worker_processes 是 Nginx 工作进程的数量,通常建议将其设置为 CPU 核心数量或 CPU 核心数量的
2 倍
,可以通过命令grep -c processor /proc/cpuinfo
来查询 CPU 核心数量。worker_connections 则是每个 Nginx 工作进程可同时处理的客户端连接数,需要根据服务器的硬件资源进行调整。例如,如果您的服务器内存充足,可以将 worker_connections 设置为更大的值,如 1024。 -
保存并关闭文件,并重新加载配置。您可以通过运行
sudo nginx -t
命令来测试配置文件的语法是否正确,若无误,则运行sudo systemctl reload nginx
来重载配置项。
注意:请注意,在增加 worker_processes 和 worker_connections 的值之前,您需要检查服务器的硬件资源,以确保它们有足够的处理能力和内存来处理更多的并发请求。同时,也需要确认您的 PHP-FPM 进程数和 Nginx 工作进程数是否匹配,以充分利用所有的硬件资源。
总之,适当的调整 worker_processes 和 worker_connections 参数可以为您的服务器提供更好的性能和更高的并发处理能力。建议您进行测试和实验以找到最适合您的服务器的值。
worker_processes
将 worker_processes
设置为 auto
是一个适用于大多数情况的良好实践,它可以让 Nginx 自动检测 CPU 的核心数并设置相应的工作进程数量。
在 nginx.conf
文件或 Nginx 虚拟主机配置文件中,你可以将 worker_processes
的值设置为 auto
,如下所示:
worker_processes auto;
这意味着 Nginx 会自动检测 CPU 核心数量,然后为每个核心设置一个工作进程。
这种设置适用于大多数情况,因为它可以自动适应不同硬件环境,且不会导致过度分配资源。
不过,一些特殊情况下可能需要手动设置 worker_processes
的值,例如当你使用 Nginx 作为反向代理处理大量请求时,为了最大化利用硬件资源,你可能需要手动将 worker_processes
增加到更高的值。
worker_connections
worker_connections
控制每个工作进程可以同时处理的连接数,它的值应该考虑到服务器的硬件资源、预期的并发流量和应用程序的性能需求。通常,该值越高,可以同时处理的连接数就越多。
以下是一些建议来配置 worker_connections
的值:
-
根据硬件配置来设置:推荐使用硬件资源(例如 CPU、RAM、网络带宽)来定制
worker_connections
的值。通常来讲,在一般的云服务器环境下,一个工作进程应该配置不超过 2048 的并发连接数,而在高端服务器上可选择升高至 65535(即最大TCP连接数)。 -
根据预期的并发流量来设置:如果你预计会面对大量的并发流量,需要增加
worker_connections
的值,以防止连接队列排满导致请求堵塞。值的大小应该考虑整个系统能够负载的最大并发连接数,如果值过小,将限制最大并发连接数,如果值过大,会浪费大量的资源,同时可能导致连接被过早关闭或动态的增加系统负载,而导致资源耗尽。 -
根据应用程序的性能需求来设置:某些应用程序需要更高的
worker_connections
值来保证高性能,例如一个高吞吐量的视频流媒体应用程序或低延迟的实时应用程序。
需要注意的是,太小的 worker_connections
值可能导致连接被拒绝或连接队列排满而导致请求堵塞,而太大的则会导致过多的网络流量和资源消耗。
扩展
linux查找某个文件的命令
# 在根目录下查找文件www.conf,表示在整个硬盘查找find / -name www.conf
具体可以看我另一篇文章:
linux下的查找命令
来源地址:https://blog.csdn.net/qq_36303853/article/details/130989562