使用方法
1panel为例
登录账号设置
需要一个本论坛账号或github账号/QQ/Google
-
登录你的论坛账号/github,
-
新建一个应用
这里假设
https://proxy-go
是你的要绑定的域名, 回源地址就是https://proxy-go/admin/api/oauth/callback
.
记得不勾选公开, 类型是Oauth2 -
创建成功会获取到一个
Client ID
和Client Secret
, 保存好, 稍后要用.
创建容器并运行
-
新建一个
编排
, 使用这个docker-compose, 里面的OAUTH_CLIENT_ID
和OAUTH_CLIENT_SECRET
就是上面获取的.最新镜像地址: woodchen/proxy-go:latest 稳定版镜像地址: woodchen/proxy-go:v1.0.4 持续稳定版镜像地址: woodchen/proxy-go:stable
图里的"OAUTH_ALLOWED_USERS"不用管, 已经删除了.
- 运行, 然后新建一个网站, 绑定
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的域名 + 选择映射的路径 + 原图的路径和文件名
这时候有两个情况:
- 文件在200kb到10M之间, 这时候反代的是这个网址:
https://cfimg.czl.net/cdn-cgi/image/format=auto,metadata=none,onerror=redirect/https://b2.20200511.xyz/2025/03/67cff2273a20c.png
- 文件小于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示例作示范
- 访问
https://proxy-go/path1/123.jpg
, 实际是访问https://path1.com/path/path/path/123.jpg
- 访问
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
- config.json里支持配置分流文件大小, 使用两种方式获取文件大小, 并进行信息缓存以优化性能, 小文件可以不经过单独路由处理;
- 指标管理使用sqlite进行数据持久化
- 指标管理页面支持历史数据查看
- 指标监控支持飞书webhook机器人通知异常状态
异常状态的相关配置在internal\constants\constants.go
, 可以通过config.json进行覆盖
在5分钟一次,监控12次. 在15分钟内达到以下要求告警:- 请求数高于10并且错误率达到50%了(因为爬虫有时候抓过期文件, 所以设置的高了一点)
- 平均传输速率低于设置的阈值
2025年2月15日更新
- 性能优化 (请求头处理,错误恢复机制, 连接复用, 内存管理, 智能超时, 令牌桶算法, 零拷贝数据传输) , 安全优化 (Cookie, 连接标识)
- 新增管理页面, 访问"/admin/"即可
- 支持在线网页端修改配置, 并支持热重载, 不需要再重启容器
- 前端使用next.js+shadcn-ui来实现, 花了不少功夫…
示例图
2025.02.15晚更新
- 新增缓存功能, 默认缓存30分钟, 可以在前端修改是否启用和手动清理
- 清除多余的功能
- 丰富仪表盘
2025.02.16更新
-
缓存配置新增更多可配置项
-
调整缓存策略
- 使用
LastAccess
时间来判断缓存是否过期,而不是CreatedAt
- 每次访问时都会更新
LastAccess
时间,这样就实现了"访问后重置计时"的功能
具体来说:
- 当一个缓存项被访问时,如果距离上次访问时间(
LastAccess
)超过了maxAge
,则认为该项过期 - 每次成功访问缓存项时,都会更新
LastAccess
为当前时间,相当于重置了过期计时 - 清理协程也使用相同的
LastAccess
时间来判断是否过期,保持了判断标准的一致性
这样,只要缓存项在
maxAge
时间内被访问过,它就会继续保持有效。这符合"如果在最大缓存时间内又发生了访问,那么清理时间计时重置"的要求。 - 使用
新增小更新
添加缓存配置持久化
清理缓存功能调整
临时文件(
temp-*
)的残留:
- 当程序异常退出(如容器重启)时,正在写入的临时文件没有被正确清理
- 在
CreateTemp
方法中创建临时文件后,如果程序中断,这些文件就没有机会被Commit
或删除缓存文件的残留:
- 当程序异常退出时,内存中的
items
映射丢失,但文件系统中的缓存文件仍然存在- 当前的
ClearCache
方法只清理内存中记录的文件做了以下改进:
添加了新的
cleanStaleFiles
方法:
- 清理所有以
temp-
开头的临时文件- 清理不在内存记录中的缓存文件
- 保留
config.json
配置文件修改了
ClearCache
方法:
- 现在会清理缓存目录中的所有文件(除了配置文件)
- 先清理内存中的记录,再清理文件系统
在
NewCacheManager
中:
- 启动时调用
cleanStaleFiles
清理过期和临时文件- 这样在程序重启时就会自动清理之前可能残留的文件
这些改动可以解决:
- 程序异常退出导致的临时文件残留
- 内存记录和文件系统不同步的问题
- 清理缓存不完整的问题
2025.02.17更新
- 登录验证, 改为 connect.q58.club 的oauth2.0方式认证, 比纯密码更安全;
- 优化config.json的配置, 准备改为纯可视化配置, 并且新建使用时不需要再手动创建;
- 仪表盘统计改为1秒刷新一次;
仪表统计盘
配置页
缓存页
2025.02.17晚
- 添加"扩展名单独回源地址"的回退功能
- 添加"扩展名映射"文件最大限制功能, 比如10M, 避免cloudflare图片优化超时
- 优化配置设置页
删除OAUTH_ALLOWED_USERS的配置和限制
这部分功能已经移动到 connect.q58.club 去控制了
2025.03.09
- 添加统计数据保存和重载功能, 重启后不会丢失统计数据
- 更新统计数据, 现在更全面了
2025.03.20 最近自用的运行情况
不是完整统计, 之前的记录没保留
处理了35万多请求, 15G数据, 缓存功能也正常使用. 并发也不错, 因为逻辑很简单, 越简单越健壮
PS:
上次更新, 添加了"Proxy-Go-Cache"头, 如果命中缓存, 会显示true
有时候一直显示miss也不用担心, 可能是CDN把头部也缓存了, 所以显示的还是第一次CDN回源时的头部, 实际已经进行了缓存.
2025.04.20 百万请求, 纪念一下
109万多请求
大概一周前还进行了性能优化
2025.05.27
新增了 302跳转的方式, 可以更多元化的进行配置.
- 支持直接整个路径
- 支持按文件类别细分代理和跳转
2025.06.02
- 修复302配置容器重启后失效的问题
- 修复根源和扩展名映射同时配置302, 导致根源302失效的问题
- 部分架构调整, 新增service包, 结构更清晰
- 调整检测和配置等逻辑, 第一轮性能提升 30%-80%
- 缓存
ExtensionMatcher
, 并新增对应的cache逻辑函数, 高访问下性能提升 50%-90%
2025.06.18
新增功能: 支持按域名设置扩展配置.
举例: 同时有a.com
和b.com
接入了本容器, 当路径为同一个/s3
时, 可以配置以下情况:
- 默认回源
s3.com
- 用户通过
b.com
访问时, 回源s3-r2.com
或者说302重定向到新域名.
如图: