Web服务器和cgi进程如何相互通信?

时间:2012-01-11 03:40:40

标签: nginx cgi fastcgi php

我想了解网络服务器(例如: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 socket之间的通信,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

有关CGI应用程序的示例,请参阅wikipedia page以获取示例perl脚本,有关详细信息,请阅读CGI specification


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

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

您应该尝试查看Fast CGI website以获取更多信息 - 特别是快速CGI规范就在那里并详细解释了所有这些。