{"id":71378,"date":"2020-02-25T20:45:02","date_gmt":"2020-02-25T17:45:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij"},"modified":"2020-03-03T16:14:21","modified_gmt":"2020-03-03T13:14:21","slug":"openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Wir ver\u00f6ffentlichen erneut das Protokoll des Vortrags von der Konferenz <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, die vom 7. bis 8. November des letzten Jahres in Skolkovo in der N\u00e4he von Moskau stattfand. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Wladimir Protasow<\/a><\/noindex> erkl\u00e4rt, wie man die Funktionalit\u00e4t von NGINX mit OpenResty und Lua erweitern kann.<\/em><\/p>\n<p>Hallo zusammen, ich hei\u00dfe Wladimir Protasow und arbeite bei Parallels. Ich erz\u00e4hle ein bisschen \u00fcber mich. Drei Viertel meines Lebens habe ich damit verbracht, Code zu schreiben. Ich bin Programmierer durch und durch: Manchmal tr\u00e4ume ich im Schlaf von Code. Das letzte Viertel meines Lebens widmete ich der industriellen Entwicklung, dem Schreiben von Code, der direkt in die Produktion geht. Der Code, den einige von Ihnen verwenden, ohne es zu wissen.<\/p>\n<p>Um zu verstehen, wie schlecht alles war. Als ich ein kleiner Junior war, kam ich und bekam solche zweiterabyte gro\u00dfen Datenbanken. Heute haben alle hier Highload. Ich ging zu Konferenzen und fragte: \u201eLeute, erz\u00e4hlt mir, ihr habt Big Data, das ist toll? Wie gro\u00df sind eure Datenbanken?\u201c Man antwortete mir: \u201eWir haben 100 Gigabyte!\u201c Ich sagte: \u201eCool, 100 Gigabyte!\u201c Aber innerlich dachte ich, wie ich meinen Pokerface bewahren k\u00f6nnte. Du denkst, ja, die Leute sind toll, und dann kommst du zur\u00fcck und k\u00e4mpfst mit diesen vielen Terabyte gro\u00dfen Datenbanken. Und das als Junior. K\u00f6nnt ihr euch vorstellen, wie hart das war?<\/p>\n<p>Ich kenne mehr als 20 Programmiersprachen. Das ist das, womit ich mich w\u00e4hrend meiner Arbeit auseinandersetzen musste. Du bekommst Code in Erlang, C, C++, Lua, Python, Ruby und was auch immer, und musst damit arbeiten. Insgesamt musste ich es schaffen. Eine genaue Anzahl konnte ich nicht feststellen, aber irgendwie habe ich die Zahl von 20 verloren.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDa alle Anwesenden wissen, was Parallels ist und womit wir besch\u00e4ftigt sind, werde ich nicht dar\u00fcber sprechen, wie toll wir sind und was wir tun. Ich sage nur, dass wir 13 B\u00fcros weltweit haben, \u00fcber 300 Mitarbeiter, Entwicklung in Moskau, Tallinn und Malta. Wenn man will, kann man nach Malta ziehen, wenn es im Winter kalt ist und man sich aufw\u00e4rmen m\u00f6chte.<\/p>\n<p>Konkret unser Team schreibt in Python 2. Wir sind im Gesch\u00e4ft t\u00e4tig und haben keine Zeit, moderne Technologien zu implementieren, deshalb leiden wir. Wir nutzen Django, weil es alles hat, und haben das \u00dcberfl\u00fcssige einfach weggelassen. Au\u00dferdem MySQL, Redis und NGINX. Dar\u00fcber hinaus haben wir viele andere coole Dinge. Wir haben MongoDB, wir haben Kaninchen, wir haben alles M\u00f6gliche \u2014 aber das geh\u00f6rt nicht zu meinem Bereich, und ich besch\u00e4ftige mich nicht damit.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nIch habe \u00fcber mich erz\u00e4hlt. Lassen Sie uns herausfinden, wor\u00fcber ich heute sprechen werde:<\/p>\n<ul>\n<li>Was ist OpenResty und wof\u00fcr wird es verwendet?<\/li>\n<li>Warum noch ein Fahrrad erfinden, wenn wir Python, NodeJS, PHP, Go und andere coole Sachen haben, mit denen alle zufrieden sind?<\/li>\n<li>Und ein paar Beispiele aus dem Leben. Ich musste meinen Vortrag stark k\u00fcrzen, da er auf 3,5 Stunden ausgeartet ist, daher werden die Beispiele sp\u00e4rlich sein.<\/li>\n<\/ul>\n<p>\nOpenResty ist NGINX. Dank ihm haben wir einen vollwertigen Webserver, der gut geschrieben ist und schnell arbeitet. Ich denke, die meisten von uns verwenden NGINX in der Produktion. Ihr wisst alle, dass es schnell und cool ist. Es bietet gro\u00dfartigen synchronen Input\/Output, sodass wir nichts neu erfinden m\u00fcssen, wie man es in Python mit gevent gemacht hat. Gevent ist cool und gro\u00dfartig, aber wenn ihr C-Code schreibt und etwas schiefgeht, werdet ihr mit gevent verr\u00fcckt beim Debuggen. Ich hatte die Erfahrung: Es hat zwei ganze Tage gedauert herauszufinden, was schiefgelaufen ist. Wenn vorher nicht jemand einige Wochen lang geforscht h\u00e4tte, das Problem gefunden und im Internet dar\u00fcber geschrieben h\u00e4tte und Google es nicht gefunden h\u00e4tte, w\u00e4ren wir total verzweifelt gewesen.<\/p>\n<p>In NGINX sind bereits Caching und statische Inhalte implementiert. Ihr m\u00fcsst euch keine Gedanken dar\u00fcber machen, wie das ordentlich geht, damit es nirgendwo hakt und ihr keine Deskriptoren verliert. Nginx l\u00e4sst sich sehr praktisch deployen, ihr m\u00fcsst nicht dar\u00fcber nachdenken, was ihr nehmen sollt \u2013 WSGI, PHP-FPM, Gunicorn oder Unicorn. Nginx installieren, den Admins \u00fcbergeben, sie wissen, wie man damit umgeht. Nginx verarbeitet Anfragen strukturiert. Dazu werde ich sp\u00e4ter etwas sagen. Kurz gesagt, es gibt eine Phase, in der es die Anfrage nur angenommen hat, eine, in der es die Anfrage bearbeitet hat, und eine, in der es den Inhalt an den Benutzer \u00fcbergeben hat.<\/p>\n<p>Nginx ist gro\u00dfartig, aber es gibt ein Problem: Es ist nicht flexibel genug, auch bei all den coolen Features, die die Leute in die Konfiguration gepackt haben, obwohl es viel anpassbar ist. Diese Kraft reicht nicht aus. Deshalb haben die Leute bei Taobao vor vielen Jahren, ich glaube vor acht Jahren, Lua integriert. Was bringt das?<\/p>\n<ul>\n<li><strong>Gr\u00f6\u00dfe<\/strong>. Es ist klein. LuaJIT hat einen Overhead von etwa 100-200 Kilobyte im Speicher und einen minimalen Overhead in der Leistung.<\/li>\n<li><strong>Geschwindigkeit<\/strong>. Der Interpreter LuaJIT ist in vielen Situationen nahe an C, in einigen Situationen schl\u00e4gt er Java und in anderen \u00fcberholt er sie. Eine Zeit lang galt er als State of the Art, der leistungsst\u00e4rkste JIT-Compiler. Jetzt gibt es leistungsst\u00e4rkere, aber sie sind sehr schwerf\u00e4llig, wie zum Beispiel V8. Einige JS-Interpreter und der Java HotSpot sind in bestimmten Punkten schneller, aber in anderen Bereichen verlieren sie immer noch.<\/li>\n<li><strong>Einfachheit beim Erlernen<\/strong>. Wenn Sie beispielsweise einen Codebestand in Perl haben und nicht Booking sind, werden Sie keine Perl-Programmierer finden. Denn die gibt es nicht, sie wurden alle weggenommen, und sie zu unterrichten ist langwierig und kompliziert. Wenn Sie Programmierer in etwas anderem wollen, m\u00fcssen diese m\u00f6glicherweise auch umgeschult oder gefunden werden. Bei Lua ist alles einfach. Ein Junior kann Lua in drei Tagen lernen. Ich habe etwa zwei Stunden gebraucht, um mich zurechtzufinden. Nach zwei Stunden habe ich bereits Produktionscode geschrieben. Nach ungef\u00e4hr einer Woche war es direkt in der Produktion.<\/li>\n<\/ul>\n<p>\nDas Ergebnis sieht so aus:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nHier gibt es viel. In OpenResty wurden eine Menge Module gesammelt, sowohl Lua- als auch Engine-Module. Und Sie haben alles bereit \u2013 einfach deployen und es funktioniert.<\/p>\n<h1>Beispiele<\/h1>\n<p>\nGenug der Lyrik, kommen wir zum Code. Hier ist ein kleines Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWas gibt es hier? Das ist ein engine-standort. Wir m\u00fcssen uns keine Gedanken \u00fcber Routing machen, wir nehmen kein fertiges \u2013 wir haben bereits etwas in NGINX, wir leben gut und bequem.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 das ist ein Block, der sagt, dass wir Inhalte mit einem Lua-Skript bereitstellen. Wir nehmen die engine-Variable <code>remote_addr<\/code> und stecken sie in <code>string.format<\/code>. Das ist dasselbe wie <code>sprintf<\/code>, nur auf Lua, nur richtig. Und wir geben es dem Clienten.<\/p>\n<p>Das Ergebnis wird so aussehen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAber kehren wir in die reale Welt zur\u00fcck. In der Produktion wird niemand Hello World deployen. Unsere Anwendung greift normalerweise auf eine Datenbank oder woanders zu und wartet die meiste Zeit auf eine Antwort.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs sitzt einfach da und wartet. Das ist nicht besonders gut. Wenn 100.000 Benutzer kommen, wird es sehr schwierig. Daher lassen Sie uns als Beispiel eine einfache Anwendung aufbauen. Wir werden nach Bildern suchen, zum Beispiel von Katzen. Aber wir werden nicht einfach so suchen, wir werden die Schl\u00fcsselw\u00f6rter erweitern, und wenn der Benutzer nach \"K\u00e4tzchen\" sucht, werden wir ihm Katzen, Flauschige und \u00c4hnliches finden. Zuerst m\u00fcssen wir die Anfrage-Daten im Backend erhalten. Das sieht so aus:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nZwei Zeilen erm\u00f6glichen es Ihnen, die GET-Parameter abzurufen, keine Schwierigkeiten. Dann bekommen wir, sagen wir mal, aus der Datenbank mit einer Tabelle f\u00fcr Schl\u00fcsselw\u00f6rter und Erweiterungen diese Informationen mit einer gew\u00f6hnlichen SQL-Abfrage. Es ist ganz einfach. Das sieht so aus:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir binden die Bibliothek ein <code>resty.mysql<\/code>, die bereits in unserem Paket enthalten ist. Wir m\u00fcssen nichts installieren, alles ist bereit. Wir geben an, wie wir uns verbinden, und machen die SQL-Abfrage:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nEs ist ein bisschen gruselig hier, aber alles funktioniert. Hier ist 10 \u2013 das ist das Limit. Wir ziehen 10 Eintr\u00e4ge heraus, wir sind faul und wollen nicht mehr anzeigen. In SQL habe ich das Limit vergessen.<\/p>\n<p>Dann finden wir Bilder zu allen Anfragen. Wir sammeln eine Menge Anfragen und f\u00fcllen eine Lua-Tabelle aus, die hei\u00dft <code>reqs<\/code>, und machen <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlle diese Anfragen laufen parallel ab und wir bekommen die Antworten zur\u00fcck. Die Arbeitszeit ist gleich der Antwortzeit des langsamsten. Wenn alles innerhalb von 50 Millisekunden abl\u00e4uft und wir hundert Anfragen gesendet haben, kommt die Antwort nach 50 Millisekunden.<\/p>\n<p>Da wir faul sind und keine HTTP-Verarbeitung und Caching schreiben wollen, lassen wir NGINX alles f\u00fcr uns erledigen. Wie Sie gesehen haben, gab es eine Anfrage an <code>url\/fetch<\/code>, hier ist sie:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nWir machen eine einfache <code>proxy_pass<\/code>, geben an, wo wir cachen wollen, wie das gemacht wird, und alles funktioniert.<\/p>\n<p>Aber das reicht nicht, wir m\u00fcssen auch die Daten an den Benutzer zur\u00fcckgeben. Die einfachste Idee ist, alles in JSON zu serialisieren, ganz einfach, in zwei Zeilen. Wir geben den Content-Type an und geben JSON zur\u00fcck.<\/p>\n<p>Aber es gibt eine Schwierigkeit: Der Benutzer m\u00f6chte kein JSON lesen. Wir m\u00fcssen Frontend-Entwickler anziehen. Manchmal haben wir anfangs keine Lust dazu. Und die SEOs werden sagen, dass es ihnen egal ist, wenn wir Bilder suchen. Aber wenn wir ihnen irgendwelche Inhalte liefern, werden sie sagen, dass unsere Suchmaschinen nichts indexieren.<\/p>\n<p>Was tun wir damit? Nat\u00fcrlich werden wir dem Benutzer HTML zur\u00fcckgeben. Es w\u00e4re nicht klug, alles manuell zu generieren, also wollen wir Templates verwenden. Daf\u00fcr gibt es die Bibliothek <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSie haben wahrscheinlich die drei gruseligen Buchstaben OPM gesehen. OpenResty kommt mit einem eigenen Paketmanager, \u00fcber den man viele verschiedene Module installieren kann, darunter <code>lua-resty-template<\/code>. Es ist eine einfache Template-Engine, die \u00e4hnlich wie Django-Templates ist. Dort kann man Code schreiben und Variablen einsetzen.<\/p>\n<p>Infolgedessen wird alles ungef\u00e4hr so aussehen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nWir haben die Daten genommen und das Template ebenfalls in zwei Zeilen gerendert. Der Benutzer ist gl\u00fccklich und hat Katzen bekommen. Da wir die Anfrage erweitert haben, hat er auch eine Seehund bekommen. Wer wei\u00df, vielleicht hat er genau danach gesucht, konnte aber seine Anfrage nicht richtig formulieren.<\/p>\n<p>Alles toll, aber wir sind im Development und wollen es den Benutzern noch nicht zeigen. Lass uns eine Authentifizierung einrichten. Um das zu tun, schauen wir uns an, wie NGINX die Anfrage in Bezug auf OpenResty verarbeitet:<\/p>\n<ul>\n<li>Die erste Phase ist <strong>-Token und<\/strong>, wenn der Benutzer neu eingetroffen ist und wir ihn anhand von Kopfzeilen, IP-Adresse und weiteren Daten betrachtet haben. Wir k\u00f6nnen ihn sofort abweisen, falls er uns nicht gef\u00e4llt. Dies kann f\u00fcr die Authentifizierung verwendet werden, oder wenn wir sehr viele Anfragen erhalten, k\u00f6nnen wir sie in dieser Phase einfach abweisen.<\/li>\n<li><strong>rewrite<\/strong>. Wir schreiben einige Anfragedaten um.<\/li>\n<li><strong>f\u00fcr Inhalte mit Bildern (alternativer Text<\/strong>. Wir geben den Inhalt an den Benutzer zur\u00fcck.<\/li>\n<li><strong>headers filter<\/strong>. Wir ersetzen die Antwortk\u00f6pfe. Wenn wir <code>proxy_pass<\/code>, k\u00f6nnen wir einige Kopfzeilen umschreiben, bevor wir sie an den Benutzer ausgeben.<\/li>\n<li><strong>body filter<\/strong>. Wir k\u00f6nnen den Inhalt des K\u00f6rpers \u00e4ndern.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 Protokollierung. Man kann Protokolle in Elasticsearch ohne zus\u00e4tzliche Schicht schreiben.<\/li>\n<\/ul>\n<p>\nUnsere Authentifizierung wird ungef\u00e4hr so aussehen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nWir f\u00fcgen dies zu dem <code>Standort<\/code>, das wir zuvor beschrieben haben, hinzu und packen diesen Code hinein:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nWir pr\u00fcfen, ob wir ein Cookie-Token haben. Wenn nicht, leiten wir zur Authentifizierung weiter. Benutzer sind schlau und k\u00f6nnen erraten, dass sie ein Cookie-Token setzen m\u00fcssen. Daher speichern wir es auch in Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDer Code zur Arbeit mit Redis ist sehr einfach und unterscheidet sich nicht von anderen Sprachen. Auch die gesamte Ein-\/Ausgabe ist nicht blockierend. Wenn Sie synchronen Code schreiben, funktioniert es asynchron. \u00c4hnlich wie bei gevent, nur gut umgesetzt.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLassen Sie uns die Authentifizierung selbst erstellen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nWir sagen, dass wir den K\u00f6rper der Anfrage lesen m\u00fcssen. Wir erhalten POST-Parameter und \u00fcberpr\u00fcfen, ob Benutzername und Passwort korrekt sind. Wenn sie falsch sind, leiten wir zur Authentifizierung weiter. Wenn sie correct sind, speichern wir das Token in Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVergessen Sie nicht, das Cookie zu setzen, das wird auch in zwei Zeilen gemacht:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX in einen vollwertigen Anwendungsserver verwandeln\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDies ist ein einfaches, hypothetisches Beispiel. Nat\u00fcrlich werden wir keinen Dienst erstellen, der Katzenbilder anzeigt. Aber wer wei\u00df schon. Deshalb lassen Sie uns betrachten, was wir in der Produktion tun k\u00f6nnen.<\/p>\n<ul>\n<li><strong>Minimalistisches Backend<\/strong>. Manchmal m\u00fcssen wir dem Backend nur sehr wenige Daten bereitstellen: irgendwo ein Datum einsetzen, irgendwo eine Liste ausgeben, sagen, wie viele Benutzer gerade auf der Website sind, einen Z\u00e4hler oder Statistiken einf\u00fcgen. Etwas Kleines. Minimale Teile k\u00f6nnen sehr einfach gemacht werden. Das geht schnell, einfach und gut.\n<\/li>\n<li><strong>Datenvorverarbeitung<\/strong>. Manchmal wollen wir Werbung auf unsere Seite einf\u00fcgen, und diese Werbung holen wir \u00fcber API-Anfragen. Das l\u00e4sst sich hier sehr leicht umsetzen. Wir belasten nicht unseren Backend, der ohnehin schon schwer arbeitet. Man kann es hier zusammenstellen. Wir k\u00f6nnen einige JS-Skripte anpassen oder, umgekehrt, etwas auseinandernehmen, was preprocessieren, bevor wir es dem Benutzer zur\u00fcckgeben.\n<\/li>\n<li><strong>Frontend f\u00fcr Microservices<\/strong>. Das ist auch ein sehr gutes Beispiel, das ich umgesetzt habe. Zuvor habe ich in der Firma Tenzor gearbeitet, die sich mit elektronischer Berichterstattung besch\u00e4ftigt und etwa die H\u00e4lfte der juristischen Personen im Land mit Berichten versorgt. Wir haben einen Service erstellt, bei dem viele Dinge mithilfe des gleichen Mechanismus realisiert wurden: Routing, Autorisierung und mehr.<br \/>\nOpenResty kann als Kleber f\u00fcr Ihre Microservices dienen, der einen einheitlichen Zugang zu allem und eine einheitliche Schnittstelle gew\u00e4hrleistet. Da Microservices in so unterschiedlichen Technologien geschrieben sein k\u00f6nnen, wie hier Node.js, hier PHP, hier Python und hier etwas auf Erlang, wissen wir, dass wir nicht denselben Code \u00fcberall umschreiben m\u00f6chten. Daher kann OpenResty im Frontend eingesetzt werden.<\/p>\n<\/li>\n<li><strong>Statistik und Analytik<\/strong>. \u00dcblicherweise steht NGINX am Eingang, und alle Anfragen laufen dar\u00fcber. An diesem Punkt l\u00e4sst sich sehr bequem alles zusammenfassen. Man kann etwas sofort berechnen und irgendwohin weiterleiten, zum Beispiel an Elasticsearch, Logstash oder einfach in ein Log schreiben und sp\u00e4ter woandershin senden.\n<\/li>\n<li><strong>Mehrbenutzersysteme<\/strong>. Zum Beispiel lassen sich Online-Spiele sehr gut umsetzen. Heute wird Alexander Gladys in Kapstadt dar\u00fcber sprechen, wie man ein Mehrbenutzerspiel schnell mit OpenResty prototypisieren kann.\n<\/li>\n<li><strong>Anfragen filtern (WAF)<\/strong>. Derzeit ist es angesagt, verschiedene Web Application Firewalls zu erstellen; es gibt viele Dienste, die diese anbieten. Mit OpenResty kann man sich eine Web Application Firewall bauen, die einfach und problemlos Anfragen nach Ihren Anforderungen filtert. Wenn Sie mit Python arbeiten, wissen Sie, dass PHP Ihnen nicht injiziert wird, es sei denn, Sie starten es aus der Konsole irgendwo. Sie wissen, dass Sie MySQL und Python haben. Wahrscheinlich k\u00f6nnten hier Versuche unternommen werden, eine Directory Traversal durchzuf\u00fchren und etwas in die Datenbank zu injizieren. Daher kann man verd\u00e4chtige Anfragen schnell und kosteng\u00fcnstig gleich im Frontend filtern.\n<\/li>\n<li><strong>Gemeinschaft.<\/strong> Da OpenResty auf NGINX basiert, hat es den Bonus \u2013 das ist <strong>NGINX-Community<\/strong>. Es ist sehr gro\u00df, und ein erheblicher Teil der Fragen, die Sie anfangs haben werden, wurde bereits von der NGINX-Community gel\u00f6st.\n<p><strong>Lua-Entwickler<\/strong>. Gestern habe ich mich mit den Leuten unterhalten, die zu dem Schulungstag HighLoad++ gekommen sind und habe geh\u00f6rt, dass nur Tarantool in Lua geschrieben ist. Das ist nicht richtig, in Lua ist eine Menge geschrieben. Beispiele: OpenResty, der XMPP-Server Prosody, die Spiele-Engine Love2D, Lua-Skripte in Warcraft und anderen Orten. Es gibt sehr viele Lua-Entwickler, sie haben eine gro\u00dfe und hilfsbereite Community. Alle meine Fragen zu Lua wurden innerhalb weniger Stunden gekl\u00e4rt. Wenn man in die Mailingliste schreibt, hat man buchst\u00e4blich nach wenigen Minuten schon eine Menge Antworten, die genau erkl\u00e4ren, was und wie, was was ist. Das ist wirklich gro\u00dfartig. Leider gibt es nicht \u00fcberall eine so freundliche Community.<br \/>\nZu OpenResty gibt es GitHub, dort kann man ein Issue erstellen, wenn etwas kaputt ist. Es gibt eine Mailingliste auf Google Groups, wo man allgemeine Fragen diskutieren kann, es gibt eine Liste auf Chinesisch \u2014 falls Sie vielleicht kein Englisch sprechen, aber Chinesischkenntnisse haben.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Ergebnisse<\/h1>\n<p><\/p>\n<ul>\n<li>Ich hoffe, ich konnte vermitteln, dass OpenResty ein sehr praktisches Framework ist, das f\u00fcr das Web optimiert ist.<\/li>\n<li>Es hat eine niedrige Einstiegsh\u00fcrde, da der Code \u00e4hnlich ist wie der, den wir verwenden, die Sprache relativ einfach und minimalistisch ist.<\/li>\n<li>Es bietet asynchrones I\/O ohne Callbacks, wir haben keine 'Nudeln', wie wir das manchmal in NodeJS machen k\u00f6nnen.<\/li>\n<li>Es hat ein einfaches Deployment, da wir nur NGINX mit dem entsprechenden Modul und unseren Code ben\u00f6tigen, und alles funktioniert sofort.<\/li>\n<li>Eine gro\u00dfe und hilfsbereite Community.<\/li>\n<\/ul>\n<p>\nIch habe nicht im Detail erz\u00e4hlt, wie das Routing funktioniert, das w\u00e4re eine sehr lange Geschichte geworden.<\/p>\n<p>Vielen Dank f\u00fcr Ihre Aufmerksamkeit!<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"silrEB0Brvo\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/silrEB0Brvo\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<em><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2016\/abstracts\/2432.html\">Wladimir Protasov \u2014 OpenResty: Wir verwandeln NGINX in einen vollwertigen Anwendungsserver<\/a><\/noindex><\/em><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/321864\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0441 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 HighLoad++ 2016, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 \u043f\u043e\u0434\u043c\u043e\u0441\u043a\u043e\u0432\u043d\u043e\u043c \u0421\u043a\u043e\u043b\u043a\u043e\u0432\u043e 7\u20148 \u043d\u043e\u044f\u0431\u0440\u044f \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430. \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u0440\u043e\u0442\u0430\u0441\u043e\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OpenResty \u0438 Lua. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u0440\u043e\u0442\u0430\u0441\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 Parallels. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043e \u0441\u0435\u0431\u0435. \u0422\u0440\u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0438\u0448\u0443 \u043a\u043e\u0434. \u0421\u0442\u0430\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71379,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71378","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47OpenResty: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c NGINX \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-25T17:45:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47OpenResty: Wir verwandeln NGINX in einen vollwertigen Anwendungsserver | ProHoster","description":"Wir ver\u00f6ffentlichen erneut die Transkription.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47OpenResty: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c NGINX \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 | ProHoster","og:description":"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-25T17:45:02+00:00","article:modified_time":"2020-03-03T13:14:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71378","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:03:22","updated":"2022-09-30 08:39:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}