zoukankan      html  css  js  c++  java
  • Nginx + FastCGI 程序(C/C++)搭建高性能web service的demo

    http://blog.csdn.net/chdhust/article/details/42645313
    Nginx + FastCGI 程序(C/C++)搭建高性能web service的Demo
     
     
    1.介绍
        Nginx - 高性能web server,这个不用多说了,大家都知道。
        FastCGI程序 - 常驻型CGI程序,它是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。
        Nginx要调用FastCGI程序,需要用到FastCGI进程管理程序(因为nginx不能直接执行外部的cgi程序,我们可使用lighttpd中的spawn-fastcgi来让nginx可支持外部cgi运行。也有其他方法安装nginx-fcgi来让nginx支持cgi,这里是使用spawn-fastcgi的方法),来达到调用FastCGI程序的目的。Nginx本身没有集成类似的模块,而Apache具备该功能模块,所以不需要额外安装FastCGI进程管理程序。
     
    2.工作原理
        Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。
        当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。这就是Nginx+FastCGI的整个运作过程,如图1所示。
     
        
    ​图1 Nginx+FastCGI运行过程​
     
        FastCGI接口方式在脚本解析服务器(CGI应用程序服务器)上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称为FastCGI引擎。 spawn-fcgi与PHP-FPM都是FastCGI进程管理器(支持PHP和C/C++​)。​    
     
    3.环境部署
    3.1.Nginx的安装、部署与配置
         参考连接:    http://blog.csdn.net/chdhust/article/details/9188937
     
    3.2.spawn_fastcgi的安装、部署与配置
        spawn_fastcgi  https://github.com/lighttpd/spawn-fcgi 
        这里使用的是1.6.3的版本 https://github.com/lighttpd/spawn-fcgi/releases/tag/v1.6.3
        
        下载以后解压并安装(请记得看README)
        如果没有configure,请先执行./autogen.sh,生成configure
        
        ./configure
        make
     
        编译好以后,将可执行文件移动到nginx的sbin目录下
        cp ./src/spawn-fcgi /usr/local/nginx/sbin/ (cp到nginx的安装目录下)
     
     
    3.3.fastcgi库的安装(库绝对不是必须的,觉得技术好的大牛可以自己写)
        库地址 http://www.fastcgi.com/dist/fcgi.tar.gz
        下载以后,解压并安装 (默认安装)
        ./configure
        make
        make install
        
    4.Demo和web发布
    4.1.Demo程序
        [CGI程序]    
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. #include <fcgi_stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. int main() {  
    5.     int count = 0;  
    6.     while (FCGI_Accept() >= 0) {  
    7.         printf("Content-type: text/html "  
    8.                 " "  
    9.                 ""  
    10.                 "FastCGI Hello!"  
    11.                 "Request number %d running on host%s "  
    12.                 "Process ID: %d ", ++count, getenv("SERVER_NAME"), getpid());  
    13.     }  
    14.     return 0;  
    15. }  
        [编译]
        g++ demo.cc -o demo  -lfcgi​  
        直接运行可执行文件,看看能否正常运行。如果出现缺少库libfcgi.so.0,则自己需要手动把/usr/local/lib/libfcgi.so.0库建立一个链接到/usr/lib/目录下:ln -s /usr/local/libfcgi.so.0 /usr/lib/(或者把so的库路径添加到/etc/ld.so.conf,并执行ldconfig更新一下)
     
    4.2.Web发布
        1)将CGI可执行程序移动到nginx的安装目录下 /usr/local/nginx/cgibin (文件夹不存在则自己创建) 
        2)启动spawn-fcgi管理进程,并绑定server IP和端口(不要跟nginx的监听端口重合)
         /usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 8088 -f /usr/local/nginx/cgibin/demo
        
        查看一下9002端口是否已成功:netstat -na | grep 8088
    ​   
        3)更改nginx.conf配置文件,让nginx转发请求
        在http节点的子节点-"server节"点中下添加配置
        location ~ .cgi$ {
            fastcgi_pass 127.0.0.1:8088;
            fastcgi_index index.cgi;
            fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;

            include fastcgi_params;
        }
     
        4)重启nginx或者重新加载配置文件
        重新加载配置文件
        sudo kill -HUP [pid]
        或者
        重启nginx    
        killall nginx
    ​    ./nginx
     
        5)打开浏览器访问一下吧
        http://localhost/demo.cgi
     
       结果显示: 
      
     
    主要参考资料:
    1. http://blog.csdn.net/allenlinrui/article/details/19419721
  • 相关阅读:
    [翻译]XNA 3.0 Game Programming Recipes之thirteen
    [翻译]XNA 3.0 Game Programming Recipes之sixteen
    [翻译]XNA 3.0 Game Programming Recipes之fourteen
    [翻译]XNA 3.0 Game Programming Recipes之nineteen
    [翻译]XNA 3.0 Game Programming Recipes之fifteen
    [翻译]XNA 3.0 Game Programming Recipes之twenty
    正则表达式关于电话和邮箱在RegularExpressionValidator 中的验证
    automation服务器不能创建对象
    常用的正则表达式
    谈论URL伪装
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/7026377.html
Copyright © 2011-2022 走看看