必须将net.ipv4.tcp_tw_reuse设为1以复用time_wait端口,同时确保tcp_timestamps=1并扩大ip_local_port_range至1024 65535,三者缺一不可。

Workerman 主动建连时,内核默认禁止复用 TIME_WAIT 端口
Workerman 作为常驻 PHP 进程,高频调用下游(如 Redis、MySQL、HTTP API)时,每个请求都是一次主动 outbound 连接。TCP 四次挥手后,客户端进入 TIME_WAIT 状态,默认持续 60 秒(2×MSL),期间该五元组(含本地端口)被独占。而 Linux 默认 net.ipv4.tcp_tw_reuse 是 0,内核直接拒绝复用这些端口——哪怕连接已空闲数秒,新请求仍会报 Cannot assign requested address。
tcp_tw_reuse 开启但无效?先看 tcp_timestamps 是否被关了
tcp_tw_reuse = 1 不是开关一按就灵。它依赖 TCP 时间戳做安全校验:新连接的 SYN 时间戳必须大于旧连接 FIN 的时间戳。如果 net.ipv4.tcp_timestamps 被设为 0(常见于某些加固脚本或容器镜像),tcp_tw_reuse 就彻底失效。
- 运行
sysctl net.ipv4.tcp_timestamps,输出必须是net.ipv4.tcp_timestamps = 1 - 若不是,往
/etc/sysctl.conf或/etc/sysctl.d/99-workerman.conf加一行net.ipv4.tcp_timestamps = 1,再执行sysctl -p
只调 tcp_tw_reuse 不够,ip_local_port_range 必须同步扩大
默认临时端口范围是 32768 65535(约 3.2 万个),即使开启复用,高并发下仍不够用。Workerman 每个 Worker 进程都可能同时发起数百连接,端口池很快见底。
一款AI工具,主要用于通过后台进程运行 Codex CLI、Claude Code、OpenCode 或 Pi Coding Agent,实现程序化控制,适合需要提升相关任务效率的用户。
- 建议设为
net.ipv4.ip_local_port_range = 1024 65535(避开 1–1023 特权端口,得约 6.4 万个可用端口) - 不要设成
1 65535:普通用户进程无法绑定 1–1023,反而浪费空间 - 改完后执行
sysctl -p生效,无需重启 Workerman
别碰 tcp_tw_recycle,它在 Workerman 场景下必然出问题
Linux 4.12+ 内核已移除 tcp_tw_recycle,sysctl -w net.ipv4.tcp_tw_recycle=1 直接报错 No such file or directory。即使旧内核启用,它在 NAT 环境(Docker、K8s Service、云 SLB 后)会导致连接随机失败——Workerman 几乎总部署在这些环境里。
真正起作用的只有 tcp_tw_reuse + tcp_timestamps + ip_local_port_range 这三者组合。单独调小 tcp_fin_timeout 对缓解端口耗尽效果有限,还可能干扰正常连接终结流程。










