Go(golang)直接输出到Nginx

Go(golang)直接输出到Nginx,nginx,go,fastcgi,Nginx,Go,Fastcgi,对于将Nginx与Go一起使用,我通常看到的解决方案是使用Nginx的fastcgi_pass和Go的“net/http/fcgi” 然而,我想知道使用Go的http功能在这里是否是多余的。既然Nginx将以http响应的形式输出响应,那么可以简单地将Go脚本返回的字符串传递给Nginx并让Nginx创建http响应吗 如果您对底层工作流和性能含义有任何进一步的解释,我们将不胜感激。我从未在实际部署中使用过fastcgi,尽管我曾经帮助过一次功能示例。就性能而言,我会将fcgi部署与反向代理设置

对于将Nginx与Go一起使用,我通常看到的解决方案是使用Nginx的fastcgi_pass和Go的“net/http/fcgi”

然而,我想知道使用Go的http功能在这里是否是多余的。既然Nginx将以http响应的形式输出响应,那么可以简单地将Go脚本返回的字符串传递给Nginx并让Nginx创建http响应吗


如果您对底层工作流和性能含义有任何进一步的解释,我们将不胜感激。

我从未在实际部署中使用过fastcgi,尽管我曾经帮助过一次功能示例。就性能而言,我会将fcgi部署与反向代理设置进行基准测试并进行比较。

您读过吗?它明确定义了FastCGI服务器和客户端如何:

3.3记录

应用程序使用简单的协议执行来自Web服务器的请求。协议的细节取决于应用程序的角色,但大体上说,Web服务器首先向应用程序发送参数和其他数据,然后应用程序向Web服务器发送结果数据,最后应用程序向Web服务器发送请求完成的指示

通过传输连接的所有数据都在FastCGI记录中进行传输。FastCGI记录完成两件事。首先,记录几个独立的FastCGI请求之间的多路传输连接。这种多路复用支持能够使用事件驱动或多线程编程技术处理并发请求的应用程序。第二,记录在单个请求中的每个方向上提供多个独立的数据流。例如,通过这种方式,stdout和stderr数据都可以通过单个传输连接从应用程序传递到Web服务器,而不需要单独的连接

   typedef struct {
       unsigned char version;
       unsigned char type;
       unsigned char requestIdB1;
       unsigned char requestIdB0;
       unsigned char contentLengthB1;
       unsigned char contentLengthB0;
       unsigned char paddingLength;
       unsigned char reserved;
       unsigned char contentData[contentLength];
       unsigned char paddingData[paddingLength];
   } FCGI_Record;
FastCGI记录由固定长度前缀和可变数量的内容和填充字节组成


正如您所看到的,它是一个二进制协议,与HTTP有很大不同。

您不能将“字符串”传递给nginx。它讲HTTP(和FastCGI)。使用nginx作为前端代理的优势在于,它为您提供了强大的SSL支持、大量模块、显著的定制和快速的静态文件服务。如果你的Go应用程序出现故障,你还可以提供一个维护页面。@elithrar和足够迷人的是,Go也内置了这些功能。(但可以肯定的是,它更像是一个样板。)我将nginx与Go结合使用的一个原因是让nginx提供服务,而Go负责处理/逻辑。但我可能并不总是这样…@马特当然。一个很好的例子是SSL:Go可以做到这一点,但是使用nginx可以更轻松地做更多的事情(即共享缓存)。我想我对这个问题的回答可以概括为:是的,@elithrar的链接就是你问题的答案。:-)除了已经说过的,nginx还使支持基于虚拟名称的服务器变得容易。