Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 如何将nginx与Golang一起用作反向代理?_Http_Ubuntu_Nginx_Go_Proxy - Fatal编程技术网

Http 如何将nginx与Golang一起用作反向代理?

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+足

我想使用Golang作为我的服务器端语言,但我读到的所有内容都指向nginx作为web服务器,而不是依赖于
net/http
(并不是说它不好,但总体来说它似乎更可取,但不是本文的重点)

我已经找到了一些关于在Golang中使用fastcgi的文章,但是我没有找到任何关于反向代理和HTTP之类的内容,不幸的是,除了这些内容没有足够的详细信息

有关于如何操作的教程/指南吗


例如,有一个节点对其进行了详细说明,但我找不到类似的go。

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

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

  • 您的go应用程序在本地端口上侦听,例如“127.0.0.1:8080”
  • nginx侦听0.0.0.0:80和0.0.0.0:443,并将所有请求代理到127.0.0.1:8080
  • 被评判

  • 中的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旧版本的一个合法问题)。