我如何使用nginx作为Golang的反向代理?

我想使用Golang作为我的服务器端语言,但是我读过的所有内容都指向了nginx作为web服务器,而不是依赖于net/http (不是说它很糟糕,但总体上看起来更好,不是这篇文章的重点虽然)。

我已经find了一些关于使用Golang的fastcgi的文章,但是我没有find任何有关反向代理和HTTP的东西,除了这个基准testing ,不幸的是, 这个基准testing还不够详细。

有没有任何教程/指南可用于如何运作?

例如, 在Stackoverflow上有一个很大的post,详细介绍了Node,但是我找不到类似的。

除非你使用nginx进行缓存,否则这根本就不需要了,Golang 1.6+可以直接服务于http和https。

但是如果你坚持,我会偷偷判断你,嘲笑你,下面是工作流程:

  1. 你的应用程序在本地端口上侦听,比如说“127.0.0.1:8080”
  2. nginx监听0.0.0.0:80和0.0.0.0:443,并将所有请求代理到127.0.0.1:8080。
  3. 被判断。

Node.js + Nginx中的nginx设置- 现在是什么? 是完全相同的设置,你会用于去,或任何其他独立的服务器,这不是CGI / fastcgi。

我非常有效地在生产环境中使用Nginx,使用Unix套接字代替TCP进行FastCGI连接。 这个代码片段来自礼仪 ,但你可以很容易地适应正常的Go api。

 func isUnixNetwork(addr string) bool { return strings.HasPrefix(addr, "/") || strings.HasPrefix(addr, ".") } func listenToUnix(bind string) (listener net.listner, 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.listn("unix", bind) return } func listen(bind string) (listener net.listner, err error) { if isUnixNetwork(bind) { logger.Printf("listning on unix socket %s\n", bind) return listenToUnix(bind) } else if strings.Contains(bind, ":") { logger.Printf("listning on tcp socket %s\n", bind) return net.listn("tcp", bind) } else { return nil, fmt.Errorf("error while parsing bind arg %v", bind) } } 

看看第252行 ,这是在TCP连接上的HTTP和通过Unix域套接字的FastCGI之间进行交换的地方。

使用Unix套接字时,必须调整启动脚本,以确保使用正确的所有权和权限有序地创建套接字。 如果你做对了,其余的很容易。


要回答关于为什么要使用Nginx的其他评论,它总是取决于您的使用情况。 我有Nginx托管的静态/ PHP网站; 在这种情况下在同一台服务器上使用它作为反向代理是很方便的。