最近,我遇到了一个问题,在测试我的开源反向代理服务器Zoraxy时,Golang Offical Httputil反向代理会卡住。
Zoraxy
通用请求(反向)代理和转发工具,用于低功率设备。现在用GO!
写功能
-
易于使用详细信息内系统说明的接口
-
反向代理
-
子域反向代理
-
虚拟目录反向代理
-
-
重定向规则
-
tls / ssl设置和部署< / p>
-
按国家或IP地址(初学者的单个IP,CIDR或通配符)
-
全局区域网络控制器Web UI(不包括Zerotier)
-
集成的正常时间监视器
-
web-ssh终端
-
实用程序
- CIDR IP转换器
- MDNS扫描仪
- IP扫描仪
-
其他
- 基本的单公共管理模式
- 容易系统集成的外部权限管理系统
- 密码重置的SMTP配置
从源
构建需要1.20或以上
Zoraxy为独立模式提供了基本的身份验证系统。要在独立模式下使用它,请按照以下说明进行所需的部署平台。
独立模式
独立模式是def
您是否曾经尝试开设一个处于沉重负担的网站?连接只是在那里冻结,直到加载网站中的其他对象并释放一些连接,然后您的内容继续加载。这不应该发生,因为众所周知,GO可以使用其神奇的Go-Routine同时处理许多请求。这就是为什么我开始质疑Httputil.reverseproxy库的实现。
如果您不知道Golang源代码中有官方的HTTP反向代理,这是我在说的。
https://go.dev/src/net/http/httputil/reverseproxy.go
和源代码中,您会注意到反向代理结构对象中有一条线,该行使用称为http.transport的东西
// The transport used to perform proxy requests.
// If nil, http.DefaultTransport is used.
Transport http.RoundTripper
在调试几天并追踪GO源后,我注意到问题是HTTP.DefaultTransport预先设置的最大连接计数相对较低的限制。此设置是合理的,因为他们大多数时间都使用此反向代理用于服务单用户,而不是将其用作NGINX或APACHE反向代理的替代。
这就是为什么要修复它的原因,我将反向代理的修改版本包括在Zoraxy项目中,并进行了以下修改:
//Hack the default transporter to handle more connections
thisTransporter := http.DefaultTransport
thisTransporter.(*http.Transport).MaxIdleConns = 3000
thisTransporter.(*http.Transport).MaxIdleConnsPerHost = 3000
thisTransporter.(*http.Transport).IdleConnTimeout = 10 * time.Second
thisTransporter.(*http.Transport).MaxConnsPerHost = 0
现在,我的反向代理可以在给定时间与HTTP.DefaultTransport设置相比,可以提供更多的请求。