linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法
文章最后更新时间:2025年12月22日已超过43天没有更新。
这个错误的核心是进程打开的文件描述符(File Descriptor)数量超过了系统/进程的限制,Linux下所有套接字(socket)、文件、管道等都会占用文件描述符,以下是完整的排查和解决步骤:
临时排查
确认当前限制和占用情况
查看系统级最大文件描述符限制
cat /proc/sys/fs/file-max
查看当前用户的软/硬限制(PHP进程所属用户,通常是www/www-data)
# 查看软限制(当前生效的限制、查看硬限制(最大可调整到的限制)
# 查看所有ulimit设置 ulimit -a # 查看软限制和硬限制 ulimit -Sn # 软限制 ulimit -Hn # 硬限制
> 注:默认软限制通常是1024,硬限制是4096,这是导致报错的常见原因。

定位报错的PHP进程,查看其打开的文件数
# 找到sc2.php对应的进程PID(替换为实际端口/脚本名)
ps -ef | grep sc2.php
# 查看该进程打开的文件描述符数量(替换PID为实际值)
lsof -p <PID> | wc -l
查询完成后如图:目前在用的链接数量是【77】个,当然这是测试机,不是正常,不然这点数量不可能崩溃的哈。

临时调整限制
立即生效,重启后失效,临时提升当前用户的软/硬限制(仅当前会话)
# 修改当前会话的软限制(需小于或等于硬限制) ulimit -n 1048576 # 同时修改软硬限制(需要root权限) ulimit -Hn 1048576 ulimit -Sn 1048576
设置完成后如图,当然了,临时设置,有些操作命令之后可能失效了,不仅仅限于重启操作,临时过渡使用。

关闭终端页面,重新查看,是的不需要重启,关闭终端就恢复了,不信你看,是不是恢复默认的1024啦。

永久调整限制
重启后生效,修改用户级限制配置(/etc/security/limits.conf)
# 编辑配置文件(root权限)
vim /etc/security/limits.conf
添加以下内容(针对PHP运行用户,比如www,*表示所有用户):
# 对所有用户 * soft nofile 1048576 * hard nofile 1048576 root soft nofile 1048576 root hard nofile 1048576 # 可选的进程数限制 * soft nproc unlimited * hard nproc unlimited root soft nproc unlimited root hard nproc unlimited
如图:

在 /etc/security/limits.d/*.conf 配置文件可能是(*-nproc.conf)
* soft nproc 4096 root soft nproc unlimited * soft nofile 1048576 * hard nofile 1048576
修改系统内核参数(/etc/sysctl.conf)
# 编辑内核配置(root权限)
vim /etc/sysctl.conf
添加以下内容:
# 系统总最大打开文件数 fs.file-max = 655350 fs.nr_open = 1048576
如图:

生效配置:
sysctl -p
重新加载并重启服务:
sudo systemctl daemon-reload sudo systemctl daemon-reexec
当然还得重启下:
systemctl reboot

重启之后我们再次运行命令:

调整Web服务器限制(Nginx)
编辑`nginx.conf`
vim /etc/nginx/nginx.conf
宝塔后台,软件商店,找到NGINX,点击设置,找到【性能调整】,找到【worker_connetctions】设置最大并发连接数,提升worker进程的文件描述符限制

重启Nginx:
systemctl restart nginx
宝塔面板的话找到【服务】【重载配置】即可。
总结
1. 优先通过`limits.conf`和`sysctl.conf`永久提升文件描述符限制;
2. 必须修复PHP代码中文件/套接字未关闭的泄漏问题(治本);



发表评论