Http 如何将nginx与Golang一起用作反向代理?
我想使用Golang作为我的服务器端语言,但我读到的所有内容都指向nginx作为web服务器,而不是依赖于Http 如何将nginx与Golang一起用作反向代理?,http,ubuntu,nginx,go,proxy,Http,Ubuntu,Nginx,Go,Proxy,我想使用Golang作为我的服务器端语言,但我读到的所有内容都指向nginx作为web服务器,而不是依赖于net/http(并不是说它不好,但总体来说它似乎更可取,但不是本文的重点) 我已经找到了一些关于在Golang中使用fastcgi的文章,但是我没有找到任何关于反向代理和HTTP之类的内容,不幸的是,除了这些内容没有足够的详细信息 有关于如何操作的教程/指南吗 例如,有一个节点对其进行了详细说明,但我找不到类似的go。除非您使用nginx进行缓存,否则根本不需要它。Golang 1.6+足
net/http
(并不是说它不好,但总体来说它似乎更可取,但不是本文的重点)
我已经找到了一些关于在Golang中使用fastcgi的文章,但是我没有找到任何关于反向代理和HTTP之类的内容,不幸的是,除了这些内容没有足够的详细信息
有关于如何操作的教程/指南吗
例如,有一个节点对其进行了详细说明,但我找不到类似的go。除非您使用nginx进行缓存,否则根本不需要它。Golang 1.6+足以直接为http和https提供服务器 但是,如果你坚持,我会偷偷地评判你,嘲笑你,工作流程如下:
中的nginx设置与您用于Go或任何其他独立服务器(不是cgi/fastcgi)的设置完全相同。我在生产中非常有效地使用nginx,在fastcgi连接中使用Unix套接字而不是TCP。此代码段来自,但您可以很容易地将其改编为普通的GoAPI
func isUnixNetwork(addr string) bool {
return strings.HasPrefix(addr, "/") || strings.HasPrefix(addr, ".")
}
func listenToUnix(bind string) (listener net.Listener, err error) {
_, err = os.Stat(bind)
if err == nil {
// socket exists and is "already in use";
// presume this is from earlier run and therefore delete it
err = os.Remove(bind)
if err != nil {
return
}
} else if !os.IsNotExist(err) {
return
}
listener, err = net.Listen("unix", bind)
return
}
func listen(bind string) (listener net.Listener, err error) {
if isUnixNetwork(bind) {
logger.Printf("Listening on unix socket %s\n", bind)
return listenToUnix(bind)
} else if strings.Contains(bind, ":") {
logger.Printf("Listening on tcp socket %s\n", bind)
return net.Listen("tcp", bind)
} else {
return nil, fmt.Errorf("error while parsing bind arg %v", bind)
}
}
请看一下,在TCP连接上的HTTP和Unix域套接字上的FastCGI之间发生切换的地方
对于Unix套接字,您必须调整启动脚本,以确保以有序的方式创建具有正确所有权和权限的套接字。如果你做对了,剩下的就容易了
为了回答关于为什么要使用Nginx的其他评论,它始终取决于您的用例。我有Nginx托管的静态/PHP网站;在这种情况下,在同一台服务器上使用它作为反向代理是很方便的。nginx作为代理,golang作为编程语言来制作真正的业务服务器,这是正确的。你的问题是什么?看。即使有负载平衡之类的东西?Go会处理吗?@mickdoe没有,但是有一些软件包,不过这是使用nginx的正当理由,我不会因此对你进行评判你运行一个nginx实例只是为了服务一个go应用程序,很多人都这么做。嗯,你很快改变了我的想法。:)所以理论上我可以使用
net/http
一段时间吗?是的,我通常在大多数情况下使用它。有时它会被其他东西所取代,但只有当你需要负载平衡,或者在Heroku或其他地方托管时,他们才会用他们的基础设施来取代你的Web服务器。而且TLS现在在amd64系统上已经进行了相当多的优化,特别是如果CPU有aes ni指令,那么你就不必担心https的运行速度太慢(这是go旧版本的一个合法问题)。