C 语言 Web 开发实战:CGI、FastCGI 与 Nginx 模块详解
一、为什么选择 C 语言做 Web 后端?
尽管现代 Web 开发中 Python、Go 等语言层出不穷,但 C 语言凭借极高的性能和可移植性,在底层网络编程和系统级服务中依然不可替代。理解 CGI、FastCGI 以及 Nginx 模块开发,是掌握高性能 Web 架构的关键一步。
二、CGI:通用网关接口的基础
1. 核心原理
CGI(Common Gateway Interface)是最早的 Web 服务器扩展标准。其工作流程相对简单:Web 服务器接收到请求后,会 fork 一个新的进程来运行 CGI 程序,处理完请求并输出响应后,该进程立即销毁。
这种机制虽然实现简单,但每次请求都涉及进程创建和销毁,开销较大,难以应对高并发场景。
2. 开发要点
编写 CGI 程序时,主要依赖环境变量传递请求信息。下面是一个基础的 Hello World 示例,注意 HTTP 响应头的格式必须严格符合规范。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 设置 HTTP 响应头,注意有两个换行符
printf("Content-Type: text/plain\n\n");
// 输出响应内容
printf("Hello from CGI!");
return 0;
}
3. 参数解析与避坑
实际开发中,我们需要处理 GET 或 POST 传来的参数。GET 请求通常通过 QUERY_STRING 环境变量获取,而 POST 则需要读取 stdin。
这里有一个简单的 URL 解码函数,用于处理 %xx 编码和空格转换,这是处理表单数据时的常见需求。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void decode_url(char *src, char *dst) {
int i = 0, j = 0;
(src[i]) {
(src[i] == ) {
value;
(src + i + , , &value);
dst[j++] = ()value;
i += ;
} (src[i] == ) {
dst[j++] = ;
i++;
} {
dst[j++] = src[i++];
}
}
dst[j] = ;
}
{
*query_string = getenv();
*request_method = getenv();
();
(, query_string ? query_string : );
(, 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(, );
}
}
;
}


