阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布

109次阅读
没有评论

共计 4595 个字符,预计需要花费 12 分钟才能阅读完成。

由于最近工作的需要,本人学习了一下利用高性能 web server – Nginx,来发布 C /C++ 编写的 fastCGI 程序,详细细节如下。

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 所示。

Nginx + FastCGI 程序(C/C++)搭建高性能 web service 的 Demo 及部署发布    ​
​图 1 Nginx+FastCGI 运行过程​

    FastCGI 接口方式在脚本解析服务器(CGI 应用程序服务器)上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是 FastCGI 进程管理器,或者称为 FastCGI 引擎。spawn-fcgi 与 PHP-FPM 都是 FastCGI 进程管理器(支持 PHP 和 C /C++​)。​
   
    介绍到这里,大家应该都对该模式有了一定的了解,下面开始进行实战!

3. 环境部署
3.1.Nginx 的安装、部署与配置
    nginx 下载目录 http://nginx.org/en/download.html
    这我们使用的是 nginx-1.5.10
   
    [安装]

    下载以后解压并安装(请记得看 README)
    ./configure(注意了类似 checking for *** … not found 项,可能是依赖包没有,则需要安装依赖包)
   

    缺少 pcre,则需要额外安装 http://www.pcre.org/(或者采用 apt-get 或 yum 的安装方式)

    缺少 zlib,则需要额外安装 http://www.zlib.net/(或者采用 apt-get 或 yum 的安装方式)

    缺少 OpenSSL,则需要额外安装 http://www.openssl.org(或者采用 apt-get 或 yum 的安装方式)

    如果需要配置安装额外的功能模块,可以参考这里 http://wiki.codemongers.com/NginxChsInstall

 

    make
    make install(默认安装到 /usr/local/nginx)

    [配置和管理]   
    1)执行选项
        -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。不输入则使用默认的配置文件。
        -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
        -v 显示 nginx 的版本。
        -V 显示 nginx 的版本,编译器版本和配置参数。

 

    2)检查配置文件
        sudo ./nginx -t
        nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
        nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

 
    3)启动 – 默认和特殊
        /usr/local/nginx/sbin/nginx(默认启动方式)

        /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf(指定配置文件启动)
   
    4)查看 nginx 进程号(master 是主进程)
        ps -ef | grep nginx

 

    5)重新加载配置文件
        sudo kill -HUP [nginx 主进程号]
        通过系统的信号控制 Nginx
        可以使用信号系统来控制主进程。默认,nginx 将其主进程的 pid 写入到 /usr/local/nginx/logs/nginx.pid 文件中。通过传递参数        给 ./configure 或使用 pid 指令,来改变该文件的位置。

       
        主进程可以处理以下的信号:
        命令说明 备注
        TERM, INT 快速关闭
        QUIT 从容关闭
        HUP 重载配置用新的配置开始新的工作进程    从容关闭旧的工作进程
        USR1 重新打开日志文件
        USR2 平滑升级可执行程序
        WINCH 从容关闭工作进程

 

    6)默认目录结构
        主目录:/usr/local/nginx/
        配置目录:/usr/local/nginx/conf/
        root 目录:/usr/local/nginx/html/

        可执行文件路径:/usr/local/nginx/sbin/

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 程序]   

#include <fcgi_stdio.h>
#include <stdlib.h>

int main() {
    int count = 0;
    while (FCGI_Accept() >= 0) {
        printf(“Content-type: text/html\r\n”
                “\r\n”
                “”
                “FastCGI Hello!”
                “Request number %d running on host%s “
                “Process ID: %d\n”, ++count, getenv(“SERVER_NAME”), getpid());
    }
    return 0;
}

 [编译]
    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

搞定收工,心里又小小的激动了一把!

Nginx 的详细介绍 :请点这里
Nginx 的下载地址 :请点这里

相关阅读

CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计4595字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中