web服务器和cgi进程是如何相互通信的


How do webserver and cgi process communicate with each other?

我想了解Web服务器(例如:nginx)和cgi/fastcgi是如何相互通信的。Web服务器如何将cgi脚本传递给cgi进程,以及cgi进程如何响应请求。

在Nginx中,我们这样配置,让Nginx将PHP脚本传递给PHP-fpm

 location / {
            root   /home/service/public_html;
            fastcgi_pass   unix:/tmp/php-fpm-test.socket;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/service/public_html/index.php;
            include        fastcgi_params;
        }

它是如何工作的?

编辑:如果有人能给我一段伪代码来描述进程(或任何东西)和php-fpm-unix套接字之间的通信,我将不胜感激。

CGI应用程序只是一个标准的可执行文件或脚本-对web服务器的每个HTTP请求都对应于该可执行文件/脚本的单个执行/实例,其中环境变量用于传递有关请求的信息(如请求URL和请求方法),HTTP请求体在标准输入上传递。脚本/可执行文件通过标准输出流将原始HTTP输出传递到web服务器。

有关CGI应用程序的示例,请参阅wikipedia页面以获取示例perl脚本,有关更多详细信息,请阅读CGI规范


Fast CGI是一种减少CGI接口开销的尝试,因为在许多操作系统上启动一个新进程是一项相对昂贵的任务,Fast CGI试图通过允许一个长时间运行的Fast CGI进程处理许多HTTP请求来减少这一开销。

尽管Fast CGI的许多部分与CGI相似(例如环境变量的格式),但对于Fast CGI,所有信息都通过标准输入流传递。

你应该尝试查看Fast CGI网站以获取更多信息,特别是那里有Fast CGI规范,并详细解释了所有这些。