Go1.12, 轻松实现 HTTPS & WSS 动态反向代理

本文介绍了如何利用Go1.12中的httputil库,特别是ReverseProxy功能,实现HTTPS和WSS的动态反向代理。首先,通过nginx进行POC验证了需求的技术可行性,然后详细讨论了使用Go语言代替nginx实现动态转发的原因,并给出了路由设置和核心代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

2019年上半年google推出的golang1.12为我们带来了很多新特性,具体请见官方 Go 1.12 Release Notes

其中有一项:

net/http/httputil
The ReverseProxy now automatically proxies WebSocket requests.

从该版本开始,httputil库中的 ReverseProxy能够自动转发 websocket请求,参见 reverseproxy.go源码
从此,无论 http(s) 或者 ws(s) 都能够通过 httputil 官方库实现,而在这之前,我们需要自己实现,或者借用一些第三方库实现,例如:https://github.com/gorilla/websockethttps://github.com/yhat/wsutil。

本文将从产品实际需求出发,对该功能予以介绍。

需求提出

公司研发的产品是一个集群产品,在集群的管理节点(头节点)中部署有我们开发的WEB服务,集群中的其它节点中部署有类VNC的远程桌面服务,用户想访问这些节点中的类VNC服务时都要通过管理节点访问。此服务使用的协议是 https 和 websocket+ssl 即 wss。
管理节点中的转发服务需要支持如下功能:

  1. 因为后端是多个节点,所以管理节点要能够根据参数动态转发请求到指定的后端节点
  2. 要同时运行 https 转发和 wss转发
  3. 要支持把该远程桌面服务以iframe的方式嵌入到管理节点的WEB页面中

简单的示意图

用户 192.168.1.100:7443
微信小程序对wss协议端口号有严格要求,通常情况下只能使用443端口。这可能会与已有的HTTPS服务产生冲突,因为HTTPS服务也是默认使用443端口。幸运的是,通过nginx反向代理功能,可以有效地解决这个问题。具体操作步骤如下: 参考资源链接:[nginx配置反向代理webSocket解决方案](https://wenku.csdn.net/doc/6401acd8cce7214c316ed5b4) 首先,了解webSocket与HTTP协议之间的关系是关键。webSocket协议是在HTTP协议基础上升级得来的,因此nginx需要能够识别和处理HTTP请求中的协议升级过程。这通常涉及到一些特定的HTTP头部字段,如`Upgrade`和`Connection`,它们指示了客户端希望将连接从HTTP协议升级到webSocket协议。 接下来,配置nginx反向代理以支持webSocket协议。在nginx的配置文件`nginx.conf`中,需要添加stream模块的配置来处理TCP流,并在其中设置upstream模块定义后端webSocket服务器组,以及一个server块来监听443端口并处理SSL连接,然后将连接转发到定义的webSocket服务器组。具体配置示例如下: ```nginx stream { upstream websocket_servers { ***:8080; ***:8080; } server { listen 443 ssl; # ...其他SSL配置... proxy_pass websocket_servers; proxy_protocol on; } } ``` 在这段配置中,`stream`模块用于处理TCP流,`upstream`定义了webSocket服务器组。`server`块监听443端口并启用SSL协议,`proxy_pass`指令将请求转发到`websocket_servers`。`proxy_protocol on;`指令是为了在使用负载均衡时保持客户端的真实IP地址不变。 完成配置后,必须重新加载或重启nginx服务,以使新配置生效。这样,所有到达443端口的webSocket请求都会被nginx代理到后端的webSocket服务器上,实现了在同一个端口上同时支持HTTPS和webSocket服务。 通过以上步骤,可以解决微信小程序对wss协议端口号的限制问题,并有效地利用现有资源,避免了额外的服务器投入。如果在实际操作中遇到问题,可以参考《nginx配置反向代理webSocket解决方案》一文,其中详细介绍了配置细节和可能出现的问题解决方案。 参考资源链接:[nginx配置反向代理webSocket解决方案](https://wenku.csdn.net/doc/6401acd8cce7214c316ed5b4)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值