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程序这种情况我们的配置文件可以进一步简化为:
“?“后面的内容表示参数,这里是通过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,然后获取并解析参数,然后调用算法,最后输出结果