造个轮子,用deno加速抱脸Open WebUI

抱脸国内访问速度慢,上面部署的Open WebUI访问起来经常卡顿,原因是Open WebUI比较重,静态资源比较大,在访问速度慢的情况下加载时间特别长,导致经常卡LOGO,甚至有时聊天都会卡,而用deno反代就可以很好的解决这个问题。至于为什么不用CF Workers,原因是它好像对反代的限制也越来越严了,反代Open WebUI这种比较重的项目,动不动就会报错。

下面是deno反代的源码

import { serve } from "https://deno.land/[email protected]/http/server.ts";
import { parse } from "https://deno.land/[email protected]/flags/mod.ts";

const DEFAULT_PORT = 8080;
const TARGET_HOST = "open-webui-open-webui.hf.space";

function log(message: string) {
  console.log(`[${new Date().toISOString()}] ${message}`);
}

function getDefaultUserAgent(isMobile: boolean = false): string {
  if (isMobile) {
    return "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36";
  } else {
    return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
  }
}

function transformHeaders(headers: Headers): Headers {
  const isMobile = headers.get("sec-ch-ua-mobile") === "?1";
  const newHeaders = new Headers();

  for (const [key, value] of headers.entries()) {
    newHeaders.set(key, value);
  }

  newHeaders.set("User-Agent", getDefaultUserAgent(isMobile));
  newHeaders.set("Host", TARGET_HOST);
  newHeaders.set("Origin", `https://${TARGET_HOST}`);

  return newHeaders;
}

async function handleRequest(req: Request): Promise<Response> {
  try {
    const url = new URL(req.url);
    const targetUrl = `https://${TARGET_HOST}${url.pathname}${url.search}`;
    log(`Proxying request: ${targetUrl}`);

    const proxyReq = new Request(targetUrl, {
      method: req.method,
      headers: transformHeaders(req.headers),
      body: req.body,
      redirect: "follow",
    });

    const response = await fetch(proxyReq);

    const responseHeaders = new Headers(response.headers);
    responseHeaders.set("Access-Control-Allow-Origin", "*");

    return new Response(response.body, {
      status: response.status,
      headers: responseHeaders,
    });
  } catch (error) {
    log(`Error: ${error.message}`);
    return new Response(`Proxy Error: ${error.message}`, { status: 500 });
  }
}

async function startServer(port: number) {
  log(`Starting proxy server on port ${port}`);

  await serve(handleRequest, {
    port,
    onListen: () => {
      log(`Listening on http://localhost:${port}`);
    },
  });
}

if (import.meta.main) {
  const { args } = Deno;
  const parsedArgs = parse(args);

  const port = parsedArgs.port ? Number(parsedArgs.port) : DEFAULT_PORT;

  startServer(port);
}

注意

我这里设置的是反代Open WebUI的官方的抱脸空间,使用时请把代码第四行的open-webui-open-webui.hf.space替换成你自己的抱脸空间域名

186 个赞

大佬,真的高产呀

1 个赞

感谢佬友分享!

7 个赞

大佬,太厉害了

3 个赞

感谢佬友分享

8 个赞

速度提升怎么样,可以的话,我的抱脸公开 space 都路由过去 :tieba_024:

2 个赞

加载静态资源的速度至少要快十倍,虽然延时方面看不到明显的提升,但是速度是拉满的,实际体验比Workers好

3 个赞

可以的,用 worker 速度不怎么好。
回去搞一下 deno :tieba_024:

13 个赞

再套一个cf优选还能加吗

2 个赞

别套CF了,套就变慢,它给的deno.dev直连就好

10 个赞

好思路,那其实deno 可以反代其他的网站:thinking:

我部署到自己的服务器上了,实在受不了太慢了

3 个赞

可以是可以,但是我这个源码不能直接用,因为我这边是专门针对Open WebUI优化的:tieba_087:

2 个赞

这样吗,如果deno反代效果好我想让其他网站也反代一下

8 个赞

别滥用,人家是一个小公司,撑不住的:tieba_087:
正常用大善人的workers就足够了,只是Open WebUI这种比较重的东西workers效果不好

1 个赞

不会不会,就是个小博客,因为开cf cdn有点慢而且有时加载不出来才想到反代的

13 个赞

他那个额度比较小,像你这种博客根本就撑不住的, 这个额度也就够几个人顶多是一个小团队一起用。

3 个赞

不是,我哪种博客啊 :sweat_smile:,算了算了

2 个赞

解决了实际问题

这种公开网站还是走CF靠的谱点,毕竟还是要抗D和CC的,我这边有一个优选的域名速度很快,你可以去试试。
https://linux.do/t/topic/269385

1 个赞