Apache httpd web服务器如何与Perl或PHP或CGI通信,并获得输出并返回响应


How does the Apache httpd webserver communicate with Perl or PHP or CGI and gets the output and returns the response?

从客户端浏览器到Apache httpd web服务器有一个明确定义的协议,HTTP,通过TCP/IP(套接字)。我很难理解从Apache httpd web服务器到Perl或PHP或CGI使用了什么通道/协议?是通过套接字或管道或消息队列或信号进行进程间通信吗?有人能解释一下幕后到底发生了什么吗?是否Apache httpd web服务器执行另一个程序(Perl或PHP)并捕获输出,然后将其重新发送到客户端浏览器?

From Linux Server Security:

CGI协议没有指定web服务器应该如何与CGI程序通信。有两种主要的解决方案:

独立CGI程序

Apache接收一个CGI请求,打开一个通向外部程序的双向管道,向它发送CGI输入数据,并将程序的输出返回给客户端。作为一个独立的进程,程序可以在不使web服务器崩溃的情况下崩溃。缺点是启动一个新进程相对较慢。

内置CGI程序

程序被重写为Apache模块,只有在Apache进程启动时才产生启动成本。这比外部程序快得多,并且可以访问Apache的内部和其他模块。Apache中最流行的CGI模块是Perl (mod_perl)和PHP (mod_php)的解释器引擎。

与CGI程序的通信是通过两个通道完成的:简单的IO重定向(即STDIN和STDOUT)和环境变量。

HTTP服务器将请求发送到CGI的STDIN。它从CGI的STDOUT读取HTTP响应,并将其(稍作修改)发送到客户机浏览器。其他服务器数据(如请求大小或某些服务器参数)设置为通常以HTTP_开头的环境参数。