利用nginx + fastcgi实现图片识别服务器

背景

使用的特定的设备进行深度学习模型的推理,该机器仅仅提供了C++封装好的API进行模型的加载启动与推理,模型的训练依然是使用caffe,模型需要转化成该设备支持的格式,模型的转化这里就不在介绍。为了把模型的推理做成一种服务,只能上手C++,搭建HTTP服务,使得用户通过http服务post一张图片,服务器启动模型推理,实现模型的预测,并把结果返回给客户端。

整体框架

服务短的服务内容就是对接收的图片进行预处理,然后进行模型的推理,目前需要做的一点就是引入HTTP服务

前期调研

对于一个C++新手,前期调研当然是先进行搜索,http server c++搜处理的结果也是五花八门,有的是教你如何通过实现一个http服务器,有的是一个用第三方库,有的是直接怼一堆代码。。。知道在stackoverflow上看到了:

why

not try NGINX with fcgi-function mapping?

实现步骤

nginx这个是做代理的神器,做负载均衡的时候也经常用,只要我的客户端的内容发送的nginx上,然后nginx把数据转发给fcgi相关的应用就可以,我需要做的就是把fcgi和我的推理程序结合起来就可以。

nginx

简单说nginx就是中间商,客户端把请求发给中间商,中间商去货源地把货拿上,让后给客户回应:

客户告诉nginx 我要购买**商品,nginx就去对于的服务提供商取出对于服务并把它返回给客户。

目前需要的就是实现fcgi 部分,那么什么是fcgi?

cgi

通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。

这里的标准输入输出是对应的一些环境变量主要包含有与请求相关的环境变量,与服务器相关的环境变量,与客户端相关的环境变量三大类。

fastcgi

FastCGI 实际上是增加了一些扩展功能的 CGI 、是 CGI 的改进,同样也是描述客户端和Web服务器程序之间传输数据的一种标准。

FastCGI 致力于减少Web服务器与CGI程序之间进行互动的开销,从而使Web服务器可以同时处理更多的Web请求。与 CGI 为每个Web请求创建一个新的进程不同, FastCGI 使用持续的进程来处理一连串的Web请求,这些进程由FastCGI进程管理器管理,而不是Web服务器。

为什么说是减少了互动的开销呢?这就要看两种处理方式的区别!

cgi的工作流程:

每当客户端发出一个新的请求,首先要创建一个cgi子进程,然后cgi处理完请求,有多少个连接就会有多少个cgi子进程启动,当请求量大的时候会占用大量的系统资源。

fastcgi

fastcgi 是使用持续的进程处理一连串的请求,这些进程有fastcgi的进程管理器来进行管理具体流程如下所示:

也可以这样比喻:

cgi在卖鸡蛋灌饼,等到顾客要吃的时候,他开始点火,打鸡蛋,摊饼,然后熄火。然后等待下一个顾客

fastcgi就是早餐店老版,雇佣了一帮服务员,专门做需要现场做的饭,老板只需要把订单安排下去,服务员负责盛粥煎饼。

具体步骤

  • 搭建c++的开发环境
  • 搭建nginx
  • 安装fastcgi
  • 安装fastcgi的进程管理器spawn-cgi
  • 编写运行程序
  • 编译运行

工欲善其事,必先利其器,首先搭建环境把!

通过阅读不少的博客内容找到了最简单的安装步骤,好多都是通过下载源代码,然后通过make进行编译,不过对于这些比较常用的库,软件包中已经集成了。

C++开发环境安装

apt-get install build-essential

nginx

apt-get install nginx

fastcgi

sudo apt-get install libfcgi-dev

spawn-fcgi

apt-get install spawn-fcgi

编写运行程序

#include <iostream>
#include "fcgio.h"

using namespace std;

int main(void) {
 // Backup the stdio streambufs
 streambuf * cin_streambuf = cin.rdbuf();
 streambuf * cout_streambuf = cout.rdbuf();
 streambuf * cerr_streambuf = cerr.rdbuf();

 FCGX_Request request;

 FCGX_Init();
 FCGX_InitRequest(&request, 0, 0);

 while (FCGX_Accept_r(&request) == 0) {
  fcgi_streambuf cin_fcgi_streambuf(request.in);
  fcgi_streambuf cout_fcgi_streambuf(request.out);
  fcgi_streambuf cerr_fcgi_streambuf(request.err);

  cin.rdbuf(&cin_fcgi_streambuf);
  cout.rdbuf(&cout_fcgi_streambuf);
  cerr.rdbuf(&cerr_fcgi_streambuf);

  cout << "Content-type: text/html\r\n"
    << "\r\n"
    << "<html>\n"
    << " <head>\n"
    << " <title>Hello, World!</title>\n"
    << " </head>\n"
    << " <body>\n"
    << " <h1>Hello, World!</h1>\n"
    << " </body>\n"
    << "</html>\n";

 }
 cin.rdbuf(cin_streambuf);
 cout.rdbuf(cout_streambuf);
 cerr.rdbuf(cerr_streambuf);
 return 0;

编译程序

g++ cgi.cpp -o cgidemo -lfcgi

修改nginx 配置文件

vi /usr/local/nginx/conf/nginx.conf

启动nginx

nginx -c /usr/local/nginx/conf/nginx.conf

通过浏览器验证nginx是否正常启动http://*******:80

启动spwan-cgi进程

spawn-fcgi -a 127.0.0.1 -C 20 -p 7070 ./cgidemo

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • CentOS 6.1 环境中部署nginx、php(包括fastcgi)、虚拟主机配置

    部署时间:2012-07-24 OS环境:CentOS 6.1 nginx:nginx-1.2.2 PHP:PHP5.3.14 0.安装依赖包 复制代码 代码如下: yum install openssl-devel pcre-devel zlib-devel libjpeg-devel libpng-devel freetype-devel gcc make 1.添加 www 用户用来执行nginx 复制代码 代码如下: useradd -M -r -s /sbin/nologin -d /o

  • Nginx(PHP/fastcgi)的PATH_INFO问题

    在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的, 也就是说: 如果在服务器在存在一个/laruence/index.php 那么, 对于如下请求, 复制代码 代码如下: /laruence/index.php/dummy /laruence/dumm Apache都接受, 都会认为是对info.php的访问, 并会设置PATH_INFO为dummy 而对于Nginx下, 是不支持PATH INFO的, 也就是它不会默认设置PATH_INFO.

  • 解决Nginx + PHP(FastCGI)遇到的502 Bad Gateway错误

    我让按照以下两个步骤去解决,最后在第2步中将FastCGI的timeout时间增加为300,问题解决: PS:比较羡慕迅雷的Web服务器,16G内存. -------------------------------------------------------------------------------- 1.查看当前的PHP FastCGI进程数是否够用: netstat -anpo | grep "php-cgi" | wc -l 如果实际使用的"FastCGI进程

  • Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化第1/2页

    对其用户和应用程序来讲,每一个VPS平台的运行和管理都与一台独立主机完全相同,因为每一个VPS均可独立进行重启并拥有自己的root访问权限.用户.IP地址.内存.过程.文件.应用程序.系统函数库以及配置文件.VPS服务器最重要的指标就是内存大小,多个VPS服务器可以共享一颗CPU,但不能共享同一块内存.内存越大,价格越贵. 下面,以我的博客所在的VPS为例,介绍在128M内存下对 Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 的优化. 至于 Nginx

  • Nginx+PHP(FastCGI)搭建高并发WEB服务器(自动安装脚本)第二版

    本文是依照张宴的 Nginx 0.7.x + PHP 5.2.10(FastCGI)搭建胜过Apache十倍的Web服务器(第5版) 编写 原文地址 http://blog.s135.com/nginx_php_v5/ 因为编译过程和等待时间繁琐,于是就自己写了个全自动安装的shell脚本,此脚本可以随意修改,转载请注明出处. 这篇文章为这个系列的第二版,在第一版的基础上加入 1.日志切割 2.智能选择yum或者rpm安装 下载地址 注意:如果不能使用yum源,请放入系统光盘,单张dvd的,如果

  • Nginx0.5.33+PHP5.2.5(FastCGI)搭建胜过Apache10倍的Web服务器

    修正了PHP iconv和gd库冲突的BUG,增加了PHP mcrypt.memcache扩展,修改了PHP和Nginx编译参数,优化了Nginx配置文件,添加了部分功能. Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAPPOP3SMTP 代理服务器. Nginx 是由 Igo Sysoev 为俄罗斯访问量第二的 ambe. 站点开发的,它已经在该站点运行超过两年半了.Igo 将源代码以类BSD许可证的形式发布. Nginx 的中文维

  • ubuntu上配置Nginx+PHP5 FastCGI服务器配置

    首先安装或编译Nginx.安装Nginx源码包可以在官方主页上下载.Ubuntu 9.04可以直接通过apt安装,也可以从这里下载最新的deb包:sudo apt-get install nginx如果要自己编译的话,需要确保自己已经有编译器和PCRE的库(用于Nginx的rewrite模块,如果不需要这个模块可以在configure时使用./configure –without-rewrite).编译方法如下:wget http://sysoev.ru/nginx/nginx-0.5.34.t

  • 利用nginx + fastcgi实现图片识别服务器

    背景 使用的特定的设备进行深度学习模型的推理,该机器仅仅提供了C++封装好的API进行模型的加载启动与推理,模型的训练依然是使用caffe,模型需要转化成该设备支持的格式,模型的转化这里就不在介绍.为了把模型的推理做成一种服务,只能上手C++,搭建HTTP服务,使得用户通过http服务post一张图片,服务器启动模型推理,实现模型的预测,并把结果返回给客户端. 整体框架 服务短的服务内容就是对接收的图片进行预处理,然后进行模型的推理,目前需要做的一点就是引入HTTP服务 前期调研 对于一个C++

  • 利用nginx与ffmpeg搭建流媒体服务器过程详解

    需求 本文介绍的是利用nginx和ffmpeg搭建流媒体服务器的过程.例如这种场景:公司内部需要同时观看在线直播时,如果每个人直接观看必然给出口带宽带来压力,影响正常访问外网的同事.所以可以在内网通过nginx+ffmpeg拉一路直播流,然后内网的用户访问内网的这台流媒体服务器即可.通过nginx+ffmpeg还可以实现推流.拉流.转推甚至利用FFmpeg实时切片.视频处理等,实现一套直播服务模型. 环境 系统环境:CentOS release 6.7 (Final) 步骤 安装ffmpeg 安

  • CentOS利用Nginx搭建下载功能服务器

    利用nginx在服务器搭建下载功能, 安装Nginx,pcre mkdir /usr/local/nginx tar zxvf pcre-8.12.tar.gz cd pcre-8.12 ./configure --prefix=/usr/local/pcre make && make install tar zxvf nginx-1.0.12.tar.gz tar zxvf nginx-1.0.12.tar.gz cd nginx-1.0.12 ./configure --prefix=

  • 利用nginx搭建RTMP视频点播、直播、HLS服务器

    目录 nginx的服务器的搭建 点播视频服务器的配置 直播视频服务器的配置 配置OBS如图: 实时回看视频服务器的配置 开发环境 Ubuntu 14.04 server nginx-1.8.1 nginx-rtmp-module nginx的服务器的搭建 安装nginx的依赖库 sudo apt-get update sudo apt-get install libpcre3 libpcre3-dev sudo apt-get install openssl libssl-dev 配置并编译ng

  • Nginx+FastDFS搭建图片服务器的方法实现

    安装环境 Centos 环境依赖: yum -y install gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel # 没有make的需要安装一下make yum install -y make 安装配置流程 1.创建fastdfs目录: mkdir -p /fastdfs/tracker mkdir -p /fastdfs/storage

  • 利用nginx搭建静态资源服务器的方法步骤

    以windows为例,linux其实一样: 搭建静态资源服务器 我电脑上的work文件夹下面有很多图片,我想通过nginx搭建静态资源服务器,通过在地址栏输入ip+port的方式完成目录的映射 找到nginx安装目录,打开/conf/nginx.conf配置文件,添加一个虚拟主机 添加监听端口.访问域名 重点是添加location, 映射-URL:/work/; 注意:如果当前server模块中已有一个location且URL为"/",那么新建的location的url应为匹配路径,不

  • Nginx配置本地图片服务器的实现

    目录 一.Nginx介绍 二.图片服务器搭建 一.Nginx介绍 Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如GoAgent,FQ神器. 一个完整的代理请求过程为:客户端首先与代理服务器创建连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接.或则获得目标服务器的指定资源.Web代理服务器是网络的中间实体.代理位于Web客户端和Web服务器之间,扮演"中间

  • 如何利用React实现图片识别App

    先把效果图给大家放上来 个人觉得效果还行.识别不太准确是因为这个 app学习图片的时间太短(电脑太卡). (笔者是 window10) 安装运行环境: npm install --global windows-build-tools(这个时间很漫长...) npm install @tensorflow/tfjs-node(这个时间很漫长...) 项目目录如下 train文件夹 index.js(入口文件) const tf = require('@tensorflow/tfjs-node')

  • Nginx搭建图片视频服务器的部署步骤

    目录 1 前言 1.1 关于视频 1.2 关于图片 2 搭建图片服务器 2.1 配置文件 2.2 显示效果 3 搭建视频服务器 3.1 添加视频模块 3.2 配置文件 3.3 展示 1 前言 首先是俩故事: 1.1 关于视频 好几年前,我还在上上家公司就职的时候,工作电脑是不连外网的,内网开发,真滴难受,查啥资料的时候,只能用手机.有啥不会的,查到代码了,只能对着一个一个敲. 有一天,俺们接待了一个客户,想给他看我们新产品的的宣传视频,但是视频刚弄好,还在内网,他们坐在会议室聊着天等着看视频,俺

  • 如何利用nginx处理DDOS进行系统优化详解

    前言 众所周知DDoS很常见,甚至被称为黑客圈子的准入技能:DDoS又很凶猛,搞起事来几乎压垮一方网络. DDOS的特点是分布式,针对带宽和服务攻击,也就 是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量.对于七层的应用攻击,我们还是可以做一些配置来防御的,例如前端是 Nginx,主要使用nginx的http_limit_conn和http_limit_req模块来防御. 什么是分布式拒绝服务DDoS(Distributed Denial of Service)意为

随机推荐