工作至今还未亲自写过 cgi,今天考个古

CGI:回顾与演变

历史背景

互联网的早期,HTML页面基本上是静态的,无法实现用户交互

1993年,NCSA发布了HTTPd服务器,首度实现了CGI,旨在通过让Web服务器调用外部应用程序,生成动态网页

1996年,CGI标准正式被纳入IETF的RFC文档中,为Web开发奠定了基础

CGI的工作原理

  1. 从环境变量获取数据:Web服务器将请求的环境信息(如QUERY_STRINGPATH_INFO等)传递给CGI程序

  2. 从标准输入接收数据:如果请求使用了GET或POST方法,相关数据将通过标准输入传递给CGI程序

  3. 处理数据并生成响应:CGI程序处理数据后,生成HTML内容,并通过标准输出传回给Web服务器

  4. 返回响应给客户端:Web服务器将CGI程序的输出作为动态生成的网页返回给客户端

示例

C 写个 Hello World,也可以作为一个合法的 CGI 程序

#include <stdio.h>
void main() {
    printf("Content-type:text/html\n\n");
    printf("hello");
}

Apache与CGI配置

nginx跑php那是fastCGI,古早的cgi得apache httpd

win版都沦落到官方not provide binary releases of software

就第2个靠谱点,其他都已经奇奇怪怪了

配置

编译 运行

一个 FastCGI 进程可以处理若干请求(FastCGI 进程驻留),Web Server 还可限制其空闲时间(一段时间内没有请求就自动退出)、或 fpm 控制 FastCGI 进程数量

FastCGI:性能的提升

FastCGI 是一套协议,不再是通过简单的环境变量、标准输入和标准输出来接收和传递数据了

Web服务器与应用程序之间一般用 TCP 或者 命名管道 (Named Pipe) 进行通信,程序可以在服务器上持续运行,处理多个请求

PHP-FPM:FastCGI的具体应用

PHP-FPM(FastCGI Process Manager):PHP的一种FastCGI实现,专门用来管理PHP进程

  • 动态调整 cgi 数量,有效使用内存

  • 平滑重载 php 配置

  • 用 Unix-Socket 和服务器通讯,不用再配置 cgi 端口

  • 更好的状态输出和 slowlog 日志,502 的时候能给出更多的错误细节

Web应用接口:WSGI与ASGI

随着Web开发的不断发展,出现了WSGI和ASGI等协议,用于解决Web应用与服务器之间的通信问题

WSGI(Web Server Gateway Interface)是Python Web应用(框架如Flask,Django)与服务器(Nginx,uWSGI,Gunicorn等)的通信标准,而ASGI则是WSGI的扩展,支持异步操作和WebSocket

时代

CGI 那个年代 Perl 火是因为 1990 年代几乎只有 Perl 可用。当时Perl 有点像现在的 Python,引发行业变革的事物

后来 200X 年各种 web 框架是一个时代,而今则又是一个新时代

圈子里基本是前端 js/css 一统天下,后端提供 rest api 。一定程度上Perl/Python/Ruby 又被拉回了同一起跑线

PHP、Ruby on Rails 相关技术框架和社区快速发展,Perl Web 开发框架数量少,先进程度也不够

Perl 学习曲线比较陡峭,入门和精通都相对不易

现在 Perl 有 Mojilicious/Dancer 这样的现代框架