linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法

李洋博客2025-12-052.5K阅读2评论

文章最后更新时间: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,这是导致报错的常见原因。

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第1张

定位报错的PHP进程,查看其打开的文件数

# 找到sc2.php对应的进程PID(替换为实际端口/脚本名)

ps -ef | grep sc2.php

# 查看该进程打开的文件描述符数量(替换PID为实际值)

lsof -p <PID> | wc -l

查询完成后如图:目前在用的链接数量是【77】个,当然这是测试机,不是正常,不然这点数量不可能崩溃的哈。

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第2张

临时调整限制

立即生效,重启后失效,临时提升当前用户的软/硬限制(仅当前会话)

# 修改当前会话的软限制(需小于或等于硬限制)
ulimit -n 1048576

# 同时修改软硬限制(需要root权限)
ulimit -Hn 1048576
ulimit -Sn 1048576

设置完成后如图,当然了,临时设置,有些操作命令之后可能失效了,不仅仅限于重启操作,临时过渡使用。

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第3张

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

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第4张

永久调整限制

重启后生效,修改用户级限制配置(/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

如图:

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第5张

在 /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

如图:

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第6张

生效配置:

sysctl -p

重新加载并重启服务:

sudo systemctl daemon-reload
sudo systemctl daemon-reexec

当然还得重启下:

systemctl reboot

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第7张

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

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第8张

调整Web服务器限制(Nginx)

编辑`nginx.conf`

vim /etc/nginx/nginx.conf

宝塔后台,软件商店,找到NGINX,点击设置,找到【性能调整】,找到【worker_connetctions】设置最大并发连接数,提升worker进程的文件描述符限制

linux系统提示文件描述符错误:Warning: stream_socket_accept(): accept failed: 的解决办法 第9张

重启Nginx:

systemctl restart nginx

宝塔面板的话找到【服务】【重载配置】即可。

总结

1. 优先通过`limits.conf`和`sysctl.conf`永久提升文件描述符限制;

2. 必须修复PHP代码中文件/套接字未关闭的泄漏问题(治本);

文章版权声明:除非注明,否则均为李洋博客原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (有 2 条评论,2482人围观)
网友昵称:6666
6666 V 铁粉 MQQBrowser 6.2 Android 14 沙发
2025-12-20 来自河南 回复
文章不错,写的很好!文章不错,写的很好!
网友昵称:李洋博客
李洋博客 V 博主 Sogou Explorer Windows 10 x64
2025-12-22 来自辽宁 回复
@6666 谢谢支持,已更新文章内容~
取消
微信二维码
微信二维码
支付宝二维码