Stable-Diffusion-v1-5-archiveWebUI高可用:双实例+负载均衡+健康检查部署

Stable-Diffusion-v1-5-archive WebUI 高可用:双实例+负载均衡+健康检查部署

你是不是也遇到过这种情况:正在用 Stable Diffusion 生成一张重要的设计图,突然页面卡住,刷新一下直接 502 错误,所有工作进度都丢了。或者团队里几个人同时用,服务器就慢得像蜗牛,一张图要等好几分钟。

对于需要稳定、高效生成图片的团队或个人来说,单点部署的 WebUI 服务就像走钢丝——一旦服务挂了,所有工作都得停摆。今天,我就来分享一个实战方案:为 Stable-Diffusion-v1-5-archive WebUI 搭建一套高可用架构

这套方案的核心很简单:部署两个 WebUI 实例,前面加一个负载均衡器,再配上自动健康检查。这样一来,任何一个实例出问题,流量会自动切到另一个健康的实例上,服务几乎不会中断。同时,负载均衡还能把用户请求分摊开,提升整体的处理能力。

下面,我就手把手带你从零搭建这套系统。

1. 方案设计与核心思路

在开始敲命令之前,我们先搞清楚要做什么,以及为什么这么做。

1.1 我们要解决什么问题?

单实例部署的 Stable Diffusion WebUI 有几个明显的痛点:

  • 单点故障:服务进程崩溃、服务器重启、代码更新,都会导致服务不可用。
  • 资源瓶颈:GPU 算力有限,多个用户或复杂任务同时进行时,排队严重,体验差。
  • 维护困难:更新或调试服务时,必须停止服务,影响所有用户。

1.2 高可用方案的核心组件

我们的解决方案包含三个核心部分:

  1. 双实例:在两台服务器(或一台服务器的不同端口)上,分别部署完全相同的 Stable-Diffusion-v1-5-archive WebUI 服务。这是我们的“后备军”。
  2. 负载均衡器 (Nginx):作为统一的入口,接收所有用户请求。它的职责是“调度”,根据策略(比如轮询)将请求分发给后端的两个 WebUI 实例。
  3. 健康检查:负载均衡器会定期(比如每5秒)去“探访”后端的每个 WebUI 实例,检查它是否还“活着”(能正常响应)。如果发现某个实例挂了,就立刻不再把新请求发给它,直到它恢复健康。

整个流程就像一家餐厅开了两个相同的厨房(实例),一个前台经理(Nginx)负责接待顾客(请求)并把点菜单分给两个厨房。经理会不断检查厨房是否着火(健康检查),如果A厨房着火了,就把所有新订单都交给B厨房,保证餐厅继续营业。

2. 环境准备与双实例部署

假设我们有两台服务器:server-A (192.168.1.10)server-B (192.168.1.11)。我们将在这两台服务器上部署 WebUI。

2.1 基础环境与镜像部署

在两台服务器上,执行相同的部署操作。这里假设你已经通过类似 ZEEKLOG 星图镜像广场的平台,获取了 stable-diffusion-v1-5-archive 的部署镜像。

# 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 # 更新Supervisor配置并启动服务 supervisorctl reread supervisorctl update supervisorctl start sd15-webui # 4. 验证服务是否启动 curl http://localhost:7860 # 或者查看进程 supervisorctl status sd15-webui 

server-B (192.168.1.11) 上重复完全相同的步骤。确保两台服务器的 WebUI 都能通过各自的 IP 和端口 7860 独立访问。

关键点:确保两台服务器上的模型文件、依赖库版本完全一致,以避免生成效果出现差异。

3. 配置 Nginx 负载均衡与健康检查

现在,我们需要第三台服务器作为负载均衡器 (lb-server, 192.168.1.12),或者你也可以选择在 server-Aserver-B 其中一台上安装 Nginx。

3.1 安装与配置 Nginx

在负载均衡器服务器上操作:

# 1. 安装 Nginx apt-get update && apt-get install -y nginx # 2. 创建负载均衡配置文件 # 我们将其放在 /etc/nginx/conf.d/ 下 cat > /etc/nginx/conf.d/sd15-loadbalancer.conf << EOF upstream sd15_backend { # 定义后端服务器组,并配置健康检查 server 192.168.1.10:7860 max_fails=3 fail_timeout=30s; server 192.168.1.11:7860 max_fails=3 fail_timeout=30s; # 负载均衡策略:轮询 (round-robin) # 其他策略:least_conn (最少连接), ip_hash (会话保持) } server { listen 80; # 如果你有域名,可以在这里配置 # server_name sd.yourdomain.com; location / { # 将请求代理到后端服务器组 proxy_pass http://sd15_backend; # 以下是一些重要的代理设置,确保WebUI正常工作 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket 支持 (如果WebUI有相关功能) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 超时设置 proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } # 可选:添加一个状态检查页面(需要nginx status模块) location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; # 只允许本机访问,安全考虑 deny all; } } EOF # 3. 测试Nginx配置语法是否正确 nginx -t # 4. 重新加载Nginx配置,使其生效 systemctl reload nginx 

3.2 核心配置解析

  • upstream sd15_backend: 定义了一个名为 sd15_backend 的后端服务器池。
  • max_fails=3 fail_timeout=30s: 这是被动健康检查。如果 Nginx 连续 3 次向后端服务器发送请求失败,就会认为该服务器“不健康”,并在接下来的 30 秒内不再向其分发请求。30秒后会再次尝试。
  • proxy_pass http://sd15_backend: 将所有到达 location / 的请求转发到后端服务器池。
  • 超时设置:Stable Diffusion 生成图片可能耗时较长,因此将 proxy_read_timeout 等参数调大,避免任务被意外中断。

3.3 验证负载均衡

配置完成后,你的用户将不再直接访问 192.168.1.10:7860192.168.1.11:7860,而是访问负载均衡器的 IP 或域名(例如 http://192.168.1.12)。

  1. 打开浏览器,访问 http://负载均衡器IP
  2. 你应该能看到熟悉的 Stable Diffusion WebUI 界面。
  3. 为了验证负载均衡是否生效,你可以快速、连续地提交几次生成请求,然后分别去两个后端服务器的应用日志 (/var/log/sd15-webui.log) 查看。你会看到请求被交替分配到了 server-Aserver-B

4. 模拟故障与高可用验证

架构好不好,得经过故障测试。我们来模拟一下后端实例崩溃的情况。

  1. 观察效果:此时,你继续通过负载均衡器 (http://192.168.1.12) 使用 WebUI 生成图片。
    • 第一次请求:Nginx 可能还会把请求发给已挂掉的 server-A,导致页面错误或长时间等待。
    • 后续请求:Nginx 检测到 server-A 连续失败(达到 max_fails=3),会将其标记为“不可用”。之后的所有新请求都会自动发给健康的 server-B服务整体没有中断!

恢复服务:在 server-A 上重启服务。

supervisorctl start sd15-webui 

等待片刻(fail_timeout=30s 之后),Nginx 会再次尝试将请求发给 server-A,如果成功,则自动将其加回健康池,恢复负载均衡。

制造故障:在 server-A 上,手动停止 WebUI 服务。

# 在 server-A 上执行 supervisorctl stop sd15-webui 

5. 进阶优化与生产建议

上面的方案已经能提供基础的高可用。要用于生产环境,还可以考虑以下几点:

5.1 使用域名与 HTTPS

为负载均衡器配置域名并申请 SSL 证书,启用 HTTPS,保证通信安全。

# 在Nginx配置中,将监听80端口的server块改为监听443,并配置SSL证书路径 server { listen 443 ssl http2; server_name sd.yourdomain.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; ... # 其他配置不变 } 

5.2 更精细的健康检查

Nginx 商业版或开源版搭配 nginx_upstream_check_module 模块,可以配置主动健康检查,定期请求一个特定的健康检查接口(比如 /health),更早地发现后端故障。

5.3 会话保持 (Session Persistence)

如果 WebUI 有用户登录状态等会话信息,默认的轮询策略会导致用户下次请求被发到不同后端,会话丢失。可以使用 ip_hash 策略,让同一客户端的请求总是发往同一后端。

upstream sd15_backend { ip_hash; # 添加此行 server 192.168.1.10:7860; server 192.168.1.11:7860; } 

5.4 监控与告警

为 Nginx 和后端服务器设置监控(如 Prometheus + Grafana),监控关键指标:

  • Nginx:请求率、响应时间、后端健康状态。
  • 服务器:CPU、GPU、内存使用率。
  • WebUI:生成队列长度、平均生成时间。 配置告警规则,当服务异常时及时通知运维人员。

6. 总结

通过 双实例部署 + Nginx 负载均衡 + 健康检查 这套组合拳,我们成功为 Stable-Diffusion-v1-5-archive WebUI 构建了一个简单而有效的高可用架构。

这个方案带来的核心价值是:

  • 可靠性提升:单点故障不再导致服务完全中断,保障了业务连续性。
  • 性能扩展:通过水平扩展实例,提高了系统整体的并发处理能力。
  • 维护便利:可以在不影响用户的情况下,对单个后端实例进行滚动更新或维护。

部署过程其实并不复杂,核心在于理解各个组件的作用和协作方式。你可以根据实际资源情况,将这个模式扩展到更多实例,或者结合 Docker 容器化技术,让部署和管理变得更加灵活高效。希望这篇实战指南能帮助你搭建出更稳定的 AI 图像生成服务。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Read more

【无人机协同】基于matlab动态环境下多无人机系统的协同路径规划与防撞(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭:行百里者,半于九十。 📋📋📋本文内容如下:🎁🎁🎁  ⛳️赠与读者 👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。      或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎 💥1 概述 动态环境下多无人机系统的协同路径规划与防撞研究 摘要 随着无人机技术的快速发展,多无人机协同作业在军事侦察、物流配送、灾害救援等领域展现出巨大潜力。然而,动态环境下的复杂障碍物分布、通信延迟及无人机动力学约束,对协同路径规划

【Microi吾码】 发现Microi吾码:低代码世界的超级英雄 ‍

【Microi吾码】 发现Microi吾码:低代码世界的超级英雄 ‍

🚀 发现Microi吾码:低代码世界的超级英雄 🦸‍♂️ 目录 🚀 发现Microi吾码:低代码世界的超级英雄 🦸‍♂️ 🌟 无拘无束的创作空间 🌈 跨平台跨数据库的无缝体验 代码示例:跨数据库连接 🚀 分布式架构的轻松部署 代码示例:Docker部署 🎨 界面自定义与SaaS引擎的完美结合 代码示例:自定义界面 ⚙️ 表单和接口引擎的高效协同 代码示例:接口引擎使用V8脚本 🔒 工作流和权限控制的精细管理 代码示例:工作流引擎配置 🔐 单点登录与移动端开发的便捷性 代码示例:单点登录集成 🏁 结语 作为一名对技术充满热情的业务分析师,我一直在寻找一个能够快速实现创意、满足我们多样化业务需求的平台。🔍 在这个快速变化的数字世界中,我找到了Microi吾码——一个开源的低代码平台,它以其卓越的性能和灵活性,成为了我日常工作中的得力助手。👩‍💻💼 🌟 无拘无束的创作空间 在我使用Microi吾码之前,我常常受限于平台的各种使用限制,比如用户数、表单数等。Microi吾码的无限制使用政策让我彻底摆脱了这些束缚。💥

无人机和地面站能够达到的多远的通信距离?无人机需要飞多高?附在线计算网页

无人机和地面站能够达到的多远的通信距离?无人机需要飞多高?附在线计算网页

无人机和地面站能够达到的多远的通信距离?无人机需要飞多高?附在线计算网页 在无人机组网通信中,如何估算无人机与地面站之间的稳定通信距离是一个常见的问题。本文将从地球曲率和菲涅尔区两个方面,详细探讨如何计算无人机与地面站的通信距离,并提供一个在线计算网页以方便读者进行实际计算。 经常有朋友会问到这个问题, * 无人机组网通信中,如果已经知道了无人机的飞行高度、地面站天线的高度,那么无人机和地面站稳定通信距离是多少km? * 无人机组网通信中,如果已经知道了地面站天线高度、期望的稳定通信距离,无人机需要飞多高才能满足期望的通信距离? 解答这个问题,需要从以下两个方面来考虑: 1. 无线通信距离受到地球曲率的影响 2. 无线通信距离受到空间传输通道的影响。 注意:本文不讨论由于发射端EIRP不够,链路余量不足引起的通信距离不足的问题,所有的计算和分析都是假设发射端EIRP足够,链线余量足够,仅仅考虑地球曲率和空间传输通道的影响。 地球曲率(无线信号传输的视距模型):解决能否看见的问题 无人机与地面电台之间的最远通讯距离受地球曲率限制,通常采用考虑大气折射的无线电视距

Flutter 三方库 eip55 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、符合 Web3 标准的以太坊地址校验与防串改引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 eip55 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、符合 Web3 标准的以太坊地址校验与防串改引擎 在鸿蒙(OpenHarmony)系统的区块链钱包应用、数字资产管理工具(如鸿蒙版 NFT 浏览器)或需要处理加密货币转账的场景中,如何确保用户输入的以太坊(Ethereum)地址既符合基本格式,又通过了大小写混合的校验和(Checksum)验证,防止因为单个字符手误导致的资产永久丢失?eip55 为开发者提供了一套工业级的、基于 EIP-55 提案的地址转换与验证方案。本文将深入实战其在鸿蒙 Web3 安全基座中的应用。 前言 什么是 EIP-55?它是由以太坊创始人 Vitalik Buterin 提出的地址校验和提案。通过在地址字符串中引入特定的。大小写混合模式(基于 Keccak-256 哈希)