Skip to main content
warning

本教程是社区贡献,不受Open WebUI团队支持。它仅作为如何为您的特定用例自定义Open WebUI的演示。想要贡献?请查看贡献教程。

Open WebUI的HAProxy配置

HAProxy(高可用性代理)是一个专门的负载均衡和反向代理解决方案,高度可配置,旨在以相对较低的资源占用处理大量连接。更多信息请参见:https://www.haproxy.org/

安装HAProxy和Let's Encrypt

首先,安装HAProxy和Let's Encrypt的certbot:

Red Hat衍生版

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
# 要让这些消息最终出现在 /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
#---------------------------------------------------------------------
# 所有'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

#子域名方法
acl chat-acl hdr(host) -i subdomain.domain.tld
#路径方法
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

#OWUI聊天
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记录(路由器)。要将WebSocket与OWUI一起使用,您需要配置SSL,最简单的方法是使用Let's Encrypt。

您可以使用子域名方法或路径方法将流量路由到Open WebUI。子域名方法需要专用子域名(例如chat.yourdomain.com),而路径方法允许您通过域名上的特定路径访问Open WebUI(例如yourdomain.com/owui/)。选择最适合您需求的方法并相应更新配置。

info

您需要向HAProxy服务器开放端口80和443。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

info

确保根据您的需求和配置更新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管理器(简易部署选项)

如果您希望有工具自动管理您的HAProxy配置和Let's Encrypt SSL,我编写了一个简单的Python脚本并创建了一个Docker容器,您可以用来创建和管理您的HAProxy配置以及管理Let's Encrypt证书生命周期。

https://github.com/shadowdao/haproxy-manager

warning

如果您使用该脚本或容器,请不要公开暴露端口8000!