proxy-go 不同路径代理服务项目介绍,部署方法和更新日志

使用方法

1panel为例

登录账号设置

需要一个本论坛账号或github账号/QQ/Google

  1. 打开 https://connect.czl.net

  2. 登录你的论坛账号/github,

  3. 新建一个应用

    这里假设 https://proxy-go 是你的要绑定的域名, 回源地址就是https://proxy-go/admin/api/oauth/callback.
    记得不勾选公开, 类型是Oauth2

  4. 创建成功会获取到一个Client IDClient Secret, 保存好, 稍后要用.

创建容器并运行

  1. 新建一个编排, 使用这个docker-compose, 里面的OAUTH_CLIENT_IDOAUTH_CLIENT_SECRET就是上面获取的.

    最新镜像地址: woodchen/proxy-go:latest
    
    稳定版镜像地址: woodchen/proxy-go:v1.0.4
    
    持续稳定版镜像地址: woodchen/proxy-go:stable
    

图里的"OAUTH_ALLOWED_USERS"不用管, 已经删除了.

  1. 运行, 然后新建一个网站, 绑定3336端口, 就可以访问了.
    参考nginx配置
     location ^~ / {
         proxy_pass http://localhost:3336; 
         proxy_set_header Host $host; 
         proxy_set_header X-Real-IP $remote_addr; 
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
         proxy_set_header REMOTE-HOST $remote_addr; 
         proxy_set_header Upgrade $http_upgrade; 
         proxy_set_header Connection "upgrade"; 
         proxy_set_header X-Forwarded-Proto $scheme; 
         proxy_http_version 1.1; 
         add_header X-Cache $upstream_cache_status; 
         proxy_ssl_server_name off; 
         proxy_ssl_name $proxy_host; 
         proxy_buffering off; 
         proxy_cache_key $host$uri$is_args$args$http_accept; 
         add_header Cache-Control no-cache; 
         add_header Access-Control-Allow-Origin *;
     }
    

修改配置

/admin/dashboard/config/修改配置., 大概就像我这样:

压缩我没启用, 使用的是CDN的压缩, 本地用会占资源, 一般没必要, nginx可以进行压缩

固定路径主要反代一些js cdn资源, 直接用第一个会出错, 需要手动设置回源Host.

修改缓存配置

/admin/dashboard/cache/进行修改, 大概我这样, 可以自行调整:


使用示例, 也是建议的使用方法

比如我原图网址: https://b2.20200511.xyz/2025/03/67cff2273a20c.png

proxy-go的访问域名: https://img-test.czl.net

我现在要通过proxy-go来反代, 并且通过cloudflare images来优化.

我把 cfimg.20200511.xyz 通过cloudflare来解析, 具体解析到什么IP不重要, 只要是通过CF代理的就行了.

那么我这样配置:

默认路径使用直接的原图网址域名, 这样可以当文件小于200kb, 大于10M时不通过cloudflare images, 一是200kb以下是否优化影响不大, 二是超过10M的图片, cloudflare images优化不了, 这时候就直接反代原图网址, 反而更好

然后, 我添加一个扩展名映射:

目标URL: https://cfimg.czl.net/cdn-cgi/image/format=auto,metadata=none,onerror=redirect/https://b2.20200511.xyz
img-test.czl.net是cloudflare images优化的域名
中间是配置, 最后是原图网址的域名

保存后, 访问地址就变成了:

https://img-test.czl.net/img/2025/03/67cff2273a20c.png

构成:proxy-go的域名 + 选择映射的路径 + 原图的路径和文件名

这时候有两个情况:

  1. 文件在200kb到10M之间, 这时候反代的是这个网址:
    https://cfimg.czl.net/cdn-cgi/image/format=auto,metadata=none,onerror=redirect/https://b2.20200511.xyz/2025/03/67cff2273a20c.png
  2. 文件小于200kb, 或者大于10M, 这时候反代原图网址:
    https://b2.20200511.xyz/2025/03/67cff2273a20c.png

总结

经过这么多天的肝, 总算整体优化好了. 本来作为一个主中间项目, 是不需要做这么多前端可视化配置的.
1是为了自己改方便, 虽然一般不改.
2 也是对小白友好, 毕竟光部署过程, 就少了很多很多了.也不用手动去改json项

我想: 对小白友好, 上手简单, 应该是一个现在非极客开源项目必须要做的事情.


更新日志

2024.10.31更新

新增cdnjs和jsdelivr等代理, 也可以用于unpkg, 单独一个代理方法.

国内js代理只有字节比较稳定了, 但是字节的太久没更新, 有些新的库没有, 不如自己直接代理, 更方便也更快.

2024.11.17更新

支持根据不同的文件回源不同的地址

适配cloudflare images的图片优化, 支持format=auto

相关想法来自:

2024.11.30更新

功能作用

主要是最好有一台国外服务器, 回国又不慢的, 类似我买的绿云日本1111 IIJ服务器, 香港服务器也很好, 可以反代国外资源, 然后在proxy-go外面套个cloudfront或者Edgeone, 方便国内访问.

config里MAP的功能

目前我的主要使用是反代B2, R2, Oracle存储桶之类的. 也可以反代网站静态资源, 可以一并在CDN环节做缓存.

根据config示例作示范

  1. 访问https://proxy-go/path1/123.jpg, 实际是访问 https://path1.com/path/path/path/123.jpg
  2. 访问https://proxy-go/path2/749.movie, 实际是访问https://path2.com/749.movie

config里FixedPaths的功能

适合自己反代cdnjs和jsdelivr等, 可以在proxy-go前面套CDN

比如需要引用

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.5.12/vue.global.min.js"  crossorigin="anonymous" referrerpolicy="no-referrer"></script>

代理后把链接改成这样使用

https://proxy-go/cdnjs/ajax/libs/vue/3.5.12/vue.global.min.js

就是把https://cdnjs.cloudflare.com改成https://proxy-go/cdnjs就可以了, 类似南方大学的反代.

jsdelivr也类似

mirror 固定路由

比较适合接口类的CORS问题

访问https://proxy-go/mirror/https://example.com/path/to/resource

会实际访问https://example.com/path/to/resource

2024.12.03更新

除了第一条, 后面几个功能都移除了 - 2025.02.15

  1. config.json里支持配置分流文件大小, 使用两种方式获取文件大小, 并进行信息缓存以优化性能, 小文件可以不经过单独路由处理;
  2. 指标管理使用sqlite进行数据持久化
  3. 指标管理页面支持历史数据查看
  4. 指标监控支持飞书webhook机器人通知异常状态
    异常状态的相关配置在internal\constants\constants.go, 可以通过config.json进行覆盖

    在5分钟一次,监控12次. 在15分钟内达到以下要求告警:
    1. 请求数高于10并且错误率达到50%了(因为爬虫有时候抓过期文件, 所以设置的高了一点)
    2. 平均传输速率低于设置的阈值

2025年2月15日更新

  1. 性能优化 (请求头处理,错误恢复机制, 连接复用, 内存管理, 智能超时, 令牌桶算法, 零拷贝数据传输) , 安全优化 (Cookie, 连接标识)
  2. 新增管理页面, 访问"/admin/"即可
  3. 支持在线网页端修改配置, 并支持热重载, 不需要再重启容器
  4. 前端使用next.js+shadcn-ui来实现, 花了不少功夫…

示例图

2025.02.15晚更新


  1. 新增缓存功能, 默认缓存30分钟, 可以在前端修改是否启用和手动清理
  2. 清除多余的功能
  3. 丰富仪表盘

2025.02.16更新

  1. 缓存配置新增更多可配置项

  2. 调整缓存策略

    1. 使用LastAccess时间来判断缓存是否过期,而不是CreatedAt
    2. 每次访问时都会更新LastAccess时间,这样就实现了"访问后重置计时"的功能

    具体来说:

    1. 当一个缓存项被访问时,如果距离上次访问时间(LastAccess)超过了maxAge,则认为该项过期
    2. 每次成功访问缓存项时,都会更新LastAccess为当前时间,相当于重置了过期计时
    3. 清理协程也使用相同的LastAccess时间来判断是否过期,保持了判断标准的一致性

    这样,只要缓存项在maxAge时间内被访问过,它就会继续保持有效。这符合"如果在最大缓存时间内又发生了访问,那么清理时间计时重置"的要求。

新增小更新

添加缓存配置持久化

清理缓存功能调整

  1. 临时文件(temp-*)的残留:

    • 当程序异常退出(如容器重启)时,正在写入的临时文件没有被正确清理
    • CreateTemp 方法中创建临时文件后,如果程序中断,这些文件就没有机会被 Commit 或删除
  2. 缓存文件的残留:

    • 当程序异常退出时,内存中的 items 映射丢失,但文件系统中的缓存文件仍然存在
    • 当前的 ClearCache 方法只清理内存中记录的文件

做了以下改进:

  1. 添加了新的 cleanStaleFiles 方法:

    • 清理所有以 temp- 开头的临时文件
    • 清理不在内存记录中的缓存文件
    • 保留 config.json 配置文件
  2. 修改了 ClearCache 方法:

    • 现在会清理缓存目录中的所有文件(除了配置文件)
    • 先清理内存中的记录,再清理文件系统
  3. NewCacheManager 中:

    • 启动时调用 cleanStaleFiles 清理过期和临时文件
    • 这样在程序重启时就会自动清理之前可能残留的文件

这些改动可以解决:

  1. 程序异常退出导致的临时文件残留
  2. 内存记录和文件系统不同步的问题
  3. 清理缓存不完整的问题

2025.02.17更新

  1. 登录验证, 改为 connect.q58.club 的oauth2.0方式认证, 比纯密码更安全;
  2. 优化config.json的配置, 准备改为纯可视化配置, 并且新建使用时不需要再手动创建;
  3. 仪表盘统计改为1秒刷新一次;

仪表统计盘

配置页

缓存页

2025.02.17晚

  1. 添加"扩展名单独回源地址"的回退功能
  2. 添加"扩展名映射"文件最大限制功能, 比如10M, 避免cloudflare图片优化超时
  3. 优化配置设置页

删除OAUTH_ALLOWED_USERS的配置和限制

这部分功能已经移动到 connect.q58.club 去控制了

2025.03.09

  1. 添加统计数据保存和重载功能, 重启后不会丢失统计数据
  2. 更新统计数据, 现在更全面了

2025.03.20 最近自用的运行情况

不是完整统计, 之前的记录没保留

处理了35万多请求, 15G数据, 缓存功能也正常使用. 并发也不错, 因为逻辑很简单, 越简单越健壮 :rofl:


PS:

上次更新, 添加了"Proxy-Go-Cache"头, 如果命中缓存, 会显示true

有时候一直显示miss也不用担心, 可能是CDN把头部也缓存了, 所以显示的还是第一次CDN回源时的头部, 实际已经进行了缓存.

2025.04.20 百万请求, 纪念一下

109万多请求

大概一周前还进行了性能优化

2025.05.27

新增了 302跳转的方式, 可以更多元化的进行配置.

  1. 支持直接整个路径
  2. 支持按文件类别细分代理和跳转

2025.06.02

  1. 修复302配置容器重启后失效的问题
  2. 修复根源和扩展名映射同时配置302, 导致根源302失效的问题
  3. 部分架构调整, 新增service包, 结构更清晰
  4. 调整检测和配置等逻辑, 第一轮性能提升 30%-80%
  5. 缓存 ExtensionMatcher, 并新增对应的cache逻辑函数, 高访问下性能提升 50%-90%

2025.06.18

新增功能: 支持按域名设置扩展配置.

举例: 同时有a.comb.com接入了本容器, 当路径为同一个/s3时, 可以配置以下情况:

  1. 默认回源s3.com
  2. 用户通过b.com访问时, 回源s3-r2.com或者说302重定向到新域名.

如图:

redirect_uri=https%3A%2F%2F127.0.0.1%3A443%2Fadmin%2Fapi%2Foauth%2Fcallback 请问一下登录的时候这里的回调地址为什么是127.0.0.1呢 是我的nginx配置有问题嘛

具体在哪一步,还有部署流程告知下呢,跟nginx应该没关系

  1. docker compose 部署完成
  2. 然后nginx配置了下端口映射
  3. 然后登陆/admin/login/ 管理员登录 点击使用clz connect 登录,跳转链接为CZL Connect - 互联登录平台
    从url中可以看出来redirect_uri 是127 .0.0.1 但是我在czl中的应用配置的是域名

晚点我看下我的反代配置。这里的url我记得是采用的你当前访问的域名

location ^~ / {
    proxy_pass http://localhost:3336; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.1; 
    add_header X-Cache $upstream_cache_status; 
    proxy_ssl_server_name off; 
    proxy_ssl_name $proxy_host; 
    proxy_buffering off; 
    proxy_cache_key $host$uri$is_args$args$http_accept; 
    add_header Cache-Control no-cache; 
    add_header Access-Control-Allow-Origin *;
}

这个浏览器的回调域名, 是使用的你当前访问的域名.

比如你部署在 a.com, 你得通过https://a.com/admin/去访问登录页面, 回调地址才是 a.com的, 而不是connect提供的回调地址.

可以登录了不

我加强了一下验证逻辑, 因为我发现之前即使授权失败, 也能登录后台 :rofl:

新的docker镜像需要添加OAUTH_CLIENT_SECRET参数.

我刚想给你说了 我授权失败了然后点击拒绝还能进去 但是日志中显示 POST /admin/api/logout → 200 logout success 已经登出了 但是修改config 显示修改成功 刷新页面之后发现并没有生效

我按照你的nginx 配置后redirect uri 变成我当前的页面了但是还是授权失败 我不知道哪里有问题 我proxy服务的域名和登录平台中填写的回调域名一致

修改后需要点击下右上角保存

我晚点加个环境变量,允许覆盖自动获取的,到时候再试试

麻烦重新拉取docker镜像试一下.

新增OAUTH_REDIRECT_URI, 可以覆盖自动获取的.

登录验证也增强了.

参考这个docker compose:


因为我一直自己使用, 还没想过会碰到这些问题 :joy:


左上角加了个提示

非常离谱 我把OAUTH_REDIRECT_URI 填了和登录平台上设置的一摸一样 然后登陆的链接中的REDIRECT_URI=后边部分解码后和OAUTH_REDIRECT_URI也是一摸一样 但就是提示 错误重定向URI不匹配
log中报错2025/03/12 19:35:45 [Auth] ERR GET /admin/api/oauth/callback → 400 (xxx.xxx.xx.xx) invalid state from

你在czlconnect的应用里加一下,允许我登录,我的用户ID是 1,部署的地址私信给我一下

点我头像,私信给我

这个提示问题不是重定向不匹配, 而是state参数校验的问题. 这个参数主要是为了防止伪造请求.

你试着把docker容器的网络改成host, 然后测试下, 看看是不是docker容器和nginx中间传递中, 把这个参数弄丢了

我也不知道为啥, 我的一直都正常, 配置跟你也一样的:

20250312201429_rec_

我仔细检查了代码, 代码里的逻辑对于单服务器部署是没有问题的.