您的位置:首页 >聚焦 >

【世界时快讯】Go语言正/反向代理的姿势

2022-11-09 16:19:51    来源:程序员客栈

先重温一下什么叫反向代理,正向代理。

鹅厂二面,nginx回忆录[1]


(资料图)

所谓正向,反向代理取决于代理的是出站请求,还是入站请求。

正向代理:代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近。反向代理:代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务端更近。


前几天利用golang实现反向代理程序[2],引出了Host请求头在反代中的关键作用。

代理程序预置upstream, 将节点对proxy.com的请求,转发给upstream service。

packagemainimport("fmt""log""net/http""net/http/httputil")// 将对proxy.com/xxx/yyy的请求转发到 www.baidu.com/xxx/yyyfuncReverseProxyHandler(whttp.ResponseWriter,r*http.Request){fmt.Println("receivearequestfrom:",r.RemoteAddr,r.Header)target:="www.baidu.com"director:=func(req*http.Request){req.URL.Scheme="https"req.URL.Host=targetreq.Host=target}proxy:=&httputil.ReverseProxy{Director:director}proxy.ServeHTTP(w,r)}funcmain(){fmt.Printf("Startingserveratport8080\n")iferr:=http.ListenAndServe(":8080",http.HandlerFunc(ReverseProxyHandler));err!=nil{log.Fatal(err)}}

以上访问localhost:8080, 在浏览器会显示www.baidu.com的内容。

--------------------------------------------------------

这几天刚好遇到了一个正向代理的case, 简单记录一下。

name.com集群通过prxoy.com 代理程序请求外部节点。

packagemainimport("fmt""log""net/http""net/http/httputil")// 集群请求外部节点,通过代理funcProxyHandler(whttp.ResponseWriter,r*http.Request){fmt.Printf("receivearequestfrom{0}{1}:\n",r.RemoteAddr,r.Header)ifr.Host!="localhost:8080"{director:=func(req*http.Request){req.URL.Scheme="http"req.URL.Host=r.Hostreq.Host=r.Host}proxy:=&httputil.ReverseProxy{Director:director}proxy.ServeHTTP(w,r)}else{http.NotFound(w,r)}}funcmain(){iferr:=http.ListenAndServe(":8080",http.HandlerFunc(ProxyHandler));err!=nil{log.Fatal(err)}}

其中要注意的就是,正向代理式要规避死循环代理。

使用该服务作为代理程序,将可以出站访问任何地址( curl -x 指令后面代理地址)。

使用时,针对httpclient 设置proxy。

//addingtheproxysettingstotheTransportobjecttransport:=&http.Transport{Proxy:http.ProxyURL(proxyURL),}//addingtheTransportobjecttothehttpClientclient:=&http.Client{Transport:transport,}

下面使用curl指令快速验证: curl -x 127.0.0.1:8080 www.baidu.com

引用链接

[1]鹅厂二面,nginx回忆录:https://www.cnblogs.com/JulianHuang/p/14504892.html[2]golang实现反向代理程序:https://www.cnblogs.com/JulianHuang/p/16639016.html

本文文字和制图均为原创,鄙人会不时更正认知、修正理解,鉴于公众号编辑次数受限,请不时关注左下角永久更新地址, 也欢迎斧正;如果对您有所帮助,一键三连,甚是欣慰。

关键词: 反向代理 外部节点 注意的就是

相关阅读