所以我正在尝试在 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)
}
最佳答案
是的,您可以让 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前面使用,如果不是,直接使用go。
此外,如果您使用 nginx,代理方法可能比 fcgi 更快。
关于web-applications - Go Webapp & Nginx : Confusion about listening, fastcgi & 反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967163/