所以我正在尝试在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)
}
答案 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更快。