我们很高兴地宣布 GHProxy v2.1.0 正式发布!这个版本带来了性能侧与用户侧的优化,主要更新如下:

CHANGLOG (更新日志)

  • CHANGE: 加入FreeBSDDarwin系统支持
  • CHANGE: 更新安全政策, v1和24w版本序列生命周期正式结束
  • ADD: 加入timing中间件记录响应时间
  • ADD: 加入loggin中间件包装日志输出
  • CHANGE: 更新logger版本至v1.3.0
  • CHANGE: 改进日志相关
  • ADD: 加入日志等级配置项
  • CHANGE: 更新Go版本至1.23.6
  • CHANGE: 更新Logger版本至v1.2.0
  • CHANGE: 优化前端的连接转换逻辑
  • CHANGE: 优化代码内不必要的函数化, 1.4之后, 函数化疑似有点太多了
  • 优化HTTP Client参数
  • CHANGE: 为api路由组增加no-cache标头
  • CHANGE: 优化响应体分块复制实现
  • ADD: 加入缓存池
  • CHANGE: 改进缓存实现
  • CHANGE: 部分杂项改进
  • CHANGE: 优化GitReq的HTTP Client参数, 使其更符合本项目使用场景
  • CHANGE: 优化Matches
  • REMOVE: 移除Caddyfile残留
  • REMOVE: 由于v2改进后稳定性增强, 故移除健康检测
  • CHANGE: 优化HTTP Client参数, 使其更符合本项目使用场景
  • CHANGE: 为HTTP Client增加复用, 对性能有所优化
  • CHANGE: 由于用户使用了不符合RFC 9113规范的请求头, 导致ghproxy无法正常工作, 在此版本为用户的错误行为提供补丁;
  • FIX: 修复Docker启动脚本存在的一些问题

项目地址

Demo

TG讨论群组

前端界面: ghproxy-demo.png ghproxy-demo-dark.png

主要更新

性能优化

我们在v2.1.0版本中对项目的性能进行了优化,主要优化点如下:

  • 优化HTTP Client参数, 使其更符合本项目使用场景
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
func initChunkedHTTPClient() {
	ctr = &http.Transport{
		MaxIdleConns:          100,
		MaxConnsPerHost:       60,
		IdleConnTimeout:       20 * time.Second,
		TLSHandshakeTimeout:   10 * time.Second,
		ExpectContinueTimeout: 1 * time.Second,
		ResponseHeaderTimeout: 10 * time.Second,
		DialContext: (&net.Dialer{
			Timeout:   30 * time.Second,
			KeepAlive: 30 * time.Second,
		}).DialContext,
	}
	cclient = &http.Client{
		Transport: ctr,
	}
}
  • 使用io.CopyBuffer而非io.Copy进行响应体分块复制, 同时使用缓存池对缓存进行复用, 减少内存占用
1
2
3
4
5
6
  	// 初始化缓存池
	BufferPool = &sync.Pool{
		New: func() interface{} {
			return make([]byte, BufferSize)
		},
	}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
	// 从缓存池内取出缓存块
	buffer := BufferPool.Get().([]byte)
	defer BufferPool.Put(buffer)

	_, err = io.CopyBuffer(c.Writer, resp.Body, buffer)
	if err != nil {
		logError("%s %s %s %s %s Failed to copy response body: %v", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Proto, err)
		return
	} else {
		c.Writer.Flush() // 确保刷入
	}

前端优化

对链接转换进行了一些优化

配置变动

在v2.1.0版本中, 加入了日志等级配置项, 可根据需求调整日志输出等级。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[server]
host = "0.0.0.0"  # 监听地址
port = 8080  # 监听端口
sizeLimit = 125 # 125MB
bufferSize = 4096 # Bytes 缓冲区大小
enableH2C = "on"  # 是否开启H2C传输(latest和dev版本请开启) on/off

[pages]
enabled = false  # 是否开启内置静态页面(Docker版本请关闭此项)
staticPath = "/data/www"  # 静态页面文件路径

[log]
logFilePath = "/data/ghproxy/log/ghproxy.log" # 日志文件路径
maxLogSize = 5 # MB 日志文件最大大小
level = "info" # dump, debug, info, warn, error, none 日志等级

[cors]
enabled = true  # 是否开启跨域

[auth]
authMethod = "parameters" # 鉴权方式,支持parameters,header
authToken = "token"  # 用户鉴权Token
enabled = false  # 是否开启用户鉴权

[blacklist]
blacklistFile = "/data/ghproxy/config/blacklist.json"  # 黑名单文件路径
enabled = false  # 是否开启黑名单

[whitelist]
enabled = false  # 是否开启白名单
whitelistFile = "/data/ghproxy/config/whitelist.json"  # 白名单文件路径

[rateLimit]
enabled = false  # 是否开启速率限制
rateMrthod = "total" # "ip" or "total" 速率限制方式
ratePerMinute = 180  # 每分钟限制请求数量
burst = 5  # 突发请求数量

后续版本更新相关

25w13a

  • PRE-RELEASE: 此版本是v2.2.0的预发布版本,请勿在生产环境中使用;
  • ADD: 加入Socks5HTTP(S)出站支持
  • CHANGE: 配置新增Outbound配置块

感谢lfhy的PR: https://github.com/WJQSERVER-STUDIO/ghproxy/pull/46

结语

GHProxy v2.1.0 是一个新的阶段, 性能优化的同时也引入了新的功能特性; 这个版本将v2带向了稳定, v2仍在持续迭代中, 我们会不断优化, 让它更加完善。

我们感谢所有用户的支持与反馈,并期待 GhProxy v2.1.0 能为您的开发工作带来更大的便利和效率!若此项目对您有所帮助,请不要忘记 star 本项目,您的支持是我们前进的动力!