【问题标题】:How do I use nginx as a reverse proxy alongside Golang?我如何使用 nginx 作为 Golang 旁边的反向代理?
【发布时间】:2016-05-14 02:01:20
【问题描述】:

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

我找到了几篇关于在 Golang 中使用 fastcgi 的文章,但我没有找到任何关于反向代理和 HTTP 之类的东西,除了 this benchmark,不幸的是,它没有详细说明。

是否有任何关于如何操作的教程/指南?

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

【问题讨论】:

  • nginx做代理,golang做编程语言做真正的业务服务器,没问题。你有什么问题?

标签: http ubuntu nginx go proxy


【解决方案1】:

除非您使用 nginx 进行缓存,否则根本不需要这样做,Golang 1.6+ 足以直接服务器 http 和 https。

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

  1. 您的 Go 应用在本地端口上侦听,例如“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 - What now? 中的 nginx 设置与您用于 Go 或任何其他非 cgi/fastcgi 的独立服务器的设置完全相同。

【讨论】:

  • 即使有负载平衡之类的东西? Go 会处理吗?
  • @mickdoe 不,但是有一些软件包可以解决这个问题,但是这是使用 nginx 的正当理由,我不会因此而评判你。 ;) 你会因为运行单个 nginx 实例而被判定为只为单个 go 应用程序提供服务,很多人都这样做。
  • 嗯,你很快就改变了我的想法。 :) 所以理论上我可以使用net/http 一段时间吗?
  • 是的,我通常将它用于大多数事情。有时它前面有其他东西,但前提是您需要负载平衡或托管在 Heroku 或某个他们总是在您的网络服务器前面使用其基础架构的地方。
  • 而且 TLS 现在在 amd64 系统上得到了相当的优化,特别是如果 CPU 有 aes-ni 指令,所以你不必担心 https 在纯运行时很慢(这是一个合法的问题旧版本的 go)。
【解决方案2】:

我在生产中非常有效地使用 Nginx,使用 Unix 套接字而不是 TCP 进行 FastCGI 连接。这段代码 sn-p 来自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 网站;在这种情况下,将其用作同一服务器上的反向代理很方便。

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2018-05-10
    相关资源
    最近更新 更多