本教程为社区贡献,不属于 Open WebUI 官方团队的支持范围。它仅作为如何针对特定用例自定义 Open WebUI 的演示。想要贡献?请查看贡献教程。
Open WebUI 的 HAProxy 配置
HAProxy (High Availability Proxy) 是一种专业的负载均衡和反向代理解决方案,具有高度可配置性,旨在以较低的资源占用处理大量连接。更多信息请访问:https://www.haproxy.org/
安装 HAProxy 和 Let's Encrypt
首先,安装 HAProxy 和 Let's Encrypt 的 certbot:
Redhat 衍生版本
sudo dnf install haproxy certbot openssl -y
Debian 衍生版本
sudo apt install haproxy certbot openssl -y
HAProxy 配置基础
HAProxy 的配置默认存储在 /etc/haproxy/haproxy.cfg 中。此文件包含了决定 HAProxy 运行方式的所有配置指令。
让 HAProxy 与 Open WebUI 协同工作的基本配置非常简单。
#---------------------------------------------------------------------
# 全局设置 (Global settings)
#---------------------------------------------------------------------
global
# 要让这些消息显示在 /var/log/haproxy.log 中,
# 您需要:
#
# 1) 配置 syslog 以接受网络日志事件。通过在
# /etc/sysconfig/syslog 的 SYSLOGD_OPTIONS 中添加 '-r' 选项来实现。
#
# 2) 配置 local2 事件到 /var/log/haproxy.log
# 文件。可以在 /etc/sysconfig/syslog 中添加如下行:
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# 如果 dh-param 太低请进行调整
tune.ssl.default-dh-param 2048
#---------------------------------------------------------------------
# 默认设置 (common defaults)
# 如果没有在对应的 block 中指定,所有的 'listen' 和 'backend' 部分都将使用这些设置
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor #except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 300s
timeout queue 2m
timeout connect 120s
timeout client 10m
timeout server 10m
timeout http-keep-alive 120s
timeout check 10s
maxconn 3000
#http 前端
frontend web
# 非 SSL 绑定
bind 0.0.0.0:80
# SSL/TLS 绑定
bind 0.0.0.0:443 ssl crt /path/to/ssl/folder/
# Let's Encrypt SSL 验证
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
# 子域名方法 (Subdomain method)
acl chat-acl hdr(host) -i subdomain.domain.tld
# 路径方法 (Path Method)
acl chat-acl path_beg /owui/
use_backend owui_chat if chat-acl
# 将 SSL 请求传递给 Let's Encrypt
backend letsencrypt-backend
server letsencrypt 127.0.0.1:8688
# Open WebUI 聊天后端
backend owui_chat
# 添加 X-FORWARDED-FOR
option forwardfor
# 添加 X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]
http-request set-header X-Forwarded-Proto https if { ssl_fc }
server chat <ip>:3000
您会看到我们为 Open WebUI 和 Let's Encrypt 都设置了 ACL 记录(路由)。要在 Open WebUI 中使用 WebSocket,您需要配置 SSL,最简单的方法就是使用 Let's Encrypt。
您可以使用子域名方法或路径方法将流量路由到 Open WebUI。子域名方法需要一个专用子域名(例如 chat.yourdomain.com),而路径方法允许您通过域名上的特定路径(例如 yourdomain.com/owui/)访问 Open WebUI。选择最适合您需求的方法并相应地更新配置。
您需要将 80 和 443 端口映射到您的 HAProxy 服务器。这些端口是 Let's Encrypt 验证域名以及 HTTPS 流量所必需的。您还需要确保 DNS 记录已正确配置并指向您的 HAProxy 服务器。如果您在家里运行 HAProxy,则需要在路由器中使用端口转发,将 80 和 443 端口转发到您的 HAProxy 服务器。
使用 Let's Encrypt 签发 SSL 证书
在启动 HAProxy 之前,您需要生成一个自签名证书作为占位符,直到 Let's Encrypt 签发正式证书。以下是生成自签名证书的方法:
openssl req -x509 -newkey rsa:2048 -keyout /tmp/haproxy.key -out /tmp/haproxy.crt -days 3650 -nodes -subj "/CN=localhost"
然后将密钥和证书合并为一个 HAProxy 可以使用的 PEM 文件:
cat /tmp/haproxy.crt /tmp/haproxy.key > /etc/haproxy/certs/haproxy.pem
请确保根据您的需求和配置更新 HAProxy 配置文件。
设置好 HAProxy 配置后,您可以使用 certbot 来获取和管理 SSL 证书。Certbot 将处理 Let's Encrypt 的验证过程,并在证书即将过期时自动更新它们(前提是您使用了 certbot 的自动续 期服务)。
您可以通过运行 haproxy -c -f /etc/haproxy/haproxy.cfg 来验证 HAProxy 配置。如果没有错误,您可以使用 systemctl start haproxy 启动 HAProxy,并通过 systemctl status haproxy 验证其运行状态。
要确保 HAProxy 随系统启动,请运行 systemctl enable haproxy。
配置好 HAProxy 后,您就可以使用 Let's Encrypt 签发有效的 SSL 证书了。 首先,您需要向 Let's Encrypt 注册。通常只需要操作一次:
certbot register --agree-tos --email your@email.com --non-interactive
然后您可以申请证书:
certbot certonly -n --standalone --preferred-challenges http --http-01-port-8688 -d yourdomain.com
证书签发后,您需要将证书和私钥文件合并为一个 HAProxy 可以使用的 PEM 文件。
cat /etc/letsencrypt/live/{domain}/fullchain.pem /etc/letsencrypt/live/{domain}/privkey.pem > /etc/haproxy/certs/{domain}.pem
chmod 600 /etc/haproxy/certs/{domain}.pem
chown haproxy:haproxy /etc/haproxy/certs/{domain}.pem
然后重启 HAProxy 以应用新证书:
systemctl restart haproxy
HAProxy Manager(便捷部署选项)
如果您希望自动管理 HAProxy 配置和 Let's Encrypt SSL,我编写了一个简单的 Python 脚本并创建了一个 Docker 容器,您可以用来创建和管理 HAProxy 配置以及 Let's Encrypt 证书生命周期。
https://github.com/shadowdao/haproxy-manager
如果您使用该脚本或容器,请不要将 8000 端口公开发布!