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

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

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

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


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

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

package mainimport ("fmt""log""net/http""net/http/httputil"
)
// 将对proxy.com/xxx/yyy的请求转发到 www.baidu.com/xxx/yyy
func ReverseProxyHandler(w http.ResponseWriter, r *http.Request) {fmt.Println("receive a request from:", 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)
}func main() {fmt.Printf("Starting server at port 8080\n")if err := http.ListenAndServe(":8080", http.HandlerFunc(ReverseProxyHandler)); err != nil {log.Fatal(err)}
}

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

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

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

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

package mainimport ("fmt""log""net/http""net/http/httputil"
)
// 集群请求外部节点,通过代理
func ProxyHandler(w http.ResponseWriter, r *http.Request) {fmt.Printf("receive a request from {0}  {1}: \n", r.RemoteAddr, r.Header)if r.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)}
}func main() {if err := http.ListenAndServe(":8080", http.HandlerFunc(ProxyHandler)); err != nil {log.Fatal(err)}
}

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

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

使用时,针对httpclient 设置proxy。

//adding the proxy settings to the Transport objecttransport := &http.Transport{Proxy: http.ProxyURL(proxyURL),}//adding the Transport object to the http Clientclient := &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

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

Go语言正/反向代理的姿势相关推荐

  1. 中介/代理,正/反向代理,直/间接代理,概念清晰解释

    以下内容为个人感悟, 欢迎大家交流指正 代理 & 中介 代理 代理就是经授权方授权后,代表授权方处理一些事务 注意这个地方有两层意思, 一个是经授权方授权, 二是代表授权方. 中介 中介是介于 ...

  2. Nginx反向代理详解

    一.简介 1.反向代理产生的背景   在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极 限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个 服务器来共同分担成千 ...

  3. 面试精讲之面试考点及大厂真题 - 分布式专栏 07 说一说什么是正向代理,反向代理

    07 说一说什么是正向代理,反向代理 世界上最快乐的事,莫过于为理想而奋斗. --苏格拉底 引言 05小节面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识和服务间通讯框架(RPC) 确 ...

  4. Nginx 反向代理、负载均衡、虚拟主机

    文章目录 一.反向代理 1.代理原理 2.正/反向代理的区别 (1)正向代理 (2)反向代理 3.配置Nginx-Proxy (1)代理模块 (2)代理配置 (3) proxy 代理实例 二.负载均衡 ...

  5. CentOS7.2 安装Squid3.5及正、反向代理设置

    Squid是比较知名的代理软件,它不仅可以跑在linux上还可以跑在windows以及Unix上,它的技术已经非常成熟.目前使用Squid的用户也是十分广泛的.Squid与Linux下其它的代理软件如 ...

  6. Nginx正、反向代理以及负载均衡介绍

    正向代理 正向代理,"它代理的是客户端",是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始 ...

  7. Go语言中的单元测试及反向代理

    一般为了保证整个系统的稳定性,通常都需要编写大量的单元测试,诸如像java的junit,php的phpunit等都提供了类似的功能.golang中的testing包提供了这个测试的功能,结合go te ...

  8. nginx 反向代理配置二级域名正确姿势!!!

    1. 先解释下什么是反向代理? 反向代理是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代 ...

  9. 负载均衡 反向代理为何叫反向代理?

    转  https://www.zhihu.com/question/24723688 与正向代理比起来,反向代理是什么东西反向了? 关注者 1217 被浏览 184352 41 个回答 刘志军 公众号 ...

最新文章

  1. 解决XP系统下HTTP 错误 403.9 - 禁止访问:连接的用户过多的问题
  2. matlab蚁群算法 降维,基于蚁群算法的路由问题研究
  3. Shell基础知识(三)
  4. NOIP2018划水记
  5. 【2018开年知识盛会】15位大咖直播分享,全方位解析NoSQL数据库
  6. 网页无法调用java9_JAVA 9 (内部类,异常,包)
  7. MFC开发IM-第二十四篇、使用 acl 库针对 C++ 对象进行序列化及反序列编程
  8. sublime html乱码,HTML5 sublime 编码出现乱码怎么处理
  9. xxx is not in the sudoers file 解决方案(转)
  10. zmodem transfer canceled by remote side 段错误(吐核)
  11. 简单6步,手把手搭建MinDoc文档库
  12. GAN介绍 - 提示与技巧
  13. JS 控制LPT1 直接打印!
  14. PHP对接美团配送接口遇到的问题
  15. ZYNQ裸板:DDR篇
  16. 【下载Tomcat旧版本】
  17. Python解释器的选择,初学者必看
  18. EOS智能合约开发系列(12): 多签合约代码分析(一)
  19. jzoj1273 袁绍的刁难(math)
  20. laravel-excel使用2(老猫包子店的故事)

热门文章

  1. 2012世界末日其实是个大骗局【转】
  2. 复制+粘贴->集群就绪 | 微软视角hpc4you_toolkit使用演示
  3. Android 动态设置backGroundColor不生效的原因
  4. android电话本导入iphone,怎么把安卓手机通讯录导入iphone?安卓手机通讯录导入苹果手机三大方法分享...
  5. Linux echo 与 vi 的使用
  6. Dell 5379 5579 Windows hello 0jcxg驱动
  7. XDown ,一款超强Mac下载神器支持某盘下载
  8. [C语言] 通讯录|静态 动态 文件 链表 多版本讲解
  9. 【安全算法之base64】base64加解密的C语言源码实现
  10. 小玩意:猜数字小游戏(Java GUI)