Was passiert, wenn es einen Konflikt zwischen Lua-Regeln und der NGINX-Konfiguration gibt?
API7.ai
October 13, 2022
1. Der Name und die Sprache von OpenResty
F: Ich habe den Ursprung des Namens OpenResty bis jetzt nicht verstanden. Außerdem nutzt OpenResty die Lua-Sprache, warum also nicht andere Skriptsprachen? Zum Beispiel Shell, etc.
A: OpenResty began als ein Unternehmensprojekt von Yahoo!, das im Oktober 2007 startete. Der Name "Open" wurde von OpenAPI übernommen, und "Resty" wurde von rest API übernommen. Ursprünglich war OpenResty nicht als Webserver und Entwicklungsplattform gedacht, sondern als eine Anwendung wie eine Website.
Als OpenResty vor über einem Jahrzehnt open-source wurde, unterstützten nur sehr wenige Sprachen synchrones Nicht-Blocking. Selbst heute können nicht viele Backend-Sprachen dieses Leistungsniveau mit OpenResty erreichen. Derzeit nutzen mehr Entwickler OpenResty in API-Gateways und soft WAFs, was eine natürliche Wahl für Entwickler ist.
Was die Sprache betrifft, ist OpenResty nicht das einzige Projekt, das andere Entwicklungssprachen in NGINX einbettet. Zum Beispiel bettet NGINX offiziell JS ein; es gibt auch Open-Source-Projekte, die PHP in NGINX einbetten.
Typischerweise basiert die Wahl der zu nutzenden Sprache auf Faktoren wie Nebenläufigkeit, JIT und der Popularität der Sprache. Für OpenResty war Lua im Jahr 2007 tatsächlich die beste Wahl. OpenResty machte einen Umweg, indem es in seinen frühesten Versionen Perl statt Lua wählte.
2. Die Regelpriorität der Konfiguration
F: Wenn die Lua-Regeln in OpenResty mit der NGINX-Konfigurationsdatei in Konflikt stehen, zum Beispiel NGINX konfigurierte Rewrite-Regeln, und gleichzeitig auf rewrite_by_lua_file verwiesen wird, was ist dann die Priorität dieser beiden Regeln?
A: Tatsächlich hängt es davon ab, wie die NGINX-Konfigurations-Rewrite-Regel geschrieben ist, ob es ein break
oder last
ist, was in der offiziellen OpenResty-Dokumentation angegeben ist, mit einem Beispielcode:
location /foo {
rewrite ^ /bar;
rewrite_by_lua 'ngx.exit(503)';
}
location /bar {
...
}
In dieser Konfiguration des Beispielcodes wird ngx.exit(503)
nicht ausgeführt.
Wenn Sie es jedoch wie folgt schreiben, wird ngx.exit(503)
ausgeführt.
rewrite ^ /bar break.
Ich empfehle jedoch, OpenResty für Rewrite zu verwenden, anstatt die NGINX-Konfiguration. Um diese Mehrdeutigkeit zu vermeiden, ist viel NGINX-Konfiguration relativ obskur und erfordert, dass Sie die Dokumentation konsultieren, um sie wiederholt zu verstehen.
3. Warum gibt mein Code einen Fehler aus?
F: In der Tabellenfunktion der LuaJIT-Erweiterung, warum geben die folgenden beiden Codezeilen einen Fehler "moudule not found" aus, wenn sie von LuaJIT ausgeführt werden? Ich verwende LuaJIT Version 2.0.5.
local new_tab = require('table.new')
# oder
require('table.clear')
# Die Ausführung wird einen Fehler melden
luajit: table_luajit.lua:1: module 'table.new' not found:
A: Diese beiden Codezeilen erfordern LuaJIT Version 2.1, um ausgeführt zu werden, dokumentiert hier: https://github.com/LuaJIT/LuaJIT/blob/v2.1/doc/extensions.html#L218, Sie können es nachlesen.
Wie wir erwähnt haben, müssen Sie besonders darauf achten, wenn Sie OpenResty verwenden, das eine bestimmte Version von LuaJIT benötigt, um korrekt zu laufen. OpenResty basiert auf dem LuaJIT 2.1-Zweig und hat viele seiner Erweiterungen zu LuaJIT gemacht.
Wenn Sie also den Code in dieser Spalte ausführen, denken Sie daran, die offizielle OpenResty-Installation zu verwenden. Wenn Sie das lua-nginx-module
hinzufügen, um auf NGINX zu kompilieren, werden Sie immer noch in viele Fallen tappen!
4. Verwirrung über Nullwerte
F: Einige verwirrende Dinge, auf die ich gestoßen bin, sind ngx.null
, nil
, null
und ""
. Als ich im Web gesucht habe, habe ich gesehen, dass jemand sagte, null
sei eine Definition von ngx.null
. Wenn Redis zurückkehrt, wird oft bestimmt, ob das zurückgegebene Ergebnis null ist oder nicht, also mit welchem Wert wird es verglichen, wenn die Bestimmung gemacht wird? Gibt es noch andere Fallstricke bei der Verwendung dieser Werte? Ich verstehe diese Werte nicht klar.
A: Bevor ich Ihre Frage beantworte, schlage ich vor, dass Sie den folgenden Code verwenden, um einen Schlüssel in lua-resty-redis
zu finden.
local res, err = red:get("dog")
Dies liegt daran, dass Lua's nil nicht als Wert der Tabelle verwendet werden kann, daher führt OpenResty ngx.null
als Nullwert in der Tabelle ein.
Wir können ngx.null
und seinen Typ mit dem folgenden Code ausdrucken.
# drucke ngx.null
$ resty -e 'print(ngx.null)'
null
# Drucke den Typ
$ resty -e 'print(type(ngx.null))'
userdata
Wie Sie sehen können, ist ngx.null
nicht nil
, sondern vom Typ userdata
.
Darüber hinaus gibt es viele Nullwerte in OpenResty, wie cjson.null
, cdata``:NULL
und so weiter, die ich später besprechen werde.
Die einzigen falschen Werte in OpenResty sind nil
und false
. Wenn Sie also Code wie if not res then
schreiben, müssen Sie vorsichtig sein, und es ist besser, ihn in explizites if res ~= nil and res ~= false then
zu ändern, mit etwas wie diesem und mit entsprechender Testfallabdeckung.
5. Was genau ist das API-Gateway?
F: Was ist das API-Gateway, das im Artikel erwähnt wurde? Und NGINX, Tomcat, Apache und andere Webserver?
A: API-Gateway ist ein Gateway, das zur einheitlichen Verwaltung von Diensten verwendet wird. Zum Beispiel Zahlung, Benutzeranmeldung, etc., sind alle Dienste, die in Form von APIs bereitgestellt werden, und sie alle benötigen ein Gateway, um einheitliche Sicherheit und Authentifizierung zu gewährleisten.
API-Gateway kann das traditionelle NGINX, Apache ersetzen, um den Nord-Süd-Verkehr zu behandeln, aber auch in der Microservices-Umgebung den Ost-West-Verkehr zu behandeln, ist ein näher am Geschäft liegendes Middleware, anstatt der zugrunde liegende Web-Server.
Weitere Informationen über die Einführung und Implementierung des API-Gateways finden Sie unter Apache APISIX; Apache APISIX basiert auf der OpenResty-Implementierung.