Der neueste NGINX ist ein Anwendungsserver! ?? Ich habe den Benchmark von NGINX Unit mit PHP, Python, Go! !!

Was ist NGINX? ??

image.png

Ich werde kurz die Funktionen von NGINX erläutern.

Referenz: wikipedia nginx

In der Vergangenheit (obwohl vor langer Zeit) war Apache die stärkste Serverindustrie. Ich bin nicht sehr vertraut damit, aber als der Server billiger wurde, wurde das C10K-Problem ein heißes Thema in der Branche und wurde von Apache übernommen. Der früher verwendete Architektur-Server vom Typ Pre-Fork kann eine große Anzahl von Anforderungen nicht mehr verarbeiten. Unter diesen kann NGINX, das über eine ereignisgesteuerte Architektur verfügt, eine große Anzahl von Anfragen bearbeiten und scheint Aufmerksamkeit erregt zu haben. Daher empfängt NGINX den Anfang der Webdienstanforderung und kehrt ihn um. Es scheint, dass die Konfiguration oft genommen wird. Darüber hinaus müssen Websites wie Medien mit hoher Geschwindigkeit reagieren, und es gibt viele Merkmale, die als Inhalt statisch sind. Daher scheint NGINX möglicherweise übernommen zu werden.

Was ist NGINX-Unit? ??

NGIN X-Unit ist ein Produkt, das am 8. September 2017 neu angekündigt wurde. Als sein Merkmal,

--NGINX Unit ist ein Anwendungsserver

Quote: Der Anwendungsserver "NGINX Unit" ist jetzt als Open Source von NGINX verfügbar. Kompatibel mit PHP, Go und Python. Unterstützung für Java und Node.js

Es scheint, dass es eine Funktion gibt. Im Allgemeinen scheinen Webdienste häufig eine dreischichtige Architektur zu haben. image.png

Ein Server, der nur einfaches statisches HTML zurückgibt, wird im engeren Sinne als Webserver bezeichnet, und ein Server, der ein in PHP oder Python geschriebenes Programm ausführt und es an HTTP binden kann, wird als Anwendungsserver bezeichnet. Bis jetzt konnte ich so etwas wie "NGINX + Gunicorn + Python ausführen" ausführen. Streng genommen sind WSGI-Server (Anwendungsserver) wie Gunicorn und NGINX jedoch nur miteinander verbunden. In diesem Beispiel ersetzt die NGINX-Einheit das Gunicorn-Teil. Ich habe noch nie von der Funktion der Servereinstellung durch die RESTful-API auf anderen Servern gehört. Im Allgemeinen handelt es sich um ein Bild, in dem eine Einstellungsdatei in / etc / conf abgelegt und neu gestartet wird.

Umwelt vorbereiten

Wir haben mit der Entwicklungsumgebung fortgefahren und dabei die Weisheit unserer Vorgänger übernommen.

Ich habe versucht, PHP, Python, Golang auf NGINX Unit auszuführen

Meistens gemäß der offiziellen Dokumentation. Auch diesmal verwendet die Umgebung vorkompilierte Binärdateien unter Ubuntu.

$ wget http://nginx.org/keys/nginx_signing.key
$ sudo apt-key add nginx_signing.key

Fügen Sie den folgenden Text zu /etc/apt/sources.list hinzu

deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

Und installieren

$ sudo apt-get update
$ sudo apt-get install unit unit-dev

Starten Sie den Server

$ sudo service unitd start

Die Umfrage hat einige Zeit gedauert, aber ich denke, es ist relativ einfach, damit zu beginnen.

Übrigens habe ich mir auch die oben enthaltenen PHP- und Python-Versionen der NGINX-Einheit angesehen.

$ pwd
/usr/lib/unit/modules
$ ls
php.unit.so  python.unit.so

Es scheint, dass PHP und Python in / usr / lib / unit / modules enthalten sind. Dies

$ objdump -s php.unit.so  | less
$ objdump -s python.unit.so  | less

Ich habe den Binärdump visuell gelesen. als Ergebnis,

Es war eine Version wie diese. Wahrscheinlich, weil die offizielle Python von Ubuntu 16.04 immer noch 2.7-Serie ist. Wenn Sie ein Programm in der Python3-Serie schreiben möchten, haben Sie keine andere Wahl, als aus dem Quellcode zu erstellen?

Grundlegende Servereinstellungen

Dieses Mal werden der im Benchmark verwendete Code und die Einstellungsdatei im Repository vorbereitet.

https://github.com/kotauchisunsun/nginx_unit_bench

Das Einrichten des Servers ist sehr einfach.

$ sudo curl -X PUT -d @php_config.json  \
       --unix-socket /run/control.unit.sock http://localhost/

Wirf einfach json so ein und du kannst es einstellen, ohne den Server neu zu starten. Die Punkte, die in Ubuntu zu beachten sind, werden mit sudo und dem Socket mit /run/control.unit.sock geworfen. Außerdem funktioniert json im Repository nicht so wie es ist. Der Pfad des zu verschiebenden Quellcodes und der Pfad der Ausführungsdatei werden als absolute Pfade geschrieben. Schreiben Sie sie daher entsprechend um.

Benchmark

Die Benchmarking-Sprachen sind PHP, Python und Go. Die Anwendung selbst ist sehr einfach

--PHP ist "Hallo PHP World !!"

Es ist eine Anwendung, die nur ausgibt. ** Was ist die schnellste Brücke zwischen der NGINX-Einheit und der Programmiersprache, um sie so einfach wie möglich zu gestalten? Prüfen **.

Die für den Benchmark verwendete Software ist Apache Bench

Es ist jedoch ein benutzerfreundliches Lasttest-Tool, das ich verwendet habe. Der Befehl sieht so aus

$ ab -n 100000 -c 100 http://localhost:8100/ 

Senden Sie 100.000 Anfragen in 100 Parallelen. (Bench.sh im Repository ist das Ausführungsskript für das Benchmarking.)

Benchmark-Ergebnisse

Language min Response Time[ms] mean Respones Time[ms] max Response Time[ms] Request Per Second
PHP 6 99 1,414 1005.30
Python 65 141 1,916 708.99
Go 48 106 2,567 946.90

image.png

image.png

Detaillierte Daten werden in Repository als php.result, python.result, go.result abgelegt.

Erwägung

Dies mag ein enttäuschendes Ergebnis sein, aber ** die schnellste Sprache, die auf der NGINX-Einheit ausgeführt werden konnte, war PHP. ** Aus irgendeinem Grund verstehe ich. Es schaut auf den Code,

index.php


<?php
    echo "Hello PHP World!!";

wsgi.py


from flask import Flask

application = Flask(__name__)


@application.route("/")
def index():
    return "Hello Python World!!"

hello.go


package main

import (
	"fmt"
	"net/http"
	"unit"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello Go World!!")
	})
	unit.ListenAndServe(":8300", nil)
}

Es ist. Bei Python muss eine Anwendung im wsgi-Format erstellt werden. Daher ist es wichtig, die Flask- und wsgi-Module zu laden. Gleiches gilt für Go, und es ist wichtig, an ein Modul namens "unit" für NGINX Unit zu binden. Andererseits lädt PHP keine Bibliotheken. Persönlich dachte ich: "Binär laufen wäre am schnellsten." Das Go ist jedoch langsam. Und wenn man bedenkt, dass die minimale Antwortzeit von PHP mit 6 [ms] ungewöhnlich schnell ist, waren Python und Go zusammenfassend langsam und PHP am schnellsten, da das ** -Modul verwendet wurde. Sie können sehen, dass **.

Zusammenfassung

Das Ergebnis war. Schockierend war schließlich, dass "PHP am schnellsten war", aber ehrlich gesagt unterscheiden sich PHP und Go nicht so stark in der Leistung? Ich denke. Letztendlich wird Go schneller sein, wenn Sie die Logik erstellen. Ich denke. Ist Python dagegen etwas langsam? Das muss ich fühlen. Obwohl im obigen Benchmark nicht erwähnt, reagieren ** Go-Module möglicherweise nicht. ** Ich habe die Ursache nicht so sehr aufgespürt, aber während des Belastungstests

apr_socket_recv: Connection reset by peer (104)

Wurde ausgegeben und schlug mit einem Fehler fehl. Daher wurde der Benchmark insgesamt etwa dreimal wiederholt. Die NGINX-Einheit ist immer noch wie die Beta-Version, daher denke ich, dass dies passieren kann. Auf der anderen Seite finde ich es ausgezeichnet, dass Sie den Server mit der REST Full API einstellen können. Das ist fantastisch. Es war einfach, die Bank zu machen. Ich wollte jedoch, dass Sie sich ein bisschen mehr an die Herstellung von json halten. Wie Sie anhand des JSON für die Konfiguration im Repository sehen können, unterscheidet sich die Notation des Pfads für jede Sprache geringfügig. Ich bin süchtig danach, aber ich habe die API mit Curl getroffen, ohne es zu bemerken, aber die Fehlermeldung ist unfreundlich. Die Fehlermeldung sagte mir nicht, welcher Teil von json falsch war, also musste ich einen Blick auf die offizielle Dokumentation werfen, während ich selbst wie ein Teller aussah, was ein Schmerz war. Sobald Sie sich daran gewöhnt haben, kann NGINX Unit einfacher sein. Ich mag PHP nicht. Der Grund ist, dass Sie open_base_dir usw. in php.ini setzen müssen (und Sie sind oft süchtig danach), aber diese Seite kann vollständig ignoriert werden und Sie können den Quellcode eines beliebigen Pfades ausführen. Die Einstellung kann auch in einem Schuss mit json festgelegt werden, so dass es sehr einfach ist. Dies ist auch bei Python der Fall, und es ist ein sehr einfacher Eindruck, wenn Sie eine Einstellung in Betracht ziehen, während Sie eine unbekannte Einstellung wie Gunicorn oder Nginx halten. Da der Server nicht neu gestartet werden muss, ist die Entwicklung sehr einfach und Try & Error kann mit hoher Geschwindigkeit durchgeführt werden. Es mag immer noch schwierig sein, es in Produktion zu bringen, aber ich hatte das Gefühl, dass es einfacher wäre, Routing und Einstellungen zu handhaben, wenn es ein leichtes Produkt wie Hackason wäre, als einen in eine Sprache integrierten Server zu verwenden. Bitte fühle es.

Recommended Posts

Der neueste NGINX ist ein Anwendungsserver! ?? Ich habe den Benchmark von NGINX Unit mit PHP, Python, Go! !!
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Vom Anfangszustand von CentOS8 bis zum Ausführen von PHP Python Perl Ruby mit Nginx
Da der memory_profiler von Python schwer ist, habe ich ihn gemessen
Ich habe die Leistung von 1 Million Dokumenten mit mongoDB gemessen
Ich dachte darüber nach, warum Python selbst mit dem Gefühl eines Python-Interpreters notwendig ist
Ich habe mit Lambda eine App erstellt, die LINE über die Qiita-API über "Likes" informiert.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe die grundlegende Grammatik von Python in Jupyter Lab geschrieben
Ich habe die Strategie des Aktiensystemhandels mit Python evaluiert.
Lassen Sie uns Fusion 360 mit Python Part 11 ausführen. Da die API keinen Punkt auf dem Pfad enthält, habe ich mir eine Alternative überlegt
Ich möchte mit Python eine beliebige URL aus der Zeichenfolge der HTML-Quelle extrahieren
Ist die Umgebung ohne Server mehr als 600 Mal langsamer? ~ Ich habe Benchmarking mit Go, Node.js und Python versucht! ~
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Der 14. März ist der Tag des Umfangsverhältnisses. Die Geschichte der Berechnung des Umfangsverhältnisses mit Python
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich habe versucht, E-Mails vom Sakura-Server mit Flask-Mail zu senden
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich hatte Python satt und analysierte die Daten mit Nehan (Corona verwandt, ist das Wort jetzt?)
Ich habe versucht, die Liste der Drehzahlen des SSH-Anmeldeziels mit Python + openpyxl in einer Excel-Tabelle auszugeben.
Ich mochte den Tweet mit Python. ..
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Ein leicht verständlicher Vergleich der grundlegenden Grammatik von Python und Go
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ruft den Rückgabewert eines externen Shell-Skripts (ls) mit python3 ab
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Erläuterung zum Erstellen einer Anwendung zum Anzeigen von Bildern und Zeichnen mit Python
VS Code friert ein und der PC stürzt ab, wenn der Server mit go gestartet wird
Die Geschichte der Migration vom Heimserver (MariaDB + Java) auf AWS (DynamoDB + Python + PHP) mit reduzierten monatlichen Kosten
Python> set> Mit set () konvertieren> Wörterbuch wird nur Schlüssel> Ich habe gelernt, wie man die Werte des Wörterbuchs in set / dir ({}) / help ({}) / help ({}) konvertiert .Werte)
Ich bin ein Amateur am 14. Tag von Python, aber ich möchte maschinelles Lernen mit Scicit-Learn ausprobieren
Überprüfen Sie die Existenz der Datei mit Python
Ich kannte die Grundlagen von Python nicht
[Python] [Meta] Ist der Python-Typ ein Typ?
Die Python-Projektvorlage, an die ich denke.
Führen Sie den Python-WSGI-Server auf der NGINX-Einheit aus
Ich verglich die Geschwindigkeit von Go Language Web Framework Echo und Python Web Framework Flask
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich möchte Google Mail mit Python senden, kann dies jedoch aufgrund eines Fehlers nicht
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 2)
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 1)