![使用 php7.3-fpm 和 lighttpd 1.4.53 通过 UNIX 套接字(而不是 TCP)连接时,503 服务在高负载下不可用](https://linux22.com/image/765262/%E4%BD%BF%E7%94%A8%20php7.3-fpm%20%E5%92%8C%20lighttpd%201.4.53%20%E9%80%9A%E8%BF%87%20UNIX%20%E5%A5%97%E6%8E%A5%E5%AD%97%EF%BC%88%E8%80%8C%E4%B8%8D%E6%98%AF%20TCP%EF%BC%89%E8%BF%9E%E6%8E%A5%E6%97%B6%EF%BC%8C503%20%E6%9C%8D%E5%8A%A1%E5%9C%A8%E9%AB%98%E8%B4%9F%E8%BD%BD%E4%B8%8B%E4%B8%8D%E5%8F%AF%E7%94%A8.png)
我最近将 php7.3-fpm 配置切换为使用 UNIX 套接字,而不是监听 localhost:9000。这解决了延迟问题(我时不时会收到无缘无故花费一秒钟以上的请求)。但是,现在使用 unix 套接字时,我会在高负载下遇到“503 服务不可用”问题 - 但仅限于 PHP 脚本。静态文件仍可无错误地传送。因此,这与 PHP 有关。
我已经对该网站进行了峰值测试使用k6。在 ~400 req/s 下测试一个简单的脚本时,90% 的请求都是 503 错误,而使用 TCP 时,速度会减慢到无穷大,即使在 800 req/s 下也能正常工作,只有 ~0.5% 的请求失败。我猜这是 UNIX 套接字上的连接限制。我不得不增加积压大小以/etc/php/7.3/fpm/pool.d/www.conf
使 TCP 在这些高负载下工作(增加到 10240,这是默认值的 10 倍)。但是,我在配置中没有找到任何与 UNIX 套接字类似的内容……我还尝试增加 lighttpd 可以使用的文件描述符数量(server.max-fds),但没有成功。
由于 UNIX 套接字效率更高,我愿意使用它们。尤其是,它们解决了这个延迟问题……而且它们不必通过防火墙,出于某种原因,防火墙自某些较新的内核版本以来就对本地主机连接进行了防火墙。UNIX 套接字上可能有连接限制……但我不知道如何设置它。
问题
您是否知道为什么会这样...或者您是否有解决方案?
版本 / 操作系统 / 配置
lighttpd:1.4.53(无法更新到较新的版本!)php-fpm:7.3 操作系统:debian/9.13 内核版本:“Linux worldtalk.de 4.9.0-15-amd64 #1 SMP Debian 4.9.258-1 (2021-03-08) x86_64 GNU/Linux”。
/etc/lighttpd/lighttpd.conf
.
.
.
server.port = 80
server.stream-request-body = 2
server.stream-response-body = 2
server.listen-backlog = 2000
server.max-keep-alive-idle = 2
server.max-keep-alive-requests = 4
server.max-read-idle = 25
server.max-write-idle = 25
server.max-fds = 10240
.
.
.
/etc/lighttpd/conf-enabled/10-fastcgi.conf
对于 UNIX 套接字:
server.modules += ( "mod_fastcgi" )
index-file.names += ( "index.php" )
fastcgi.server = (
".php" => (
"localhost" => (
"socket" => "/run/php/php7.3-fpm.sock",
"broken-scriptfilename" => "enable"
))
)
对于 TCP:
server.modules += ( "mod_fastcgi" )
index-file.names += ( "index.php" )
fastcgi.server = ( ".php" => ((
"host" => "127.0.0.1",
"port" => "9000",
"broken-scriptfilename" => "enable"
)))
/etc/php/7.3/fpm/pool.d/www.conf
user = www-data
group = www-data
listen = 127.0.0.1:9000
;listen = /run/php/php7.3-fpm.sock <--- THIS IS USED FOR UNIX SOCKETS
listen.backlog = 10240
listen.owner = www-data
listen.group = www-data
process.priority = -18
pm = dynamic
pm.max_children = 2000
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 15
pm.max_requests = 0
.
.
.
--
答案1
经过进一步研究后,我在这里找到了解决方案: 如何使用 systemd 设置 unix 套接字积压?
这本质上说的是...
来自 listen(2):
如果 backlog 参数大于 /proc/sys/net/core/somaxconn 中的值,则会将其默默截断为该值;此文件中的默认值为 128。在 2.4.25 之前的内核中,此限制是一个硬编码值 SOMAXCONN,其值为 128。
因此,我将“SOMAXCONN”设置为 10240,以不限制 unix 套接字的积压,这确实增加了 UNIX 套接字的积压大小并解决了该问题:
回显“ 10240”> /proc/sys/net/core/somaxconn
进行快速修复和测试...为了使其永久生效,请将以下行添加到/etc/sysctl.conf
:
net.core.somaxconn = 10240