之前有佬分享了关于 nginx 反代 open-webui 的优化配置,主要是针对网络传输。 我是将 open-webui 配置在本地使用,CDN 缓存加速对我来说没有效果。我分享一下通过设置 浏览器缓存和 nginx 代理缓存来加速访问 open-webui 服务,供各位参考。
我的环境
- root 运行 nginx
- normal user 运行 open-webui 0.5.2, 端口 8888 (python 3.11, 通过 bin/open-webui serve 启动)
- 通过 http://openwebui.local 访问服务
缓存请求 ‘/api/models’
得益于 open-webui 的加载逻辑, 每次访问根目录都要请求一次该 api。我代理节点在美国,请求模型列表时间极长,几乎需要 3s. 这个 api 单独拎出来,让 nginx 缓存自动更新。
操作步骤
- 建立
/var/cache/nginx
目录用以存储缓存信息, 确保 nginx 运行用户对该目录具有读写权限 - 根据需要在 nginx 配置 http 配置中设定
proxy_cache_path
(见下) - 配置 /api/models 代理
效果
将 /api/models
访问时间从 2500ms 缩短到 4ms, 舒服
注意, 这个操作将导致更换 api 提供商时不能立即更新 models, 手动搞搞吧。 (反正一般情况下根本会更新 api 提供商)
配置
# models cache
location /api/models {
proxy_cache nginx_cache; # 这里的 nginx_cache 就是我设定的 proxy_cache_path
proxy_cache_key $request_uri;
# cache for 30 minutes
proxy_cache_valid 200 30m;
# make nignx auto update cache content
proxy_cache_background_update on; # 这里要求 nginx 自动更新 api
proxy_cache_use_stale updating;
proxy_cache_revalidate on;
proxy_cache_min_uses 1;
proxy_pass http://127.0.0.1:8888;
add_header X-Cache-Status $upstream_cache_status;
}
浏览器本地缓存
对我作用不大, 随手搞了. 如果是远程访问,这部分可以设得激进一点.
# Static resources
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)(.*) {
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Browser cache
expires 1d;
add_header Cache-Control "public, no-transform";
}
关于 openweb-ui 的完整 nginx 配置
以防万一, 给出全部配置
http {
include mime.types;
default_type application/octet-stream;
# 我只缓存 /api/models, 用到的空间较少
proxy_cache_path /var/cache/nginx
levels=1:2
keys_zone=nginx_cache:1m
max_size=100m
inactive=24h
use_temp_path=off;
keepalive_timeout 65;
server {
listen 80;
server_name openwebui.local;
location / {
proxy_pass http://127.0.0.1:8888/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# websocket header
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
# Timeouts for WebSocket connections
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
# Static resources
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)(.*) {
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Browser cache
expires 1d;
add_header Cache-Control "public, no-transform";
}
# models
location /api/models {
proxy_cache nginx_cache;
proxy_cache_key $request_uri;
# cache for 30 minutes
proxy_cache_valid 200 30m;
# make nignx auto update cache content
proxy_cache_background_update on;
proxy_cache_use_stale updating;
proxy_cache_revalidate on;
proxy_cache_min_uses 1;
proxy_pass http://127.0.0.1:8888;
add_header X-Cache-Status $upstream_cache_status;
}
}
}
现在你可以在观赏 open-webui 巨大的 OI logo 约 0.5s 后和你的 AI 伴侣愉快地聊天了
p.s. 再次吐槽 open-webui 的加载逻辑, 我现在完整加载时间大概只要 200ms, 它要强迫我看它的 logo 500ms. 感觉被强奸了,有没有佬知道怎么修改它的开屏logo时间,我自己找不到
Update
更改
.animate-pulse-fast {
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
即可
(我现在只需要300ms就能看到我的 AI 伴侣了)