C 语言 Web 开发:CGI、FastCGI 与 Nginx 详解
一、前言:为什么在 Web 领域关注 C 语言?
尽管现代 Web 开发中 Python、Go 等语言更为常见,但 C 语言的高性能和可移植性使其在网络底层和服务器端逻辑中依然占据重要地位。理解 CGI、FastCGI 以及 Nginx 模块开发,有助于深入掌握 HTTP 协议交互机制及服务器资源管理。
二、CGI(通用网关接口)基础
1. 核心架构
CGI 是 Web 服务器与服务器端程序之间的通信标准。其流程相对简单:Web 服务器接收请求,启动一个 CGI 进程处理,生成响应后销毁进程。这种'每次请求创建新进程'的模型虽然实现简单,但在高并发下性能瓶颈明显。
2. 开发实战
编写 CGI 程序时,最关键的步骤是正确设置 HTTP 响应头。以下是基础的 Hello World 示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
// 设置 HTTP 响应头,注意两个换行符
printf("Content-Type: text/plain\n\n");
// 输出响应内容
printf("Hello from CGI!");
return 0;
}
在实际开发中,获取参数通常依赖环境变量。GET 请求通过 QUERY_STRING,POST 请求则需读取 CONTENT_LENGTH 指定的输入流。这里需要注意 URL 解码,因为参数中的特殊字符会被编码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void decode_url(char *src, char *dst) {
i = , j = ;
(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(, );
}
}
;
}


