工作至今还未亲自写过 cgi,今天考个古
CGI:回顾与演变
历史背景
互联网的早期,HTML页面基本上是静态的,无法实现用户交互
1993年,NCSA发布了HTTPd服务器,首度实现了CGI,旨在通过让Web服务器调用外部应用程序,生成动态网页
1996年,CGI标准正式被纳入IETF的RFC文档中,为Web开发奠定了基础
CGI的工作原理
-
从环境变量获取数据:Web服务器将请求的环境信息(如
QUERY_STRING
、PATH_INFO
等)传递给CGI程序 -
从标准输入接收数据:如果请求使用了GET或POST方法,相关数据将通过标准输入传递给CGI程序
-
处理数据并生成响应:CGI程序处理数据后,生成HTML内容,并通过标准输出传回给Web服务器
-
返回响应给客户端: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 这样的现代框架