我在生产中非常有效地使用 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 网站;在这种情况下,将其用作同一服务器上的反向代理很方便。