fastcgi_param 详解

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;#脚本文件请求的路径
fastcgi_param  QUERY_STRING       $query_string; #请求的参数;如?app=123
fastcgi_param  REQUEST_METHOD     $request_method; #请求的动作(GET,POST)
fastcgi_param  CONTENT_TYPE       $content_type; #请求头中的Content-Type字段
fastcgi_param  CONTENT_LENGTH     $content_length; #请求头中的Content-length字段。
 
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #脚本名称 
fastcgi_param  REQUEST_URI        $request_uri; #请求的地址不带参数
fastcgi_param  DOCUMENT_URI       $document_uri; #与$uri相同。 
fastcgi_param  DOCUMENT_ROOT      $document_root; #网站的根目录。在server配置中root指令中指定的值 
fastcgi_param  SERVER_PROTOCOL    $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。  
 
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;#cgi 版本
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;#nginx 版本号,可修改、隐藏
 
fastcgi_param  REMOTE_ADDR        $remote_addr; #客户端IP
fastcgi_param  REMOTE_PORT        $remote_port; #客户端端口
fastcgi_param  SERVER_ADDR        $server_addr; #服务器IP地址
fastcgi_param  SERVER_PORT        $server_port; #服务器端口
fastcgi_param  SERVER_NAME        $server_name; #服务器名,域名在server配置中指定的server_name
 
#fastcgi_param  PATH_INFO           $path_info;#可自定义变量
 
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;
 
在php可打印出上面的服务环境变量
如:echo $_SERVER['REMOTE_ADDR']
### FastCGI协议详解及实现方式 #### 什么是FastCGIFastCGI是一种用于Web服务器和应用程序之间通信的协议。它改进了传统的CGI(Common Gateway Interface),解决了后者每次请求都需要启动新进程带来的性能瓶颈问题[^3]。 #### FastCGI的工作原理 与传统CGI相比,FastCGI使用持久化进程来处理一系列请求,而非为每个请求创建新的进程。当接收到HTTP请求时,Web服务器会将环境变量以及页面请求通过Socket或TCP连接发送到FastCGI进程。这些进程由专门的FastCGI管理器维护,而不是由Web服务器直接控制[^3]。 #### FastCGI的优点 - **高效性**:由于采用常驻进程的方式,减少了频繁创建和销毁进程所带来的开销。 - **可扩展性**:支持跨网络调用,允许FastCGI应用部署在不同的物理机器上。 - **资源共享能力增强**:能够更好地利用数据库连接池、内存缓存等资源[^4]。 #### C语言中的简单FastCGI实现示例 以下是基于C语言的一个简化版FastCGI客户端实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define FCGI_VERSION_1 1 #define FCGI_BEGIN_REQUEST 1 #define FCGI_PARAMS 4 #define FCGI_STDIN 5 #define FCGI_STDOUT 6 #define FCGI_END_REQUEST 3 typedef struct { unsigned char version; unsigned char type; unsigned char requestIdB1; unsigned char requestIdB0; unsigned char contentLengthB1; unsigned char contentLengthB0; unsigned char paddingLength; unsigned char reserved; } FCGI_Header; void send_fcgi_record(int sock, int type, int request_id, const void *content, size_t length) { FCGI_Header header; memset(&header, 0, sizeof(header)); header.version = FCGI_VERSION_1; header.type = type; header.requestIdB1 = (request_id >> 8) & 0xFF; header.requestIdB0 = request_id & 0xFF; header.contentLengthB1 = (length >> 8) & 0xFF; header.contentLengthB0 = length & 0xFF; write(sock, &header, sizeof(FCGI_Header)); if (content && length > 0) { write(sock, content, length); } } int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字 struct sockaddr_in serverAddr; memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(9000); // 假设FastCGI服务监听于9000端口 inet_pton(AF_INET, "127.0.0.1", &(serverAddr.sin_addr)); connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); // 发送BEGIN_REQUEST记录 typedef struct { unsigned char roleB1; unsigned char roleB0; unsigned char flags; unsigned char reserved[5]; } FCGI_BeginRequestBody; FCGI_BeginRequestBody beginBody; memset(&beginBody, 0, sizeof(beginBody)); beginBody.roleB1 = 0; // Responder角色 beginBody.flags = 0; send_fcgi_record(sockfd, FCGI_BEGIN_REQUEST, 1, &beginBody, sizeof(beginBody)); // 发送PARAMS记录 const char* params[] = {"SCRIPT_FILENAME=/path/to/script.php", NULL}; for (size_t i = 0; params[i]; ++i) { send_fcgi_record(sockfd, FCGI_PARAMS, 1, params[i], strlen(params[i])); } // 结束PARAMS传输 send_fcgi_record(sockfd, FCGI_PARAMS, 1, NULL, 0); close(sockfd); } ``` 此代码片段展示了如何构建并发送基本的FastCGI消息头及其相关内容至指定的服务端[^1]。 #### 配置Nginx以配合FastCGI工作 为了使Nginx能正确地与FastCGI交互,通常需要设置`fastcgi_param`指令定义各种参数。例如,默认配置如下所示[^5]: ``` fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; ... ``` 以上仅列举部分必要项;实际环境中可能还需要调整更多细节适应具体需求。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值