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.
NGIN X-Unit ist ein Produkt, das am 8. September 2017 neu angekündigt wurde. Als sein Merkmal,
--NGINX Unit ist ein Anwendungsserver
Es scheint, dass es eine Funktion gibt. Im Allgemeinen scheinen Webdienste häufig eine dreischichtige Architektur zu haben.
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.
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?
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.
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.)
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 |
Detaillierte Daten werden in Repository als php.result, python.result, go.result abgelegt.
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 **.
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