去Webapp& Nginx:关于倾听的困惑,fastcgi&反向代理

时间:2014-07-26 03:15:37

标签: web-applications nginx go

所以我正在尝试在Go上创建一个webapp,它只接受来自一个域的所有请求,具有唯一的IP,并且所有其他域和IP由Nginx处理(并与PHP一起提供)。

我对这是如何完成感到困惑,看起来很多人都是通过配置Nginx将请求从某个域传递给FastCGI来实现这一点,然后从Go webapp收听。像这样:

Nginx.conf

server_name www.mydomain.com;
listen 123.123.123.123;
include         fastcgi.conf;
fastcgi_pass    127.0.0.1:9001;

开始

func main() {
 listener, _ := net.Listen("tcp", "127.0.0.1:9001")
 srv := new(MyServerObject)
 fcgi.Serve(listener, srv)
}

我不明白的是:在这里我们让Nginx监听特定IP上的特定域,然后将其传递给fastcgi,然后将其传递给Go。

为什么这样?我可以不只是让Nginx 监听这个域名,然后Go只监听这个域名吗?然后,在没有反向代理的情况下,可以更有效地实现相同的目标。

由于我可以为Go正在收听的域使用专用IP,因此(在我看来)会有冲突。 Nginx根本不会听123.123.123.123:80而Go会听123.123.123.123:80 ...因此不需要反向代理和fastcgi。

我对此的看法是正确的,还是我错过了什么?

如果它是正确的,我是否必须从Nginx中删除此IP /域的侦听器,然后使用如下所示的Go代码?

func main() {
 http.HandleFunc("/", someFunction)
 http.ListenAndServe("123.123.123.123:80", nil)
}

1 个答案:

答案 0 :(得分:2)

是的,你可以让Go直接听取IP,它会正常工作,nginx有其他用途,比如缓存和提供静态文件。

此外,您可以在http.ListenAndServe("127.0.0.1:9020", nil)上收听并从nginx代理到它:

server {
        listen 123.123.123.123:80;
        location  /  {
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://127.0.0.1:9020/;
        }
}

需要几分钟的测试时间。

所以问问自己,你需要nginx来缓存一些文件或为你提供静态文件吗?如果是,请在go前使用,如果没有,请直接使用。

此外,如果你使用nginx,代理方法可能比fcgi更快。