和我一起动手写FastCGI之“准备篇”

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Vivid_110/article/details/53449233

FastCGI介绍:

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

配置环境介绍:

1、服务器:nginx
2、系统版本:腾讯云centos7.0
3、两个插件:spawn_fastcgi和fastcgi
4、开发语言:C/C++

原理介绍

通信原理图

主要内容介绍

1、nginx配置文件:
location ~\.fcgi$ {
fastcgi_pass 127.0.0.1:8000;
include fastcgi.conf;
include fastcgi_params;
}

2、程序的编译运行:
gcc demo.c -o demo.fcgi -lfcgi
sudo cp demo.fcgi /usr/local/nginx/fastcgi_temp/ -f
sudo spawn-fcgi -f /usr/local/nginx/fastcgi_temp/demo.fcgi -a 127.0.0.1 -p 8000

测试用例

/*************************************************************************
    > File Name:    demo.c            
    > Author:       vividwei                    
    > Mail:         [email protected]            
    > Created Time: 2016年12月03日 星期六 19时26分44秒      
 ************************************************************************/
#include <string.h>                            
#include <stdio.h>                          
#include <stdlib.h>                             
#include <unistd.h>                            
#include <fcgi_stdio.h>                        
//#include "url_decode.h"       

int main()                              
{                    
    char post_str[1024];                
    char post_res[1024];                      

    int  len   = 0;                                          
    int  index = 0;                                          

    while (FCGI_Accept() >= 0)                              
    {       
    ┊   len = atoi(getenv("CONTENT_LENGTH"));               

    ┊   memset(post_str, 0x0, sizeof(post_str));            
    ┊   memset(post_res, 0x0, sizeof(post_res));            

    ┊   //read(0, post_str, len);                           
    ┊   for (index = 0; index < len; ++index)               
    ┊   {   
    ┊   ┊   post_str[index] = FCGI_fgetc(stdin);            

    ┊   ┊   if (NULL == post_str)                           
    ┊   ┊   {                                               
    ┊   ┊   ┊   printf("get form NULL!");                   
    ┊   ┊   ┊   break;                                      
    ┊   ┊   }                                               
    ┊   }   
    ┊   //url_decode(post_str, len, post_res);              

    ┊   //printf("Content-type: text/html\n\n<><><>%s,%s<><>\n\n", post_str, post_res);     
    ┊   printf("Content-type: text/html\n\n%s\n\n", post_str);     
    }       

    return 0;
    }

注意事项:

1、Post请求时,需要使用FCGI_fgetc(stdin)来进行form表单逐个字节的读取,并需要对其进行URL转码。
2、Get请求时,需要对"QUERY_STRING"这个环境变量进行读值,也需要对其进行URL转码。
3、进行URL转码的函数url_decode

猜你喜欢

转载自blog.csdn.net/Vivid_110/article/details/53449233