Nginx+fastcgi+c/c++介绍

本文介绍如何利用FastCGI结合Nginx部署人工智能算法服务,实现算法的Web化,便于利用实时数据进行算法训练与优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/xcq2000/article/details/9017755

在移动互联和大数据的背景下,人工智能算法获得极大的支撑。以前需要花很大代价采集数据,现在可以很容易从联网中获得。大部分做算法研究的都是用c/c++开发独立可执行程序,有自己的离线训练数据集和测试集,自成一个体系,这样做可以达到最高的效率,包括程序执行效率和算法研究效率。但如前所述,我们处在一个大数据时代,时刻新增的数据能够使我们的算法具有更好的自适应性,我们应该考虑把算法和web服务结合起来。

        FastCGI除了用于php等脚本语言解析外,还很适合搭建一个web分布式计算系统,算法开发人员不需了解太多web知识,也能方便的发布一个web api;算法部分的崩溃不会导致web网的崩溃;而且算法部分可以独立使用网格计算等先进架构。

1,Nginx+FastCGI整个运作过程

下载安装(略),几个常用命令:

start nginx            启动Nginx服务器
nginx -s stop          // 停止nginx
nginx -s reload       // 重新加载配置文件
nginx -s quit          // 退出nginx

        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的整个运作过程。

        以php解析来举例,由于Nginx本身不会对PHP进行解析,因此要实现Nginx对PHP的支持,将对PHP页面的请求交给FastCGI进程监听的IP地址及端口。如果把PHP_FPM当做动态应用服务器,那么Nginx其实就是一个反向代理服务器。Nginx通过反向代理功能实现对PHP的解析,这就是Nginx实现PHP动态解析的原理。

        同理,用c/c++实现的算法也可以用这种方式提供服务,Nginx从浏览器端接受一个算法服务请求,例如人脸识别,Nginx将需要识别的图片和服务请求通过Fastcgi,传给相应的IP地址和端口,该IP和端口运行着一个人脸识别算法,这里和php不同的是,并不解析执行一个php脚本,而是执行一个识别算法,后面的过程和php一样,返回识别结果给Nginx,再传回给浏览器。

2,Nginx的fastCGI配置

Nginx配置文件为 nginx.conf。下面是在Nginx下支持cgi解析的一个虚拟主机配置实例。

      location表示符合条件的域名,(这里表示所有以cgi为后缀的文件)
      fastcgi_pass:IP地址和端口,就是FastCGI进程监听的IP地址和端口。
      fastcgi_param SCRIPT_FILENAME :cgi文档的路径,也就是$fastcgi_script_name加上前面指定的路径,如:fcgi/myfcgiapp

     上面的配置表示所有.cgi程序都发送到127.0.0.1:9000来处理,假如我们的fastcgi程序是单一功能,例如只返回“hello word”字符串,那么上面的配置文件
会导致这么一种结果:任何一个带cgi后缀的域名都返回相同的结果
     127.0.0.1/1.cgi;  127.0.0.1/2.cgi  并没有任何区别。
原因是我们写的fastCGI程序并没有像php一样解析域名后面的具体文件名,然后再调用解析后的php文件并返回结果,在这里我们的fastcgi只管输出自己的hello word。 
因此对于任何一个网址 127.0.0.1/*.cgi 都获得同样的返回结果,都输出“hello word”,
        单一cgi程序这种情况我们的配置文件可以进一步简化为:

        这样就可以用固定脚本的域名来访问,如: http://127.0.0.1/my_fcgi?arg1=100

      “?“后面的内容表示参数,这里是通过GET方式传递到服务器。
        如果希望配置一个rest风格的api,可以这样设置:(假如提供1.0版本的API统一调用格式)

   /myapi/v1.0/{

        所有这种格式的域名都会转到fastCGI来:127.0.0.1/myapi/v1.0/resource/fun/...

当然需要在fastCGI程序中对后面的域名做具体解析和处理。

3,FastCGI wrapper

        FastCGI wrapper 用于管理fastCGI应用程序,可以理解为方便fastCGI程序的开发,将端口监听,进程创建等一系列重复性的工作提取出来。目前网络上支持c/c++ 的wrapper主要是               spawn-fcgi,他是lighttpd的一子项目,而且是在linux下开发的。
        在命令行下输入spawn-fcgi能看到帮助,主要一些参数为:

       -a   fastCGI绑定的TCP socket ip地址
       -p   端口
       -f   cgi程序
       -F   指定fork多少个进程

       示例:
       spawn-fcgi -a 127.0.0.1 -p 9000 -f helloFastCGI

4,FastCGI程序基本框架

        一个标准FastCGI流程如下:首先判断是POST还是GET,然后获取并解析参数,然后调用算法,最后输出结果

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值