nginx + fastcgi を使用して画像認識サーバーを実装する

nginx + fastcgi を使用して画像認識サーバーを実装する

背景

ディープラーニング モデルの推論には、特定のデバイスが使用されます。マシンは、モデルの読み込み、起動、推論を行うための C++ カプセル化 API のみを提供します。モデルのトレーニングには、引き続き Caffe が使用されます。モデルは、デバイスでサポートされている形式に変換する必要があります。モデルの変換については、ここでは説明しません。モデル推論をサービスにするためには、C++ を使用して HTTP サービスを構築する必要がありました。これにより、ユーザーは HTTP サービスを通じて写真を投稿でき、サーバーはモデル推論を開始し、モデル予測を実装して、結果をクライアントに返すことができます。

全体的な枠組み

ショートサービスのサービス内容は、受信した画像を前処理し、モデル推論を行うことです。今必要なのは、HTTPサービスを導入することです。

予備調査

C++ 初心者にとって、最初の調査は当然ながらまず検索することです。http サーバー C++ 検索処理の結果もさまざまです。http サーバーの実装方法を教えてくれるものもあれば、サードパーティのライブラリを使用するもの、大量のコードを直接扱うものもあります。 。 。私はstackoverflowでこれを見ました:

なぜ

fcgi-function マッピングで NGINX を試してみませんか?

実装手順

Nginx はプロキシ用の魔法のツールであり、負荷分散によく使用されます。クライアントのコンテンツが nginx に送信され、nginx がデータを fcgi 関連のアプリケーションに転送する限り、必要なのは fcgi と推論プログラムを組み合わせることだけです。

nginx

簡単に言えば、nginx は仲介者です。クライアントは仲介者にリクエストを送信し、仲介者は商品の供給元に行って商品を受け取り、顧客に応答します。

顧客は nginx に ** 製品を購入したいと伝え、nginx は対応するサービス プロバイダーにアクセスして対応するサービスを取得し、顧客に返します。

今必要なのは fcgi 部分を実装することですが、fcgi とは何でしょうか?

CG-10 ...

Common Gateway Interface (CGI) は、クライアントが Web ブラウザーからネットワーク サーバー上で実行されるプログラムにデータを要求できるようにする重要なインターネット テクノロジです。 CGI は、サーバーと要求処理プログラム間でデータを転送するための標準を記述します。

ここでの標準入力と出力はいくつかの環境変数に対応しており、主にリクエスト関連の環境変数、サーバー関連の環境変数、クライアント関連の環境変数の 3 つのカテゴリが含まれます。

ファストcgi

FastCGI は実際にはいくつかの拡張機能が追加された CGI です。これは CGI の改良版です。また、クライアントと Web サーバー プログラム間のデータ転送を記述するための標準でもあります。

FastCGI は、Web サーバーと CGI プログラム間のやり取りのオーバーヘッドを削減し、Web サーバーがより多くの Web 要求を同時に処理できるようにすることを目的としています。 Web 要求ごとに新しいプロセスを作成する CGI とは異なり、FastCGI は永続的なプロセスを使用して一連の Web 要求を処理します。これらの要求は、Web サーバーではなく FastCGI プロセス マネージャーによって管理されます。

なぜインタラクションのコストが削減されると言えるのでしょうか?これは、2つの治療法の違いによって異なります。

cgi のワークフロー:

クライアントが新しいリクエストを送信するたびに、まず CGI 子プロセスを作成する必要があります。CGI がリクエストを処理した後、接続の数と同じ数の CGI 子プロセスが開始されます。リクエストの数が多いと、大量のシステム リソースが占有されます。

ファストcgi

Fastcgi は、連続したプロセスを使用して一連のリクエストを処理します。これらのプロセスは、fastcgi プロセス マネージャーによって管理されます。具体的なプロセスは次のとおりです。

次のように比較することもできます。

cgi は卵入りパンケーキを販売しています。お客様が食べたいときに、火をつけ、卵を溶き、パンケーキを広げ、火を止めます。そして次の顧客を待ちます

fastcgi は、朝食店の古いバージョンです。その場で調理する必要がある食事を準備するために、ウェイターのグループを雇います。店長は注文を整理するだけでよく、ウェイターはお粥とパンケーキを提供する責任があります。

具体的な手順

  • C++開発環境の構築
  • nginxをビルドする
  • fastcgiをインストールする
  • fastcgiのプロセスマネージャspawn-cgiをインストールする
  • プログラムの作成と実行
  • コンパイルして実行する

仕事をうまくやり遂げたいなら、まずは道具を磨き、環境を整えなければなりません。

多くのブログコンテンツを読んで、最も簡単なインストール手順を見つけました。その多くは、ソース コードをダウンロードし、make でコンパイルするというものです。ただし、これらのより一般的に使用されるライブラリは、すでにソフトウェア パッケージに統合されています。

C++ 開発環境のインストール

apt-get インストールビルド必須

nginx

nginxをインストール

ファストcgi

sudo apt-get で libfcgi-dev をインストールします

スポーン-fcgi

apt-get をインストール spawn-fcgi

プログラムの作成と実行

#include <iostream>
#include "fcgio.h"
 
名前空間 std を使用します。
 
int main(void) {
 // stdioストリームバッファをバックアップする
 ストリームバッファ * cin_streambuf = cin.rdbuf();
 ストリームバッファ * cout_streambuf = cout.rdbuf();
 ストリームバッファ *cerr_streambuf = cerr.rdbuf();
 
 FCGX_Request リクエスト;
 
 FCGX_Init();
 FCGX_InitRequest(&request, 0, 0);
 
 (FCGX_Accept_r(&request) == 0) の間 {
  fcgi_streambuf cin_fcgi_streambuf(リクエスト.in);
  fcgi_streambuf cout_fcgi_streambuf(リクエスト.out);
  fcgi_streambuf cerr_fcgi_streambuf(リクエスト.err);
 
  cin.rdbuf(&cin_fcgi_streambuf);
  cout.rdbuf(&cout_fcgi_streambuf);
  cerr.rdbuf(&cerr_fcgi_streambuf);
 
  cout << "コンテンツタイプ: text/html\r\n"
    << "\r\n"
    << "<html>\n"
    << " <head>\n"
    << " <title>Hello, World!</title>\n"
    << " </head>\n"
    << " <本文>\n"
    << " <h1>こんにちは、世界!</h1>\n"
    << " </body>\n"
    << "</html>\n";
 
 }
 cin.rdbuf(cin_streambuf);
 cout.rdbuf(cout_streambuf);
 cerr.rdbuf(cerr_streambuf);
 0を返します。

プログラムのコンパイル

g++ cgi.cpp -o cgidemo -lfcgi

nginx設定ファイルを変更する

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

nginxを起動する

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

ブラウザ http://*******:80 から nginx が正常に起動していることを確認します。

spwan-cgiプロセスを開始する

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

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Ubuntu で Nginx+PHP5 FastCGI サーバー構成を構成する
  • 128M の小メモリ VPS サーバー上の Nginx 0.7.x + PHP 5.2.6 (FastCGI) + MySQL 5.1 の構成の最適化
  • Nginx+PHP (FastCGI) で高並列WEBサーバーを構築する (自動インストールスクリプト) 第2版
  • Nginx0.5.33+PHP5.2.5 (FastCGI) は、Apache より 10 倍優れた Web サーバーを構築します。
  • CentOS 6.1 環境に nginx、php (fastcgi を含む)、仮想ホスト構成をデプロイする
  • Nginx + PHP (FastCGI) で発生する 502 Bad Gateway エラーを解決する
  • Nginx (PHP/fastcgi) の PATH_INFO の問題

<<:  Vue.js ソースコード解析のカスタム手順の詳細な説明

>>:  MySQLのジョイントインデックス機能の分析と使用例

推薦する

WeChat アプレットカスタムタブバーステップ記録

目次1. はじめに2. タブバーのスタイルをカスタマイズする3. カスタムタブバーと関連設定を導入す...

64 ビット CentOs7 ソース コードのインストール mysql-5.6.35 プロセス共有

インストールプロセス中に問題が発生しないように、まず依存パッケージをインストールします。 [root...

HTML のセルパディングとセルスペース属性を図で説明します

セル - 表の内容 セルの余白 (表の余白) (cellpadding) - セルの外側の距離を表し...

2級コンピュータ試験のMySQL知識ポイント mysql alterコマンド

テーブル構造を編集するための MySQL の alter コマンドの使用。具体的な内容は以下のとおり...

MySQL は制限を使用してページング例メソッドを実装します

1. 制限の基本的な実装一般的に、クライアントは、pageNo (ページ番号) と pageSize...

dig/nslookup コマンドを使用して DNS 解決手順を表示する方法

dig - DNS ルックアップ ユーティリティドメイン名のアクセス障害が発生した場合、ドメイン名の...

JavaScript 上級プログラミング: 変数とスコープ

目次1. 元の値と参照値2. インスタンス3. 範囲1. 元の値と参照値6 つの単純なデータ型の値は...

HTMLページ埋め込み動画とJSコントロール切り替え動画例の詳しい説明

まず、ページにビデオを埋め込むための HTML コードは次のとおりです。コードをコピーコードは次のと...

MySQLの一般クエリログとスロークエリログの分析

MySQL のログには、エラー ログ、バイナリ ログ、一般クエリ ログ、スロー クエリ ログなどが含...

XHTML の珍しいが便利なタグ

Xhtml には、あまり使用されないが非常に便利なタグが多数あります。半分の労力で 2 倍の結果を達...

VMware Workstation のインストール (Linux カーネル) Kylin グラフィック チュートリアル

この記事では、VMware WorkstationにKylinをインストールする方法を参考までに紹介...

Linuxアカウントファイル制御管理の詳細な手順

Linux システムでは、ユーザーが手動で作成したさまざまなアカウントに加えて、システムまたはプログ...

Vue における Vue.use() の原理と基本的な使用法

目次序文1. 例で理解する2. ソースコードを分析する3. まとめ要約する序文他の人のコンポーネント...

Vue カスタム箇条書きボックス効果 (確認ボックス、プロンプトボックス)

この記事の例では、参考のためにVueカスタムポップアップ効果の具体的なコードを共有しています。具体的...

ハードコーディングに別れを告げ、フロントエンドテーブルがインスタンスコードを自動的に計算できるようにします。

序文私のチームが税制モジュールを開発していたとき、計算問題、特にグリッド内の計算を解決するために時間...