跳至主要内容
注意

本教學由社群貢獻,並未受到 Open WebUI 團隊的支持。僅用作展示如何根據您的特定使用案例自訂 Open WebUI。如果希望貢獻?可以查看貢獻指南。

為 Open WebUI 配置 HAProxy

HAProxy(高可用代理)是一種專業的負載均衡及反向代理解決方案,具有高度可配置性,設計目的是在資源消耗較低的情況下處理大量連接。欲了解更多資訊,請參見:https://www.haproxy.org/

安裝 HAProxy 和 Lets Encrypt

首先,安裝 HAProxy 和 Lets 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
# 將這些消息輸出到 /var/log/haproxy.log,您需要執行以下操作:
#
# 1)配置 syslog 接受網路日誌事件。這可以通過
# 在 /etc/sysconfig/syslog 中添加 -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/

#Lets 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 請求傳遞給 Lets 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 和 Lets Encrypt 的 ACL 記錄(路由器)。要使用 OWUI 的 WebSocket,您需要配置 SSL,而最簡單的方法是使用 Lets Encrypt。

您可以使用子域名方法或路徑方法將流量路由到 Open WebUI。子域名方法需要專用子域名(例如:chat.yourdomain.com),而路徑方法允許您通過域上的特定路徑(例如:yourdomain.com/owui/)訪問 Open WebUI。選擇最適合您需求的方法並相應更新配置。

資訊

您需要將 80 和 443 埠對外暴露給 HAProxy 伺服器。這些埠是 Lets Encrypt 驗證您的域以及處理 HTTPS 流量所需的。您還需要確保將您的 DNS 記錄正確配置至 HAProxy 伺服器。如果您在家中運行 HAProxy,則需要在路由器中設置埠轉發,將 80 和 443 埠轉發至 HAProxy 伺服器。

使用 Lets Encrypt 頒發 SSL 憑證

在啟動 HAProxy 前,您需要生成自簽名憑證作為佔位符,直到 Lets 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 將處理與 Lets Encrypt 的驗證過程,並在證書臨近到期時自動更新它們(假設您使用 certbot 的自動更新服務)。

您可以通過運行 haproxy -c -f /etc/haproxy/haproxy.cfg 驗證 HAProxy 配置。如果沒有錯誤,您可以使用 systemctl start haproxy 啟動 HAProxy,並通過 systemctl status haproxy 驗證其運行狀態。

為了確保 HAProxy 隨系統啟動,請使用 systemctl enable haproxy

當您配置好 HAProxy 後,可以使用 Lets Encrypt 簽發有效的 SSL 證書。 首先,您需要向 Lets Encrypt 註冊。此操作通常只需要執行一次:

certbot register --agree-tos --email [email protected] --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 配置和 Lets Encrypt SSL,我編寫了一個簡單的 Python 腳本並創建了一個 Docker 容器,您可以使用它來創建和管理 HAProxy 配置以及管理 Lets Encrypt 證書生命周期。

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

注意

如果使用該腳本或容器,請不要將 8000 端口公開!