在高性能 AI 推理场景中,单实例 ComfyUI 往往难以充分利用多显卡(如 RTX 3090)的算力,且面临长耗时任务导致服务假死的风险。本文将分享一套成熟的方案:通过 PM2 实现多实例守护与 HTTP 假死监测,并利用 Caddy 构建具备“最少连接优先”策略的负载均衡网关。

方案核心优势

  1. 自动化集群管理:一键分发实例到不同 GPU,自动配置 CUDA 环境。

  2. 双重可靠性守护:结合 PM2 进程守护与自定义 HTTP Watchdog,解决 ComfyUI 进程在位但服务假死的顽疾。

  3. 推理性能优化:针对 3090 显卡深度定制,注入 bf16highvram 及跨注意力优化参数。

  4. 智能网关分发:Caddy 自动实现负载均衡,并针对 AI 生成任务的超长连接进行超时优化。


第一部分:ComfyUI 集群服务部署

该脚本负责初始化 Python 虚拟环境调用、生成 PM2 配置文件(ecosystem.config.js)以及启动 HTTP 存活监测。

脚本 1:comfy_pm2_manager.sh

Bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/bash
# ============================================================
# ComfyUI PM2 Cluster Manager (v2.6)
# ============================================================
set -e

do_install() {
echo -e ">>> 开始配置 ComfyUI 集群服务..."

# 路径与环境配置
read -p "1. ComfyUI 目录路径: " WORKSPACE
WORKSPACE=${WORKSPACE:-/ai/mnt/comfyui}
read -p "2. pyenv 虚拟环境名称: " PYENV_NAME
PYENV_NAME=${PYENV_NAME:-comfyui}

PYTHON_EXE="$(eval echo "~$USER")/.pyenv/versions/$PYENV_NAME/bin/python"
MAIN_PY="$WORKSPACE/main.py"

read -p "3. 实例总数: " INSTANCE_COUNT

# 1. 生成 PM2 配置文件
CONFIG_FILE="$WORKSPACE/ecosystem.config.js"
echo "module.exports = { apps: [" > $CONFIG_FILE
declare -a PORTS
for ((i=1; i<=INSTANCE_COUNT; i++)); do
read -p "实例 #$i 端口: " PORT
read -p "实例 #$i 显卡 ID: " GPU_ID
PORTS+=($PORT)
cat <<EOF >> $CONFIG_FILE
{
name: "comfy-$PORT",
cwd: "$WORKSPACE",
script: "$MAIN_PY",
interpreter: "$PYTHON_EXE",
args: "--port $PORT --highvram --bf16-unet --use-pytorch-cross-attention --listen 0.0.0.0",
env: { CUDA_VISIBLE_DEVICES: "$GPU_ID", PYTHONUNBUFFERED: "1" },
autorestart: true,
max_memory_restart: '22G'
},
EOF
done
echo " ] };" >> $CONFIG_FILE

# 2. 生成 Watchdog 监测脚本 (处理假死)
WATCHDOG_PATH="$WORKSPACE/comfy_watchdog.sh"
cat <<EOF > $WATCHDOG_PATH
#!/bin/bash
PORTS=(${PORTS[@]})
while true; do
for PORT in "\${PORTS[@]}"; do
HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" --max-time 15 http://127.0.0.1:\$PORT/)
if [ "\$HTTP_CODE" -ne 200 ]; then
pm2 restart "comfy-\$PORT"
fi
done
sleep 60
done
EOF
chmod +x $WATCHDOG_PATH

# 3. 启动
pm2 delete /comfy-.*/ 2>/dev/null || true
pm2 start $CONFIG_FILE
pm2 start $WATCHDOG_PATH --name "comfy-monitor"
pm2 save
}

case "$1" in
install) do_install ;;
uninstall) pm2 delete /comfy-.*/ 2>/dev/null || true ;;
*) echo "Usage: $0 {install|uninstall}" ;;
esac

第二部分:Caddy 负载均衡网关

在多实例运行后,需要一个统一入口。Caddy 相比 Nginx 的优势在于配置极其简洁,且天然支持 HTTP/3。

脚本 2:caddy_pm2_setup.sh

此脚本会自动处理端口格式,确保 Caddy 不会将纯数字误认为域名。

Bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/bash
# ============================================================
# Caddy PM2 自动化部署脚本 (v1.5)
# ============================================================
set -e

# 1. 自动下载 (支持国内镜像加速)
install_caddy() {
if ! command -v caddy >/dev/null 2>&1; then
URL="https://mirror.ghproxy.com/https://github.com/caddyserver/caddy/releases/download/v2.7.6/caddy_2.7.6_linux_amd64.tar.gz"
curl -L "$URL" -o caddy.tar.gz
tar -zxvf caddy.tar.gz caddy
mv caddy /usr/bin/ && chmod +x /usr/bin/caddy
rm caddy.tar.gz
fi
}

# 2. 生成 Caddyfile 并启动
configure_and_run() {
read -p "监听端口 (默认 80): " SITE_PORT
SITE_PORT=${SITE_PORT:-80}
[[ $SITE_PORT != :* ]] && LISTEN_ADDR=":$SITE_PORT" || LISTEN_ADDR="$SITE_PORT"

read -p "后端 ComfyUI 端口 (空格分隔): " PORTS
BACKENDS=""
for p in $PORTS; do
clean_p=${p#:}
BACKENDS="$BACKENDS 127.0.0.1:$clean_p"
done

cat <<EOF > Caddyfile
$LISTEN_ADDR {
encode gzip
reverse_proxy {
to $BACKENDS
lb_policy least_conn
health_uri /
health_interval 10s
transport http {
read_timeout 600s
write_timeout 600s
}
}
request_body { max_size 1GB }
}
EOF
pm2 delete caddy 2>/dev/null || true
pm2 start $(which caddy) --name "caddy" -- run --config ./Caddyfile --adapter caddyfile
pm2 save
}

install_caddy
configure_and_run

运维管理手册

1. 常用指令

  • 查看集群状态pm2 list

  • 查看网关日志(排查连接问题):pm2 logs caddy

  • 查看 ComfyUI 日志pm2 logs comfy-8188

  • 重启整个集群pm2 restart all

2. 关键配置解析

  • **lb_policy least_conn**:最少连接数优先。这对于 AI 推理至关重要,因为有的请求(如视频生成)耗时极长,该策略能确保新请求发往空闲实例。

  • **read_timeout 600s**:将超时阈值提升至 10 分钟。默认网关通常在 60s 后断开,会导致长耗时工作流前端报错。

  • **CUDA_VISIBLE_DEVICES**:通过环境变量精确锁定每个进程可见的 GPU,避免多实例竞抢同一张卡的显存。


卸载与清理

如需移除服务,可运行 pm2 delete caddy /comfy-.*/。本方案在清理时采用正则匹配,绝不会误伤服务器上的其他关键服务。