如何在Golang旁边使用nginx作为反向代理?

时间:2016-04-27 01:23:22

标签: http ubuntu nginx go proxy

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

我发现了一些关于在Golang上使用fastcgi的文章,但是我没有找到任何关于反向代理和HTTP以及诸如此类的东西,除了this benchmark以外没有详细说明。< / p>

是否有关于其运作方式的教程/指南?

例如,有一个big post on Stackoverflow详细说明了Node,但我找不到类似的东西。

2 个答案:

答案 0 :(得分:2)

除非您使用nginx进行缓存,否则根本不再需要它,Golang 1.6+非常适合直接服务http和https。

但是,如果你坚持,我会暗中评判你,嘲笑你,这就是工作流程:

  1. 你的应用程序在本地端口上侦听,说&#34; 127.0.0.1:8080&#34;
  2. nginx侦听0.0.0.0:80和0.0.0.0:443并将所有请求代理到127.0.0.1:8080。
  3. 受到评判。
  4. Node.js + Nginx - What now?中的nginx设置与Go或其他任何独立服务器使用的设置完全相同,不是cg / fastcgi。

答案 1 :(得分:0)

我在生产中非常有效地使用Nginx,使用Unix套接字而不是TCP来进行FastCGI连接。此代码段来自Manners,但您可以很容易地将其调整为正常的Go api。

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)
    }
}

浏览一下line 252,这是通过TCP连接的HTTP与通过Unix域套接字的FastCGI之间发生切换的地方。

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

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