Verwenden von nginx + fastcgi zum Implementieren eines Bilderkennungsservers

Verwenden von nginx + fastcgi zum Implementieren eines Bilderkennungsservers

Hintergrund

Ein spezielles Gerät wird verwendet, um Inferenzen auf dem Deep-Learning-Modell durchzuführen. Die Maschine bietet nur eine in C++ gekapselte API zum Laden, Starten und Ableiten des Modells. Caffe wird weiterhin zum Modelltraining verwendet. Das Modell muss in ein vom Gerät unterstütztes Format konvertiert werden. Die Konvertierung des Modells wird hier nicht vorgestellt. Um aus der Modellbegründung einen Dienst zu machen, mussten wir C++ verwenden, um einen HTTP-Dienst zu erstellen, sodass der Benutzer über den HTTP-Dienst ein Bild posten konnte, der Server die Modellbegründung startete, die Modellvorhersage implementierte und das Ergebnis an den Client zurückgab.

Gesamtrahmen

Der Serviceinhalt des Kurzdienstes besteht darin, die empfangenen Bilder vorzuverarbeiten und dann eine Modellinferenz durchzuführen. Was jetzt getan werden muss, ist die Einführung des HTTP-Dienstes

Voruntersuchung

Für einen C++-Neuling besteht die anfängliche Recherche natürlich darin, zuerst zu suchen. Die Ergebnisse der C++-Suchverarbeitung für HTTP-Server sind ebenfalls unterschiedlich. Einige zeigen Ihnen, wie Sie einen HTTP-Server implementieren, andere verwenden eine Bibliothek von Drittanbietern und wieder andere befassen sich direkt mit einer Menge Code. . . Ich habe das hier auf Stackoverflow gesehen:

Warum

nicht NGINX mit FCGI-Funktionszuordnung ausprobieren?

Implementierungsschritte

Nginx ist ein magisches Tool für Proxys und wird häufig zum Lastenausgleich verwendet. Solange der Inhalt meines Clients an Nginx gesendet wird und Nginx die Daten dann an fcgi-bezogene Anwendungen weiterleitet, muss ich fcgi nur mit meinem Argumentationsprogramm kombinieren.

nginx

Einfach ausgedrückt ist nginx der Mittelsmann. Der Kunde sendet die Anfrage an den Mittelsmann, der zur Warenquelle geht, um die Waren abzuholen, und dann dem Kunden antwortet:

Der Kunde teilt nginx mit, dass er ** Produkte kaufen möchte, und nginx geht zum entsprechenden Dienstanbieter, um den entsprechenden Dienst zu erhalten, und gibt ihn an den Kunden zurück.

Was wir jetzt müssen, ist die Implementierung des FCGI-Teils. Was ist also FCGI?

cgi

Common Gateway Interface (CGI) ist eine wichtige Internettechnologie, die es einem Client ermöglicht, Daten von einem Webbrowser an ein auf einem Netzwerkserver ausgeführtes Programm anzufordern. CGI beschreibt einen Standard für die Datenübertragung zwischen einem Server und einem Anforderungsverarbeitungsprogramm.

Die Standardeingabe und -ausgabe entsprechen hier einigen Umgebungsvariablen, die hauptsächlich drei Kategorien umfassen: anforderungsbezogene Umgebungsvariablen, serverbezogene Umgebungsvariablen und clientbezogene Umgebungsvariablen.

fastcgi

FastCGI ist eigentlich CGI mit einigen erweiterten Funktionen. Es ist eine Verbesserung von CGI. Es ist auch ein Standard zur Beschreibung der Datenübertragung zwischen Client- und Webserverprogrammen.

FastCGI zielt darauf ab, den Interaktionsaufwand zwischen Webservern und CGI-Programmen zu reduzieren, sodass Webserver mehr Webanforderungen gleichzeitig verarbeiten können. Im Gegensatz zu CGI, das für jede Web-Anforderung einen neuen Prozess erstellt, verwendet FastCGI persistente Prozesse zur Verarbeitung einer Reihe von Web-Anforderungen, die nicht vom Webserver, sondern vom FastCGI-Prozessmanager verwaltet werden.

Warum sagen wir, dass es die Kosten der Interaktion senkt? Hier kommt es auf den Unterschied zwischen den beiden Behandlungsmethoden an!

Der Workflow von CGI:

Wenn ein Client eine neue Anfrage sendet, muss zuerst ein CGI-Unterprozess erstellt werden. Nachdem CGI die Anfrage verarbeitet hat, werden so viele CGI-Unterprozesse gestartet, wie Verbindungen bestehen. Wenn die Anzahl der Anfragen groß ist, werden viele Systemressourcen belegt.

fastcgi

Fastcgi verwendet kontinuierliche Prozesse, um eine Reihe von Anfragen zu verarbeiten. Diese Prozesse werden vom Fastcgi-Prozessmanager verwaltet. Der spezifische Prozess ist wie folgt:

Man kann es auch so vergleichen:

cgi verkauft mit Eiern gefüllte Pfannkuchen. Wenn die Kunden essen möchten, zündet er das Feuer an, schlägt die Eier, breitet die Pfannkuchen aus und schaltet dann das Feuer aus. Dann warten Sie auf den nächsten Kunden

Fastcgi ist die alte Version eines Frühstücksladens. Dort ist eine Gruppe von Kellnern damit beschäftigt, Mahlzeiten zuzubereiten, die vor Ort gekocht werden müssen. Der Chef muss nur die Bestellungen arrangieren, und die Kellner sind für das Servieren von Haferbrei und Pfannkuchen verantwortlich.

Konkrete Schritte

  • Erstellen einer C++-Entwicklungsumgebung
  • Erstellen Sie nginx
  • Installieren Sie Fastcgi
  • Installieren Sie den Prozessmanager spawn-cgi von Fastcgi
  • Schreiben und Ausführen von Programmen
  • Kompilieren und ausführen

Wenn Sie Ihre Arbeit gut machen möchten, müssen Sie zuerst Ihre Werkzeuge schärfen und zuerst die Umgebung aufbauen!

Durch das Lesen vieler Blog-Inhalte habe ich die einfachsten Installationsschritte gefunden. Viele davon bestehen darin, den Quellcode herunterzuladen und ihn dann mit make zu kompilieren. Diese häufiger verwendeten Bibliotheken sind jedoch bereits in das Softwarepaket integriert.

Installation der C++-Entwicklungsumgebung

apt-get installiere Build-Essential

nginx

apt-get installiere nginx

fastcgi

sudo apt-get installiere libfcgi-dev

Spawn-FCGI

apt-get installiere spawn-fcgi

Schreiben und Ausführen von Programmen

#include <iostream>
#include "fcgio.h"
 
Namespace std verwenden;
 
int Haupt(void) {
 // Sichern Sie die stdio-Streambufs
 streambuf * cin_streambuf = cin.rdbuf();
 streambuf * cout_streambuf = cout.rdbuf();
 streambuf *cerr_streambuf = cerr.rdbuf();
 
 FCGX_Request-Anfrage;
 
 FCGX_Init();
 FCGX_InitRequest(&request, 0, 0);
 
 während (FCGX_Accept_r(&request) == 0) {
  fcgi_streambuf cin_fcgi_streambuf(Anfrage.in);
  fcgi_streambuf cout_fcgi_streambuf(Anfrage.out);
  fcgi_streambuf cerr_fcgi_streambuf(Anfrage.err);
 
  cin.rdbuf(&cin_fcgi_streambuf);
  cout.rdbuf(&cout_fcgi_streambuf);
  cerr.rdbuf(&cerr_fcgi_streambuf);
 
  cout << "Inhaltstyp: text/html\r\n"
    << "\r\n"
    << "<html>\n"
    << " <Kopf>\n"
    << " <title>Hallo Welt!</title>\n"
    << " </head>\n"
    << " <Text>\n"
    << " <h1>Hallo Welt!</h1>\n"
    << " </body>\n"
    << "</html>\n";
 
 }
 cin.rdbuf(cin_streambuf);
 cout.rdbuf(cout_streambuf);
 cerr.rdbuf(cerr_streambuf);
 gebe 0 zurück;

Kompilieren des Programms

g++ cgi.cpp -o cgidemo -lfcgi

Ändern Sie die Nginx-Konfigurationsdatei

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

Starten Sie nginx

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

Überprüfen Sie, ob nginx normal über den Browser gestartet wird: http://*******:80

Starten Sie den spwan-cgi-Prozess

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

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Konfigurieren Sie die Nginx+PHP5 FastCGI-Serverkonfiguration unter Ubuntu
  • Konfigurationsoptimierung von Nginx 0.7.x + PHP 5.2.6 (FastCGI) + MySQL 5.1 auf einem VPS-Server mit 128 MB kleinem Speicher
  • Nginx+PHP (FastCGI) erstellt einen hochparallelen WEB-Server (automatisches Installationsskript), zweite Ausgabe
  • Nginx0.5.33+PHP5.2.5 (FastCGI) erstellt einen Webserver, der 10-mal besser ist als Apache
  • Stellen Sie Nginx, PHP (einschließlich FastCGI) und virtuelle Hostkonfiguration in der CentOS 6.1-Umgebung bereit.
  • Beheben Sie den 502 Bad Gateway-Fehler, der bei Nginx + PHP (FastCGI) auftritt.
  • PATH_INFO-Problem mit Nginx (PHP/fastcgi)

<<:  Detaillierte Erläuterung der benutzerdefinierten Anweisungen zur Vue.js-Quellcodeanalyse

>>:  Analyse der gemeinsamen Indexfunktion von MySQL und Anwendungsbeispiele

Artikel empfehlen

Erfahren Sie in 3 Minuten, wie Sie den Supervisor Watchdog verwenden

Software- und Hardwareumgebung centos7.6.1810 64b...

7 coole dynamische Website-Designs zur Inspiration

Im Bereich Design gibt es jedes Jahr unterschiedl...

Detaillierte Erläuterung der Angular-Strukturdirektivenmodule und -Stile

Inhaltsverzeichnis 1. Strukturelle Anweisungen Mo...

Detailliertes Tutorial zum Aufbau eines lokalen Ideenaktivierungsservers

Vorwort Der Blogger verwendet die Idea IDE. Da di...

Beheben Sie den abnormalen Fehler beim Erstellen einer Vue-Umgebung mit Webpack

Inhaltsverzeichnis Konfigurieren Sie zuerst packa...

Umfassende Übersicht über die verschiedenen Abhörmethoden von Vue3.0

Inhaltsverzeichnis Hörer 1.Uhreneffekt 2.Uhr 1.1 ...

Detailliertes Tutorial zur Installation von Nginx 1.16.0 unter Linux

Da ich in letzter Zeit mit Linux herumgespielt ha...

Implementierungsbeispiel eines Videoplayers basierend auf Vue

Wenn der vorhandene Videoplayer die Anforderungen...

Confluence mit Docker bereitstellen

1. Umweltanforderungen 1. Docker 17 und höher wur...