C 语言 Web 开发实战:CGI、FastCGI 与 Nginx 模块详解
在高性能计算和底层系统编程领域,C 语言依然占据着不可替代的地位。尽管现代 Web 开发多转向 Go、Java 或 Node.js,但在对资源控制、并发性能有极致要求的场景下,C 语言结合 Nginx 或 FastCGI 依然是构建核心后端服务的优选方案。本文将深入剖析 CGI、FastCGI 及 Nginx 模块的开发逻辑,通过实战代码带你理解从请求接收到响应生成的完整链路。
CGI 基础与实现
通用网关接口(CGI)是 Web 服务器与外部程序通信的标准协议。其核心架构相对简单:Web 服务器接收客户端请求,启动一个 CGI 进程处理,处理完毕后返回结果并销毁进程。这种'每次请求启动一个新进程'的机制虽然实现了隔离,但也带来了显著的性能开销。
编写一个简单的 CGI 程序,关键在于正确设置 HTTP 响应头。注意,Content-Type 后必须有两个换行符,否则浏览器无法识别内容类型。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 设置 HTTP 响应头,注意两个\n
printf("Content-Type: text/plain\n\n");
// 输出响应内容
printf("Hello from CGI!");
return 0;
}
在实际应用中,我们往往需要获取请求参数。CGI 通过环境变量传递数据,例如 QUERY_STRING 用于 GET 请求,CONTENT_LENGTH 配合 stdin 读取 POST 数据。下面是一个处理 URL 解码和参数解析的示例,这里要注意内存管理和字符编码的处理。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void decode_url(char* src, char* dst) {
int i = 0, j = 0;
while (src[i]) {
if (src[i] == '%') {
value;
(src + i + , , &value);
dst[j++] = ()value;
i += ;
} (src[i] == ) {
dst[j++] = ;
i++;
} {
dst[j++] = src[i++];
}
}
dst[j] = ;
}
{
* query_string = getenv();
* content_type = getenv();
* request_method = getenv();
();
(, query_string ? query_string : );
(, content_type ? content_type : );
(, request_method ? request_method : );
((request_method, ) == && query_string) {
* token = strtok(query_string, );
(token) {
* equals = (token, );
(equals) {
*equals = ;
* key = token;
* value = equals + ;
decoded_key[], decoded_value[];
decode_url(key, decoded_key);
decode_url(value, decoded_value);
(, decoded_key, decoded_value);
}
token = strtok(, );
}
}
;
}


