Stable-Diffusion-v1-5 WebUI 高可用:双实例 + 负载均衡 + 健康检查部署
单点部署的 WebUI 服务面临稳定性挑战,一旦服务挂掉,所有工作都得停摆。对于需要稳定、高效生成图片的团队或个人来说,搭建一套高可用架构至关重要。
这套方案的核心很简单:部署两个 WebUI 实例,前面加一个负载均衡器,再配上自动健康检查。这样一来,任何一个实例出问题,流量会自动切到另一个健康的实例上,服务几乎不会中断。同时,负载均衡还能把用户请求分摊开,提升整体的处理能力。
下面,我就手把手带你从零搭建这套系统。
1. 方案设计与核心思路
在开始敲命令之前,我们先搞清楚要做什么,以及为什么这么做。
1.1 我们要解决什么问题?
单实例部署的 Stable Diffusion WebUI 有几个明显的痛点:
- 单点故障:服务进程崩溃、服务器重启、代码更新,都会导致服务不可用。
- 资源瓶颈:GPU 算力有限,多个用户或复杂任务同时进行时,排队严重,体验差。
- 维护困难:更新或调试服务时,必须停止服务,影响所有用户。
1.2 高可用方案的核心组件
我们的解决方案包含三个核心部分:
- 双实例:在两台服务器(或一台服务器的不同端口)上,分别部署完全相同的 Stable-Diffusion-v1-5 WebUI 服务。这是我们的'后备军'。
- 负载均衡器 (Nginx):作为统一的入口,接收所有用户请求。它的职责是'调度',根据策略(比如轮询)将请求分发给后端的两个 WebUI 实例。
- 健康检查:负载均衡器会定期(比如每 5 秒)去'探访'后端的每个 WebUI 实例,检查它是否还'活着'(能正常响应)。如果发现某个实例挂了,就立刻不再把新请求发给它,直到它恢复健康。
整个流程就像一家餐厅开了两个相同的厨房(实例),一个前台经理(Nginx)负责接待顾客(请求)并把点菜单分给两个厨房。经理会不断检查厨房是否着火(健康检查),如果 A 厨房着火了,就把所有新订单都交给 B 厨房,保证餐厅继续营业。
2. 环境准备与双实例部署
假设我们有两台服务器:server-A (192.168.1.10) 和 server-B (192.168.1.11)。我们将在这两台服务器上部署 WebUI。
2.1 基础环境与镜像部署
在两台服务器上,执行相同的部署操作。这里假设你已经获取了 stable-diffusion-v1-5 的部署镜像。
# 1. 登录服务器(以 server-A 为例)
ssh [email protected]
# 2. 假设镜像已提供一键部署脚本,运行它。如果没有,核心是启动 WebUI 服务。
# 通常启动命令类似这样(具体参数根据你的镜像调整):
cd /path/to/sd-webui
python launch.py --listen --port 7860 --medvram
# 3. 使用 Supervisor 守护进程(确保服务崩溃后能自动重启)
# 安装 supervisor (如果未安装)
apt-get update && apt-get install -y supervisor
# 创建 Supervisor 配置文件
cat > /etc/supervisor/conf.d/sd15-webui.conf << EOF
[program:sd15-webui]
command=python /path/to/sd-webui/launch.py --listen --port 7860 --medvram
directory=/path/to/sd-webui
autostart=true
autorestart=true
startretries=3
user=root
redirect_stderr=true
stdout_logfile=/var/log/sd15-webui.log
stdout_logfile_maxbytes=10MB
EOF
supervisorctl reread
supervisorctl update
supervisorctl start sd15-webui
curl http://localhost:7860
supervisorctl status sd15-webui

