【问题标题】:Virtual Hosts in GoGo 中的虚拟主机
【发布时间】:2014-01-10 23:18:01
【问题描述】:

有没有一种方法可以处理在单个端口(例如 80)上侦听多个 Go Web 应用程序。我知道 ServeMux 和侦听不同传入主机名的能力,但在这种方法中,它们必须在同一个程序中处理,因此必须在同一个二进制文件中处理。

最好的方法是在一个二进制文件中侦听 :80 上的主机名,然后将请求/响应编写器发送到其他地方的另一个相应二进制文件吗?我会为此使用"os/exec" 吗?你将如何将RequestResponseWriter 参数传递给这个外部二进制文件?提前致谢!

编辑:

不同二进制来源的 goroutine 是否可以访问彼此的通道?这将是一种很酷的方式。

【问题讨论】:

  • 关于您的编辑:通道不能直接用于进程间通信。这在 erlang OTP 中是可能的,但在 Go 中是不可能的。但是有一个RPC package

标签: http go virtualhost


【解决方案1】:

执行此操作的常用方法是使用反向代理,根据请求中的主机名将请求定向到相关的应用服务器(通常在不同的端口或不同的机器上运行)。

一种常见的方法是为此使用 Apache,但如果您想从 Go 中执行此操作,net/http/httputil package 中的 ReverseProxy type 应该会有所帮助。

httputil.NewSingleHostReverseProxy(baseurl) 将为您提供一个 HTTP 处理程序,该处理程序将请求代理到另一个网站并返回结果。因此,您可以通过多路复用 HTTP 处理程序实现前端,该处理程序根据请求的主机名将请求定向到多个 ReverseProxy 处理程序之一。

如果您需要比NewSingleHostReverseProxy 提供的更复杂的路由,您可以在创建代理处理程序时使用自定义Director 函数。

【讨论】:

  • 嘿,谢谢。我已经看到了你其他很棒的围棋答案。您不会碰巧是 Google 员工吧?
  • 同意 James 的观点,反向代理位于 80 端口,然后根据需要映射其他正在运行的应用程序。例如,您可以在端口 80 上安装 Apache 反向代理(请参阅httpd.apache.org/docs/2.2/mod/mod_proxy.html) - 请注意,它也适用于 SSL 的 443,或者使用 Node.JS 之类的东西作为代理:github.com/nodejitsu/node-http-proxy。然后会有规则映射到其他端口上的其他正在运行的应用程序,同时仍然通过实际代理本身在端口 80 上为您的用户提供服务,因此它是透明的。
猜你喜欢
  • 2012-12-19
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2019-06-11
  • 2012-09-27
  • 2020-05-16
  • 2014-02-22
  • 2021-08-20
相关资源
最近更新 更多