KOOK艺术馆部署教程:Nginx负载均衡支持百人并发访问
想象一下,你搭建了一个像卢浮宫一样精美的AI艺术馆,用户们慕名而来,都想体验用AI创作梵高风格画作的乐趣。但突然间,访问人数激增,你的服务器开始卡顿、响应变慢,甚至直接崩溃,用户只能看到“服务器繁忙”的提示,失望离开。
这正是单服务器部署的痛点。一个再精美的应用,如果无法承载大量用户同时访问,它的价值就会大打折扣。
今天,我们就来解决这个问题。我将带你从零开始,为“璀璨星河”KOOK艺术馆部署一套Nginx负载均衡系统。这套方案能让你的艺术馆轻松支持上百人同时在线创作,每个人都能获得流畅、稳定的体验。无论你是个人开发者,还是希望为团队提供稳定服务,这篇教程都能给你一套清晰、可落地的方案。
1. 为什么需要负载均衡?从单间画室到艺术宫殿
在深入部署之前,我们先搞清楚负载均衡到底解决了什么问题。你可以把最初的单服务器部署想象成一个单间画室。
- 画室(单服务器):只有一位画家(CPU/GPU),一套画具(内存/显存)。一次只能接待一位访客(用户请求)进行创作。当第二位、第三位访客同时到来时,他们必须排队等待,体验很差。
- 艺术宫殿(负载均衡集群):我们建造了一个宫殿入口(Nginx),后面连接着多个独立的画室(多个应用服务器)。入口处的接待员(负载均衡器)会根据每个画室的忙碌程度,智能地将新来的访客引导到最空闲的画室去。这样,多个访客可以同时在不同画室创作,互不干扰,整体接待能力成倍提升。
“璀璨星河”艺术馆的技术特点决定了它尤其需要负载均衡:
- 计算密集型:生成一张高清AI画作需要消耗大量的GPU资源。
- 会话保持:用户在Streamlit界面的操作是连续的,需要保持与同一后端服务器的连接。
- 资源隔离:一个用户的生成任务不应影响其他用户的体验。
通过引入Nginx作为负载均衡器,我们将实现:
- 高并发:分散用户请求到多个后端服务器。
- 高可用:某一台后端服务器宕机,Nginx会自动将流量切到健康的服务器。
- 易于扩展:未来用户量再增长,只需水平增加后端服务器即可。
2. 部署架构与环境准备
我们的目标架构很简单,但非常有效。
2.1 系统架构图
用户浏览器 | v [Nginx负载均衡服务器 (192.168.1.100:80)] | | (分发请求) v +---------------------+---------------------+ | | | v v v [App Server 1] [App Server 2] [App Server 3] (192.168.1.101:8501) (192.168.1.102:8501) (192.168.1.103:8501) 运行“璀璨星河” 运行“璀璨星河” 运行“璀璨星河”角色说明:
- Nginx服务器:一台。负责接收所有用户请求,并按照规则转发。对CPU要求不高,但网络要稳定。
- 应用服务器:至少两台。运行真正的“璀璨星河”Streamlit应用。需要较强的GPU算力(用于AI绘画)和足够的内存。
2.2 基础环境准备
假设你已经在一台应用服务器上成功部署了“璀璨星河”艺术馆(即能通过http://服务器IP:8501访问)。现在,你需要:
- 准备多台应用服务器:至少再准备一台配置相似的服务器,并按照“璀璨星河”的部署文档,完整地部署好应用。确保每台都能独立通过
http://本机IP:8501访问。 - 准备一台Nginx服务器:可以选择一台轻量级的云服务器或虚拟机,安装纯净的Linux系统(如Ubuntu 22.04)。这台机器不需要GPU。
- 确保网络互通:所有服务器(Nginx和各个App Server)需要在同一个内网中,或者能通过IP地址相互访问,并且关闭了防火墙或放行了相关端口(Nginx的80端口,App Server的8501端口)。
3. 搭建Nginx负载均衡器
现在,我们来配置核心的Nginx服务器。
3.1 安装Nginx
在Nginx服务器上执行:
# 更新软件包列表 sudo apt update # 安装Nginx sudo apt install nginx -y # 启动Nginx并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginx安装完成后,在浏览器访问http://你的Nginx服务器IP,如果看到Nginx的欢迎页面,说明安装成功。
3.2 配置负载均衡
Nginx的主要配置在/etc/nginx/nginx.conf以及/etc/nginx/sites-available/目录下。我们创建一个专用于艺术馆的配置。
创建配置文件:
sudo nano /etc/nginx/sites-available/starry_night_lb写入以下配置内容:
upstream starry_night_backend { # 负载均衡算法,这里使用加权轮询(weight), # 你可以根据服务器性能分配权重,性能好的权重高。 least_conn; # 或者使用 ip_hash; 用于会话保持 # 将下面的IP和端口替换为你实际的应用服务器地址 server 192.168.1.101:8501 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.102:8501 weight=2 max_fails=3 fail_timeout=30s; server 192.168.1.103:8501 weight=2 max_fails=3 fail_timeout=30s; # 可选:备份服务器,当所有主服务器都宕机时启用 # server 192.168.1.104:8501 backup; } server { listen 80; # 如果你的服务器有域名,在这里配置 # server_name art.yourdomain.com; # 访问日志和错误日志路径 access_log /var/log/nginx/starry_night_access.log; error_log /var/log/nginx/starry_night_error.log; location / { # 将请求代理到上游服务器组 proxy_pass http://starry_night_backend; # 以下是一系列重要的代理设置,确保Streamlit正常工作 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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; # 超时设置 proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; send_timeout 300s; # 禁用缓冲,对于Streamlit的流式响应很重要 proxy_buffering off; } }关键配置解释:
upstream starry_night_backend:定义了一个名为starry_night_backend的后端服务器组。least_conn:负载均衡算法,将新请求发送给当前连接数最少的服务器。这对于AI生成这种耗时任务很公平。你也可以用ip_hash来确保同一用户始终访问同一后端(会话保持),但会牺牲一些负载均衡性。server ... weight=3 ...:定义后端服务器。weight是权重,数字越大分配到的请求比例越高。max_fails和fail_timeout定义了健康检查机制。proxy_set_header Upgrade $http_upgrade;:这几行对于Streamlit的WebSocket通信至关重要,没有它,页面可能无法实时更新。proxy_buffering off;:关闭代理缓冲,让AI生成图片的过程能够流式地传输到浏览器,用户体验更好。
启用配置并测试:
# 创建符号链接到sites-enabled目录 sudo ln -s /etc/nginx/sites-available/starry_night_lb /etc/nginx/sites-enabled/ # 测试Nginx配置语法是否正确 sudo nginx -t # 如果看到 `syntax is ok` 和 `test is successful`,说明配置正确。 # 重新加载Nginx配置,使新配置生效 sudo systemctl reload nginx
4. 配置后端应用服务器
为了让应用在负载均衡环境下更稳定,我们需要对每台运行“璀璨星河”的服务器进行一些优化。
4.1 调整Streamlit启动参数
在每台应用服务器上,启动Streamlit应用时,建议使用以下命令或相应配置:
# 假设你的应用主文件是 app.py streamlit run app.py \ --server.port 8501 \ --server.address 0.0.0.0 \ --server.maxUploadSize 200 \ --server.maxMessageSize 200 \ --server.enableCORS false \ --server.enableXsrfProtection false \ --browser.serverAddress 你的Nginx服务器IP \ --browser.serverPort 80参数说明:
--server.address 0.0.0.0:允许任何IP访问,这对被Nginx代理是必要的。--browser.serverAddress和--browser.serverPort:这非常重要!它告诉Streamlit前端,应该去连接哪个地址(即Nginx的地址)来建立WebSocket等连接。如果不设置,前端可能会错误地尝试直接连接后端服务器的IP,导致功能异常。
4.2 使用进程管理器(推荐)
为了让应用在后台稳定运行,即使崩溃也能自动重启,建议使用systemd或supervisor。
使用systemd示例:创建服务文件/etc/systemd/system/starry-night.service:
[Unit] Description=Starry Night AI Art Gallery After=network.target [Service] Type=simple User=你的用户名 WorkingDirectory=/path/to/your/app Environment="PATH=/home/你的用户名/miniconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ExecStart=/home/你的用户名/miniconda3/bin/streamlit run app.py --server.port 8501 --server.address 0.0.0.0 --browser.serverAddress 192.168.1.100 --browser.serverPort 80 Restart=always RestartSec=10 [Install] WantedBy=multi-user.target然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable starry-night sudo systemctl start starry-night sudo systemctl status starry-night # 检查状态5. 测试与验证
部署完成后,必须进行测试。
- 基础访问测试:在浏览器直接访问
http://你的Nginx服务器IP。你应该能看到“璀璨星河”艺术馆的界面,并且所有功能(输入提示词、生成图片)都正常。 - 负载均衡测试:
- 分别查看每台应用服务器的Streamlit日志或使用
htop查看资源占用。 - 同时从多个浏览器标签页或不同机器访问艺术馆,并触发图片生成。观察Nginx的访问日志 (
tail -f /var/log/nginx/starry_night_access.log),你会看到请求被分配到了不同的后端服务器IP上。
- 分别查看每台应用服务器的Streamlit日志或使用
- 容错测试(可选):
- 手动停止其中一台应用服务器的Streamlit服务。
- 继续访问艺术馆,用户请求应该会被自动分配到其他健康的服务器上,整体服务不受影响(可能会中断当前正在该故障服务器上生成的任务)。
6. 性能优化与监控建议
部署只是第一步,要让艺术馆长期稳定运行,还需要一些“保养”。
6.1 Nginx性能调优
在/etc/nginx/nginx.conf的events和http块中,可以调整以下参数以适应高并发:
events { worker_connections 4096; # 每个工作进程的最大连接数 use epoll; # Linux高效事件模型 multi_accept on; } http { ... # 保持连接超时时间,减少频繁建立连接的开销 keepalive_timeout 65; keepalive_requests 100; ... }调整后记得sudo nginx -t和sudo systemctl reload nginx。
6.2 简易监控
你可以编写一个简单的脚本来检查后端服务器健康状态:
#!/bin/bash # check_backends.sh BACKENDS=("192.168.1.101:8501" "192.168.1.102:8501" "192.168.1.103:8501") for backend in "${BACKENDS[@]}"; do if curl -s -f -o /dev/null --connect-timeout 2 "http://$backend/_stcore/health"; then echo " Backend $backend is HEALTHY" else echo " Backend $backend is DOWN" # 可以在这里添加报警逻辑,如发送邮件、钉钉消息等 fi done使用crontab -e设置定时任务,每5分钟运行一次这个脚本。
7. 总结
通过以上步骤,你已经成功地将一个单点的“璀璨星河”艺术馆,升级为一个具备弹性伸缩能力的高可用集群。让我们回顾一下关键点:
- 架构清晰:Nginx作为统一的流量入口,负责分发请求;多台应用服务器真正执行AI绘画任务,各司其职。
- 配置核心:Nginx的
upstream配置和正确的proxy_set_header是成功的关键,特别是对Streamlit这种依赖WebSocket的应用。 - 细节决定成败:后端应用启动时
--browser.serverAddress参数的设置,是很多人在配置负载均衡时容易忽略但至关重要的一步。 - 持续运维:使用进程管理器保障应用稳定,通过简单的脚本进行健康监控,让系统运维化被动为主动。
现在,你的艺术馆已经做好了迎接百人乃至千人同时创作的准备。技术的价值在于赋能创意,这套负载均衡方案,就是为你和用户的创意保驾护航的坚实基石。去邀请更多朋友来你的艺术馆参观和创作吧!
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。