服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - Nginx - 利用nginx + fastcgi实现图片识别服务器

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

2020-01-04 17:33鱼香土豆丝 Nginx

这篇文章主要给大家介绍了关于如何利用nginx + fastcgi实现图片识别服务器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

背景

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

整体框架

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

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

前期调研

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

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

why not try NGINX with fcgi-function mapping?

实现步骤

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

nginx

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

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

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

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

cgi

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

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

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

fastcgi

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

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

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

cgi的工作流程:

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

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

fastcgi

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

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

也可以这样比喻:

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

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

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

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

具体步骤

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

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

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

C++开发环境安装

?
1
apt-get install build-essential

nginx

?
1
apt-get install nginx

fastcgi

?
1
sudo apt-get install libfcgi-dev

spawn-fcgi

?
1
apt-get install spawn-fcgi

编写运行程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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;

编译程序

?
1
g++ cgi.cpp -o cgidemo -lfcgi

修改nginx 配置文件

?
1
vi /usr/local/nginx/conf/nginx.conf

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

启动nginx

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

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

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

启动spwan-cgi进程

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

总结

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

原文链接:https://www.jianshu.com/p/a8e611527277

延伸 · 阅读

精彩推荐
  • NginxNginx动静分离实现案例代码解析

    Nginx动静分离实现案例代码解析

    这篇文章主要介绍了Nginx动静分离实现案例代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    盗哥泡茶去了3382020-09-27
  • Nginx如何优化Nginx的处理性能

    如何优化Nginx的处理性能

    Nginx是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性,在连接高并发的情况下,Nginx是Apache服务不错的替代品。其特点是占有内存少,...

    Dockone.io5142020-12-11
  • Nginx通过Nginx规则重写URL去掉index.php不显示index.php

    通过Nginx规则重写URL去掉index.php不显示index.php

    Nginx不仅占用内存少,并发能力强,而且拓展功能丰富,可以通过安装模板来强化功能,也能通过规则优化,优化服务器并发处理能力,是建站的不二之选...

    Genius日记5872020-10-16
  • NginxNginx Rewrite使用场景及代码案例详解

    Nginx Rewrite使用场景及代码案例详解

    这篇文章主要介绍了Nginx Rewrite使用场景及代码案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    盗哥泡茶去了11862020-09-27
  • Nginxnginx rewrite 伪静态配置参数和使用例子

    nginx rewrite 伪静态配置参数和使用例子

    nginx下伪静态配置参数详细说明,使用nginx的朋友,nginx rewrite 伪静态配置参数和使用例子 附正则使用说明 ...

    服务器之家3102019-10-08
  • Nginx利用nginx和腾讯云免费证书制作https的方法

    利用nginx和腾讯云免费证书制作https的方法

    这篇文章主要介绍了利用nginx和腾讯云免费证书制作https的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    dalaoyang5992019-12-30
  • Nginxnginx ssl免密码重启教程详解

    nginx ssl免密码重启教程详解

    这篇文章给大家介绍了nginx 如何启动以及nginx ssl 免密码重启 的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧 ...

    mrr4272019-11-19
  • NginxNginx location 和 proxy_pass路径配置问题小结

    Nginx location 和 proxy_pass路径配置问题小结

    本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,进行测试,完全还原了整个测试过程,本文给大家介绍Nginx location 基本配置及相关配...

    自由早晚乱余生18742021-09-24