别的机器打不开 ComfyUI 页面:先看 `--listen` 而不是查网络
现象长什么样
一台机器装了 ComfyUI,本机浏览器打开 http://127.0.0.1:8188 一切正常,工作流跑得好好的。换到同一个局域网里的另一台电脑(或者手机、平板),输入 http://<主机的局域网IP>:8188,浏览器一直转圈,最后给一句连接超时或者连接被拒绝。
这时候大部分人的第一反应是去查网络:ping 一下主机、关掉防火墙、检查路由器有没有开 AP 隔离。这些当然都有可能,但在 ComfyUI 这件事上,命中率最高的原因排在更前面——服务端压根就没在监听那张网卡。
第一步:确认是不是 --listen 的问题
先摆事实。在 ComfyUI v0.31.0(核对日 2026-08-09)的 comfy/cli_args.py 里,--listen 这个参数是这么定义的:
| 参数 | 类型/默认 | help 原意 |
|---|---|---|
--listen [IP] | 默认 127.0.0.1;不带参数时为 0.0.0.0,:: | 指定监听 IP。可用逗号分隔多个,如 127.2.2.2,127.3.3.3。不带参数即监听所有 ipv4 与 ipv6 |
--port | 默认 8188 | 设置监听端口 |
关键在第一行的默认值:不写 --listen,ComfyUI 只监听 127.0.0.1。127.0.0.1 是回环地址,只有这台机器自己能连上。别的机器的包就算原原本本送到了主机网卡上,服务端也没有在那张网卡上开门。表现出来就是「网络明明是通的,页面就是打不开」。
所以判定动作只有一条,两分钟就能做完:
- 去看你实际用来启动 ComfyUI 的那条命令。是命令行里手敲的
python main.py,还是双击的一个.bat/快捷方式,或者某个一键包的启动脚本——把它翻出来,看看整条命令里有没有--listen。没有,问题基本就在这儿了。 - 在主机本地用
http://127.0.0.1:8188试一次。如果本地能打开、别的机器打不开,说明服务进程是活的、端口也是活的,差的就是监听地址这一层。反过来,如果本地也打不开,那就是另一类问题了(见最后一节)。 - 如果你改过端口,记得对照
--port的默认值8188确认一下别的机器访问时端口号有没有写错。这个参数在 v0.31.0 的默认值就是8188,没有传就是它。
这一步之所以要先做,是因为它的排除成本远低于查网络:改一个启动参数重启一次,比逐段排查交换机和防火墙快得多。
处置:--listen 的三种写法
按 comfy/cli_args.py(v0.31.0)的 help 语义,--listen 有三种用法,含义完全不同,别混着用:
第一种,什么都不写。 等于默认值 127.0.0.1,只有本机能访问。单人本机使用就应该保持这个状态,这是最保守也最省心的配置。
第二种,写 --listen 但不带任何参数值。 此时取值是 0.0.0.0,::,help 写得很直白:监听所有 ipv4 与 ipv6。这是让局域网里其它机器能连上的最直接做法:
python main.py --listen
想同时换端口就再加 --port:
python main.py --listen --port 8188
(以上为按官方参数语义组合的示例,未逐项实测,以官方文档与 python main.py --help 的实际输出为准。)
第三种,带上具体 IP。 help 里明确说了可以用逗号分隔多个地址,给的例子是 127.2.2.2,127.3.3.3。也就是说你可以只把服务绑在某一张指定网卡的地址上,而不是一股脑对所有网卡开放。这在一台机器同时接着有线内网和无线网络、或者装了一堆虚拟网卡的时候很有用:你只想让内网那张卡能访问,就绑那张卡的地址。
顺带说一个容易被误当成解药的参数:--enable-cors-header。它在 v0.31.0 里的定义是默认 None,不带参数时为 *(允许全部 origin)。注意它的 help 说的是「启用 CORS,可指定 origin,或用默认 * 允许全部」——管的是跨来源请求这件事,help 里没有任何一处把它描述成「让别的机器能访问」的开关。真正决定服务在哪张网卡上开门的是 --listen,这两个参数在官方口径里根本不在一个层面上。看到别人贴的启动命令里带着 --enable-cors-header 就照抄,是这一类问题里最常见的无效动作——而且它不带参数时取值是 *,等于对所有来源放开,属于白白扩大暴露面。
开放监听之后,必须一起处理的事
这部分不能跳过。--listen 不带参数等于 0.0.0.0,::,意味着这台机器上所有网卡上的这个端口都对外开着。如果这台机器同时能被更大的网络触及(公司网、公网 IP、端口转发、某些云主机的默认安全组),暴露面就不只是「隔壁同事的电脑」了。
几条按官方口径能确定说的事实:
-
用户名密码认证在官方仓库里仍然是一个 open 的 feature request。 对应 issue 是 #987,标题为「[Feature Request] Add authentication with username and password arguments」,创建于 2023-07-27,标签为 Feature,有 26 个 reactions,截至 2026-08-09 仍为 open。这里要说清楚:一个 feature request 还开着,说明这个形态的认证还没作为已完成特性关闭,并不等于「ComfyUI 完全没有任何鉴权机制」——v0.23.0 里能看到 OAuth 2.1 与 RFC 7591 DCR endpoints 的新增(PR #14026)。两件事不冲突,但都不足以让你把一个开放监听的实例当成「有登录保护」来用。
-
版本这条硬要求要先满足。 官方安全公告里有四条 GitHub Security Advisory,均于 2026-07-15 发布,严重等级均为 high,修复版本均为 0.28.0:
GHSA-rj8c-c4p8-3c5h(Stored XSS via SVG file upload on the/viewendpoint)、GHSA-53g8-45wq-pcv8(Stored XSS via/userdata/{file}due to missing Content-Type sanitization)、GHSA-rvxv-29p8-pxgq(Path traversal in LoadImage via the/promptAPI allows arbitrary file existence probing and image exfiltration)、GHSA-pj59-g5vv-74q4(Path traversal in/experiment/models/previewallows arbitrary image file read)。结论很直接:跑在 0.28.0 之前版本的实例存在这四个 high 级问题,官方修复版本是 0.28.0。 要把服务开给别的机器访问,先把版本升上去。 -
TLS 是成对参数。
--tls-keyfile与--tls-certfile必须同时给出才生效,之后应用走https://。README 给的自签证书生成命令是:openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=CommonNameOrHostname"启用方式是
--tls-keyfile key.pem --tls-certfile cert.pem。但 README 自己就注明了这个自签证书 “not appropriate for shared/production use”(不适合共享或生产使用),这句必须带上,别拿它当生产方案。Windows 用户 README 提示可以用alexisrolland/docker-openssl或第三方 OpenSSL 二进制发行版来执行上面这条命令。 -
另外两个和暴露面相关的默认值顺手记一下:
--max-upload-size默认是100(MB);--disable-api-nodes的 help 写的是不加载所有 api 节点,同时阻止前端与互联网通信。README 也有对应表述:ComfyUI 完全离线运行,核心不会下载任何东西除非你要求。
至于反向代理、防火墙规则、只允许某个网段访问这类做法——这属于通用运维做法,不是 ComfyUI 官方文档内容,本文不给具体配置。这里也不存在「这样配就安全了」的说法,官方只是给了上面这些开关。
处置后怎么验证
改完参数别只看「好像能开了」,按这几处逐个确认:
- 主机本地先复验一次。
http://127.0.0.1:8188仍然正常。--listen不带参数时是0.0.0.0,::,本机回环也在覆盖范围内,本地这条路不该断。如果本地反而打不开了,说明你的参数写法有问题(比如误把某个具体 IP 写死成了当前机器上不存在的地址)。 - 换机器访问,地址写主机的实际局域网 IP,端口和
--port一致。 没改端口就是8188。这一步最容易出错的不是参数而是 IP 写错——主机有多张网卡时,要用和访问端在同一网段的那个地址。 - 确认重启生效了。
--listen在comfy/cli_args.py里是一个启动期解析的命令行参数,改了必须让进程重新起来才算数。老进程没退干净、你改的是 A 脚本但双击的是 B 快捷方式,这两种情况在这一步都会以「改了没用」的形式表现出来。 - 如果绑了具体 IP,逐个验证。 用逗号分隔多个地址时,每一个地址都要单独试,别只试其中一个就当全通了。
- 确认版本。 前面那条 0.28.0 的结论不是可选项:要对外开监听,先看清自己跑的是哪个版本。
什么情况说明不是这个原因
这一节比前面都重要,免得你在 --listen 上一条道走到黑:
- 主机本地也打不开
127.0.0.1:8188。 那问题在服务本身或端口,不在监听地址。此时该看的是启动过程有没有中断、端口是不是被占用、--port有没有被改过。 - 你的启动命令里本来就有
--listen,改成不带参数后现象一模一样。 监听地址这一层已经排除了,往下一层走:主机的操作系统防火墙、访问端和主机是否真的在同一网段、有没有 AP 隔离一类的链路策略。这些都属于通用网络排查,和 ComfyUI 的参数无关,本文不展开。 - 页面能打开但界面功能不正常(比如某些请求失败、面板加载不出来)。这已经不是「打不开页面」了,说明 TCP 连接和 HTTP 服务都通了,方向应该转向前端与节点侧,
--listen帮不上忙。 - 只有一台设备打不开,其它设备都正常。 那大概率是那台设备自己的问题(代理、DNS、hosts、浏览器插件),服务端配置不用动。
- 你用的是
https://而服务端没配 TLS,或者反过来。--tls-keyfile和--tls-certfile要成对给出才启用 TLS;协议前缀和服务端实际状态对不上时,浏览器的报错很容易被误读成「连不上」。
最后提醒一句:上面所有参数名、默认值都以 v0.31.0 的 comfy/cli_args.py 为准。ComfyUI 迭代很快,参数和默认值都可能变,别把某一版的结论当成永久事实。
延伸阅读
- 用二分法定位是哪个自定义节点的锅:
--disable-all-custom-nodes与白名单放行 - 把 ComfyUI 部署到服务器上:
--listen、目录参数与日志落盘的完整启动命令 - 把 ComfyUI 放到公网前要想清楚的事
本文依据 ComfyUI 官方仓库(github.com/Comfy-Org/ComfyUI)的 README、comfy/cli_args.py、release notes 与官方安全公告整理,核对日 2026-08-09,对应版本 v0.31.0;文中引用的 issue 状态为该日期的快照。本文内容为官方文档与源码口径,非本机实测。参数、默认值与功能随版本变动,请以官方文档与 python main.py --help 的实际输出为准。
安全公告信息来自 GitHub Security Advisories,本文不含漏洞利用细节。