Hintergrundeinführung
Während der Projektentwicklung speicherte ein von uns zuvor bearbeiteter Dienst die generierten Daten in Redis, und der Kunde erhielt die spezifischen Daten in Redis über einen bestimmten Schlüssel. In der vorherigen Entwicklung wurde die Nginx-WSGI-Python-Architekturlösung übernommen. Projekte können auch schnell über Python implementiert werden, und das Pushen in die Testumgebung ist im Einsatz.
Mit der Zeit dachte ich langsam über das Projekt nach und stellte fest, dass diese Implementierungsmethode auch gewisse Nachteile hatte. Da es keine komplizierte Logik für den Dienst gibt, empfängt Nginx die Anfrage und leitet sie an den Hintergrund-Python-Dienst weiter. Anschließend erhält der Python-Dienst die spezifische Anfrage, ruft die Daten von Redis ab und gibt sie zum Aufruf an den Client zurück. Der gesamte Prozess ist eigentlich relativ einfach und klar. Es besteht keine Notwendigkeit, eine weitere Ebene von Python-Diensten zwischen Nginx und Redis hinzuzufügen, daher denke ich darüber nach, ob die Implementierung dieser Architektur optimiert werden kann.
Nginx und Lua
Später, nach einer einfachen Suche nach Nginx Redis, fand ich einige Schlüsselwörter im Zusammenhang mit Nginx Lua Openresty. Der nächste Schritt besteht darin, mit der Recherche zu openresty zu beginnen. Bei der Durchsicht der relevanten Dokumente stellten wir fest, dass es sich bei Openresty um einen Projektsatz handelt, der Nginx-Kernmodule und verschiedene Module von Drittanbietern integriert. Wenn Sie openresty verwenden, vermeiden Sie die Installation verschiedener zusätzlicher Pakete von Drittanbietern, und diese werden alle in das Installationspaket übernommen. Dies ist definitiv eine gute Wahl für faule Leute.
Einführung in Lua
Lua ist eine Skriptsprache, auch bekannt als Leimsprache. Es handelt sich um eine sehr kleine Sprache, die leicht mit anderen Sprachen gekoppelt werden kann. Durch Luas eigene Eigenschaften, gepaart mit der Sprache, mit der es verbunden ist, ist die Verwendung der Eigenschaften zweier Sprachen in einem Dienst definitiv nicht so leistungsstark wie üblich. Ich habe einige großartige Spiele gesehen, die Lua als funktionale Sprache vom Typ „Kleber“ verwenden.
Bei einfacher Verwendung stellte ich jedoch fest, dass die String-Verarbeitung von Lua nicht leistungsstark genug ist, da sie direkt die C-Bibliothek verwendet und ihre String-Verarbeitung nur die von der C-Bibliothek bereitgestellte Schnittstelle ist, ohne die Schnittstelle zusätzlich anzureichern und zu ergänzen. In vielen Szenarien müssen Sie einige gängige Schnittstellen selbst implementieren, z. B. Split.
Lua und ngxin integrieren
Kann Lua direkt in Nginx gekoppelt werden, da Lua eine Klebersprache ist? Lua kann direkt in Nginx ausgeführt werden, um logische Verarbeitung und Protokollsteuerung durchzuführen. Dann können wir erwägen, mit Nginx Lua einen Webdienst zu entwickeln, der den Anforderungen entspricht und den Komfort und die schnelle Entwicklung bietet, die andere serverseitige Sprachen nicht bieten können.
Welche Vorteile bringt Nginx Lua zusätzlich zu der oben erwähnten Durchquerung:
1. Reduzieren Sie eine Weiterleitungsebene und verwenden Sie andere Dienstsprachen, um Dienste zu entwickeln. Es wird definitiv ein Protokoll für die direkte Kommunikation zwischen Nginx und dem Server verwendet. Wie CGI, FCIG, WSGI usw. Wenn Sie Lua verwenden, ist eine zusätzliche Nginx-Weiterleitung erforderlich, da Lua direkt in Nginx ausgeführt wird.
2. Ereignisbasierte Reaktion, da Lua eine Laufzeitumgebung ist, in der Nginx direkt ausgeführt wird, sodass Lua alle Funktionen von Nginx erbt. Unter normalen Umständen stellt Nginx Dienste basierend auf Ereignissen, Select oder Epoll bereit. Von der Leistung her wird es auf jeden Fall sehr beeindruckend sein.
Aus den oben genannten Gründen wurde Nginx Lua gestartet. Da faule Leute die gesamte Openresty-Installationsstrategie direkt übernehmen, können Sie Nginx natürlich auch separat installieren, dann Lua und dann nginx_lua_module installieren. Nach der Installation von openresty habe ich begonnen, einfache Tests zu schreiben. Tatsächlich gibt es auf dem Github von openresty einige einfache Testentwicklungen.
Nach Abschluss des ersten Installationsschritts und dem Schreiben von Testbeispielen zeigt Lua Nginx an, dass die Integration erfolgreich war, und der nächste Schritt besteht darin, eine eigene Geschäftslogik zu entwickeln. Hierbei ist zu beachten, dass Openresty tatsächlich Nginx integriert, sodass beim Ausführen von zwei Nginx auf einem Computer entsprechende Probleme auftreten können. Daher kann es nach der Installation von Openresty zu gewissen Auswirkungen auf den vorhandenen Nginx auf dem Computer kommen.
Aktualisieren Sie den ursprünglichen Dienst
Die Entwicklungsumgebung wurde konfiguriert. Der nächste Schritt besteht darin, die Geschäftslogik direkt zu entwickeln, dh die Anforderung zum Zugriff auf Redis zu empfangen, die Daten zu lesen und zurückzukehren der Kundenwunsch. Da Lua direkt in die Nginx-Konfigurationsdatei geschrieben werden kann, ist dies jedoch keine gute Strategie. Obwohl Lua direkt mit anderen Sprachen gekoppelt ist, muss der Grad der Kopplung auch softwaretechnische Aspekte berücksichtigen. Zum Beispiel die Wartbarkeit von späterem Code und die Lesbarkeit von Nginx-Konfigurationsdateien.
Aus den oben genannten Gründen wird außerdem empfohlen, die Funktionsimplementierung von Lua in eine separate Datei zu schreiben und sie dann in der Nginx-Konfigurationsdatei zu deklarieren, um Nginx anzuweisen, zu laden und auszuführen. Versuchen Sie bei der Implementierung von Funktionen, den Grad der Kopplung und Wartbarkeit des Codes zu vermeiden.
In der spezifischen Implementierung wird der gesamte Dienst von zwei Dateien verwaltet, da der Dienst selbst natürlich einfach ist.
-redis.conf #redis Host, Port
-init.lua #Initialisierungskonfigurationsdatei
Bei der Implementierung wird das Konzept des Shared Memory von Nginx genutzt.
<code><span>--redis.conf</span> host:<span>127.0</span><span>.0</span><span>.1</span> port:<span>6379</span><span>--init.lua</span> tmp = {} <span>for</span> l <span>in</span> io.<span>lines</span>(<span>"lua/redis.conf"</span>) <span>do</span><span>for</span> i <span>in</span><span>string</span>.gmatch(l, <span>"([^:]+)"</span>) <span>do</span> table.insert(tmp, i) <span><span>end</span></span><span><span>end</span></span> ngx.shared.config:<span>set</span>(tmp[<span>1</span>], tmp[<span>2</span>]) ngx.shared.config:<span>set</span>(tmp[<span>3</span>], tmp[<span>4</span>])</code>
Hier müssen wir redis.conf lesen, wenn Nginx startet, also müssen wir eine Konfiguration in Nginx hinzufügen, um Nginx mitzuteilen, dass init.lua beim Start ausgeführt werden muss. Darüber hinaus muss die Shared-Memory-Konfiguration von Nginx deklariert werden, sodass die Konfiguration von Nginx wie folgt lautet
<code>lu<span>a_shared</span>_dict config <span>1</span>m<span>;</span> init_by_lu<span>a_file</span> 'lua/init.lua'<span>;</span></code>
第一步已经完成,就是redis相关配置的读取,共享内存的声明和初始化,那接下来就是具体的逻辑实现,几十行代码分分钟搞定。
<code> location /vector{ content_by_lua ' <span>local</span> redis = require <span>"resty.redis"</span><span>local</span> server = redis:new() <span>local</span> conf = ngx.shared.config <span>local</span> ok, err = server:connect(conf:<span>get</span>(<span>"host"</span>), conf:<span>get</span>(<span>"port"</span>)) ngx.header.content_type = <span>"text/plain"</span><span>if</span><span>not</span> ok <span>then</span> ngx.<span>log</span>(ngx.ERR, err) ngx.<span>exit</span>(ngx.HTTP_SERVICE_UNAVAILABLE) <span>end</span><span>local</span> x = ngx.var.arg_x; <span>local</span> y = ngx.var.arg_y; <span>local</span> z = ngx.var.arg_z; <span>if</span> x == nil <span>or</span> y == nil <span>or</span> z == nil <span>then</span> ngx.<span>say</span>(<span>"{\\\"ret\\\": -1}"</span>) ngx.<span>exit</span>(ngx.HTTP_SERVICE_UNAVAILABLE) <span>end</span><span>local</span> key = z..<span>"_"</span>..x..<span>"_"</span>..y <span>local</span> data = server:<span>get</span>(key) '; }</code>
版权声明:本文为博主原创文章,转载请注明来源。
以上就介绍了nginx中集成lua开发web服务,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。