从客户端浏览器到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_开头的环境参数。