言成言成啊 | Kit Chen's Blog

HTTP反向代理实现及压测<未完成>

发布于2024-11-13 22:00:36,更新于2024-11-18 21:17:45,标签:java nginx  文章会持续修订,转载请注明来源地址:https://meethigher.top/blog

最近对自己手撕的HTTP反向代理,进行了压测,并与Nginx进行对比,以便于排查其中的隐患问题。

一、HTTP反代注意事项

先记录一下实现HTTP反向代理的注意事项

  1. 请求头、响应头中,都应删除逐跳标头
    • Connection
    • TE
    • Transfer-Encoding
    • Keep-Alive
    • Proxy-Authorization
    • Proxy-Authentication
    • Trailer
    • Upgrade
  2. 通过标头Content-Length或Transfer-Encoding判定是否存在请求体,但这两者不能同时存在
    • Content-Length: 需要预先计算请求体长度,适合小的请求体。
    • Transfer-Encoding: 不需要计算请求体长度,适合大文件等内容的流式传输。
  3. Host标头不应进行转发

这只是我在处理时的一些操作,注意事项其实还有更多,参考自What Proxies Must Do

二、性能比较

2.1 前置环境

在Windows进行TCP相关的压测时,首先需要调整一下动态端口的范围。不然在压测过程中,会出现端口耗尽的情况。

1
2
3
4
5
# 查看动态端口范围
netsh int ipv4 show dynamicport tcp

# 修改动态端口范围。start+num−1≤65535
netsh int ipv4 set dynamicport tcp start=1024 num=64512

版本信息

  • java: 8
  • jmeter: 5.6.3

压测条件及预期

  • 并发:2000
  • 持续:2分钟
  • 预期目标:错误率为0的情况下,吞吐量尽量最大

以下图为例

压测是使用两台物理机进行压测的,由于要经过局域网的路由器,干扰因素较多,网络波动较大。压测结果只能做参考。

应用服务压测2分钟,实际结果如下

LabelSamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. Bytes
HTTP Request2400010037100061027125.870.00%198.562169.7827.31359.9
TOTAL2400010037100061027125.870.00%198.562169.7827.31359.9

2.2 压测结果

2.2.1 Nginx

在Windows上使用Nginx作为负载压测时,遇到了错误windows maximum number of descriptors supported by select() is 1024。排查后是因为nginx.exe在编译时,设置的--with-cc-opt=-DFD_SETSIZE=1024过小导致的,重新编译或者下载别人编译好的即可解决。参考nginx访问报错“maximum number of descriptors supported by select() is 1024 while connecting to upstream”问题的处理 - Zhai_David - 博客园

1
2
# 查看编译参数及版本信息
nginx -V

压测结果

LabelSamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. Bytes
HTTP Request2400010068100101061061.460.00%197.373372.0628.11373.9
TOTAL2400010068100101061061.460.00%197.373372.0628.11373.9

2.2.2 HTTP-Proxy-Servlet

LabelSamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. Bytes
HTTP Request24000101391000711512230.740.00%195.522568.7127.85359.9
TOTAL24000101391000711512230.740.00%195.522568.7127.85359.9

2.2.3 http-proxy-boot

LabelSamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. Bytes
HTTP Request24000103661000613722654.090.00%191.624457.827.3308.9
TOTAL24000103661000613722654.090.00%191.624457.827.3308.9

2.2.4 tcp-reverse-proxy

使用vertx自行实现http反代,尚存在bug。

发布:2024-11-13 22:00:36
修改:2024-11-18 21:17:45
链接:https://meethigher.top/blog/2024/http-proxy-boot/
标签:java nginx 
付款码 打赏 分享
Shift+Ctrl+1 可控制工具栏