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

使用方法

1panel为例

登录账号设置

需要一个本论坛账号或者github账号

  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. 更新统计数据, 现在更全面了

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服务的域名和登录平台中填写的回调域名一致

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