反代 open-webui 的 nginx 配置优化

之前有佬分享了关于 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 缓存自动更新。

操作步骤

  1. 建立 /var/cache/nginx 目录用以存储缓存信息, 确保 nginx 运行用户对该目录具有读写权限
  2. 根据需要在 nginx 配置 http 配置中设定 proxy_cache_path (见下)
  3. 配置 /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 伴侣了)

18 个赞


这里吧

1 个赞

:tieba_087: :tieba_087: :tieba_087:
在 NextChat 之前曾用过一个仿 Bing AI 风格的前端,每次打开都要加载完开屏特效才缓缓进入列表界面。。然后接触到 ChatGPT-Web-Next 之后就立马全部成 NextChat 了

太强了,大佬

感谢佬

我以为是通过 js setTimeout 控制的, 没想到是css

厉害,对着搞一下

这是怎么改,代码加在哪个位置。。。

在 open_webui 库中文件路径 lib/python3.11/site-packages/open_webui/frontend/index.html

docker内应该是类似的 如果不是的话就是佬友图片里的 open-webui/src/app.html

.animate-pulse-fast {
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

这段代码是添加在png"后面吗?

大佬,我也是Python包部署的,用的frp内网穿透,也可以优化吗 :lark_044:

不是,是修改它

我贴的是原来有的。它原来的参数是 1.5s, 我改成了 0.5s.

你可以在文件里搜索一下关键字 “animate-pulse-fast”

应该可以

根据路径 /api/models 应该是后端先向 api server 查询后再发往前端的。

你可以 ctrl+shift+i 打开 浏览器调试界面,点 网络(Network) 栏。访问你的 open-webui 地址, 如果显示 models 请求时间很长就可以优化

1 个赞

懂了。我还以为是改图上框出来的部分。。。
我前后端都在一台机器上的,回头我看看有没必要优化一下models

哈哈,谢谢佬,我看了models的请求确实挺久的(3s左右),但我没有NGINX :smiling_face_with_tear:,不过我把oi标签的那个改了下,我先忍忍15s的启动吧 :joy:

学习了,上班就搞搞,冲