{"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 die Zusammenfassung des Vortrags von der Konferenz <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, die vom 7. bis 8. November letzten Jahres in Skolkovo bei Moskau stattfand. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Wladimir Protasow<\/a><\/noindex> berichtet, 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 m\u00f6chte ein wenig \u00fcber mich erz\u00e4hlen. Drei Viertel meines Lebens schreibe ich Code. Ich bin Programmierer durch und durch: manchmal sehe ich im Schlaf Code. Ein Viertel meines Lebens widme 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 problematisch die Situation war. Als ich noch ein kleiner Junior war, kam ich und erhielt solche zwei Terabyte gro\u00dfen Datenbanken. Heutzutage haben alle hier Highload. Ich ging zu Konferenzen und fragte: \u201eHey Leute, erz\u00e4hlt mir, ihr habt Big Data, das ist gro\u00dfartig? Wie gro\u00df sind eure Datenbanken?\u201c Sie antworteten: \u201eWir haben 100 Gigabyte!\u201c Ich dachte: \u201eCool, 100 Gigabyte!\u201c und versuchte, meine Miene zu wahren. Du denkst, ja, die Jungs sind beeindruckend, und dann kommst du zur\u00fcck und k\u00e4mpfst mit diesen Multi-Terabyte-Datenbanken. Und das, w\u00e4hrend ich noch ein Junior war. K\u00f6nnt ihr euch vorstellen, wie das gewesen w\u00e4re?<\/p>\n<p>Ich kenne mehr als 20 Programmiersprachen. Das ist etwas, womit ich mich w\u00e4hrend meiner Arbeit auseinandersetzen musste. Dir wird Code in Erlang, C, C++, Lua, Python, Ruby und anderen Sprachen gegeben, und du musst alles umsetzen. Insgesamt war es notwendig. Die genaue Anzahl habe ich nicht ermitteln k\u00f6nnen, aber irgendwo ist die Zahl von 20 verloren gegangen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDa alle Anwesenden wissen, was Parallels ist und was wir tun, werde ich nicht dar\u00fcber sprechen, wie gro\u00dfartig wir sind und was wir machen. Ich m\u00f6chte nur erw\u00e4hnen, dass wir 13 B\u00fcros weltweit haben, \u00fcber 300 Mitarbeiter und unsere Entwicklung in Moskau, Tallinn und Malta stattfindet. Wenn gew\u00fcnscht, kann man auch nach Malta ziehen, falls es im Winter zu kalt ist und man die R\u00fcckseite w\u00e4rmen m\u00f6chte.<\/p>\n<p>Speziell unsere Abteilung programmiert in Python 2. Wir sind im Gesch\u00e4ft und haben keine Zeit, modische Technologien zu implementieren, also leiden wir. Wir nutzen Django, weil es alles bietet und wir das \u00dcberfl\u00fcssige einfach weggelassen haben. Au\u00dferdem verwenden wir MySQL, Redis und NGINX. Und wir haben viele andere coole Dinge. Wir haben MongoDB, bei uns laufen Kaninchen herum, wir haben so ziemlich alles \u2014 aber das ist nicht mein Bereich, damit besch\u00e4ftige ich mich nicht.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nIch habe \u00fcber mich selbst gesprochen. Lassen Sie uns kl\u00e4ren, wor\u00fcber ich heute sprechen werde:<\/p>\n<ul>\n<li>Was ist OpenResty und wozu ben\u00f6tigt man das?<\/li>\n<li>Warum sollte man noch ein weiteres Rad erfinden, wenn wir Python, NodeJS, PHP, Go und andere gro\u00dfartige Technologien haben, mit denen alle zufrieden sind?<\/li>\n<li>Und ein paar Beispiele aus dem Leben. Ich musste meinen Vortrag stark k\u00fcrzen, weil er urspr\u00fcnglich 3,5 Stunden lang war, daher werden die Beispiele sp\u00e4rlich sein.<\/li>\n<\/ul>\n<p>\nOpenResty ist NGINX. Damit haben wir einen vollwertigen Webserver, der gut geschrieben ist und schnell arbeitet. Ich denke, die meisten von uns nutzen NGINX in der Produktion. Jeder von Ihnen wei\u00df, dass es schnell und gro\u00dfartig ist. Es bietet eine tolle synchrone Eingabe\/Ausgabe, deshalb m\u00fcssen wir nichts selbst entwickeln, so wie es in Python mit gevent gemacht wurde. Gevent ist gro\u00dfartig, aber wenn Sie C-Code schreiben und etwas schiefl\u00e4uft, werden Sie verr\u00fcckt beim Debuggen mit gevent. Ich hatte die Erfahrung: Es hat zwei ganze Tage gedauert, um herauszufinden, was da schiefgegangen ist. Wenn nicht jemand zuvor Wochen daran gearbeitet h\u00e4tte, das Problem gefunden, es im Internet dokumentiert und Google das entdeckt h\u00e4tte, w\u00e4ren wir komplett durchgedreht.<\/p>\n<p>NGINX verf\u00fcgt bereits \u00fcber Caching und statische Inhalte. Sie m\u00fcssen sich keine Gedanken dar\u00fcber machen, wie das richtig eingerichtet wird, damit nichts ins Stocken ger\u00e4t und Sie keine Deskriptoren verlieren. Nginx l\u00e4sst sich sehr einfach bereitstellen; Sie m\u00fcssen sich keine Gedanken machen, was Sie verwenden sollen \u2013 WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx wird installiert, den Admins \u00fcbergeben, die wissen, wie man damit umgeht. Nginx bearbeitet Anfragen strukturiert. Dar\u00fcber werde ich sp\u00e4ter noch ein wenig mehr erz\u00e4hlen. Kurz gesagt, es gibt eine Phase, in der es die Anfrage angenommen hat, eine, in der es verarbeitet hat, und eine, in der der Inhalt an den Benutzer geliefert wird.<\/p>\n<p>Nginx ist gro\u00dfartig, aber es gibt ein Problem: Es ist nicht flexibel genug, auch mit all den gro\u00dfartigen Funktionen, die in die Konfiguration integriert wurden, trotz der Anpassungsm\u00f6glichkeiten. Diese Leistung reicht nicht aus. Deshalb haben die Leute von Taobao vor etwa acht Jahren Lua eingebaut. 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 Performance-Overhead.<\/li>\n<li><strong>Geschwindigkeit<\/strong>. Der LuaJIT-Interpreter ist in vielen Situationen vergleichbar mit C, in einigen Aspekten \u00fcbertrifft er Java, in anderen liegt er zur\u00fcck. Eine Zeit lang galt er als state of the art, als der beeindruckendste JIT-Compiler. Heutzutage gibt es leistungsf\u00e4higere, aber sie sind sehr schwergewichtig, wie beispielsweise V8. Einige JS-Interpreter und der Java HotSpot sind an bestimmten Stellen schneller, verlieren aber in anderen immer noch.<\/li>\n<li><strong>Einfach zu erlernen<\/strong>. Wenn Sie beispielsweise eine Codebasis in Perl haben und nicht Booking sind, werden Sie keine Perl-Programmierer finden. Denn sie gibt es nicht mehr, sie sind alle weg, und sie zu schulen ist langwierig und kompliziert. Wenn Sie Programmierer in einer anderen Sprache wollen, m\u00fcssen diese m\u00f6glicherweise ebenfalls umgeschult oder gefunden werden. Bei Lua geht es einfach. Lua l\u00e4sst sich von jedem Junior in drei Tagen erlernen. Ich habe etwa zwei Stunden gebraucht, um mich einzuarbeiten. Nach zwei Stunden schrieb ich bereits Code f\u00fcr die Produktion. Etwa eine Woche sp\u00e4ter war er direkt in der Produktion.<\/li>\n<\/ul>\n<p>\nSo sieht das Endergebnis 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 zu entdecken. In OpenResty wurden viele Module zusammengefasst, sowohl eigene als auch von Engines. Und alles ist fertig \u2014 einfach deployen und es l\u00e4uft.<\/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? Dies ist ein endjinseitiger Standort. Wir machen uns keinen Stress, schreiben kein eigenes Routing und verwenden nichts Fertiges \u2013 wir haben bereits etwas in NGINX, wir leben gut und entspannt.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 das ist ein Block, der besagt, dass wir Inhalte mithilfe eines Lua-Skripts ausliefern. Wir nehmen die endjinseitige 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 Kunden aus.<\/p>\n<p>Das Ergebnis sieht so aus:<\/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 zur\u00fcck zur Realit\u00e4t. In der Produktion wird niemand Hello World bereitstellen. Unsere Anwendung greift normalerweise auf eine Datenbank oder \u00e4hnliches 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 \/>\nSie sitzt einfach da und wartet. Das ist nicht ideal. Wenn 100.000 Benutzer kommen, wird es sehr schwierig. Daher lass uns als Beispiel eine einfache Anwendung skizzieren. 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 \u201eK\u00e4tzchen\u201c sucht, finden wir f\u00fcr ihn Katzen, Flauschtiere und \u00e4hnliches. Zuerst m\u00fcssen wir die Anfragedaten im Backend erfassen. So sieht das 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 uns, die GET-Parameter abzurufen, ganz ohne Schwierigkeiten. Danach holen wir die Informationen, beispielsweise \u00fcber einen SQL-Befehl aus einer Datenbank mit einer Tabelle f\u00fcr das Schl\u00fcsselwort und die Erweiterung. Ganz einfach. So sieht das 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 <code>resty.mysql<\/code>, die bereits in unserem Paket enthalten ist, ein. Wir m\u00fcssen nichts installieren, alles ist bereit. Wir geben an, wie wir uns verbinden und f\u00fchren die SQL-Abfrage durch:<\/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 \/>\nHier wird es ein wenig gruselig, aber alles funktioniert. Hier zeigt die Zahl 10 das Limit an. Wir ziehen 10 Eintr\u00e4ge, wir sind faul und m\u00f6chten nicht mehr anzeigen. In SQL habe ich das Limit vergessen.<\/p>\n<p>Dann suchen wir die Bilder zu allen Anfragen. Wir sammeln eine Reihe von Anfragen und f\u00fcllen eine Lua-Tabelle, die <code>reqs<\/code>, genannt wird, und f\u00fchren <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 \/>\naus. Alle diese Anfragen laufen parallel und wir erhalten die Antworten. Die Arbeitszeit entspricht der Antwortzeit der langsamsten Anfrage. Wenn alle innerhalb von 50 Millisekunden antworten 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 m\u00f6chten, lassen wir NGINX alles f\u00fcr uns erledigen. Wie Sie gesehen haben, gab es eine Anfrage an <code>url\/fetch<\/code>, genau das:<\/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 einen einfachen <code>proxy_pass<\/code>, wir geben an, wo der Cache gespeichert werden soll, wie das funktioniert, und bei uns l\u00e4uft alles.<\/p>\n<p>Aber das reicht nicht, wir m\u00fcssen die Daten auch an den Benutzer zur\u00fcckgeben. Die einfachste Idee ist, alles in JSON zu serialisieren, ganz unkompliziert, in zwei Zeilen. Wir geben den Content-Type zur\u00fcck, wir geben JSON zur\u00fcck.<\/p>\n<p>Aber es gibt eine Schwierigkeit: Der Benutzer m\u00f6chte kein JSON lesen. Wir m\u00fcssen Frontend-Entwickler einbeziehen. Manchmal m\u00f6chten wir das anfangs nicht tun. Und die SEO-Spezialisten sagen, dass es ihnen egal ist, wenn wir nach Bildern suchen. Aber wenn wir bestimmten Content ausgeben, werden sie sagen, dass unsere Inhalte von den Suchmaschinen nicht indexiert werden.<\/p>\n<p>Was tun wir damit? Nat\u00fcrlich werden wir dem Benutzer HTML zur\u00fcckgeben. Manuell generieren ist nicht optimal, also m\u00f6chten wir Vorlagen 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 furchtbaren Buchstaben OPM gesehen. OpenResty kommt mit seinem eigenen Paketmanager, \u00fcber den man viele verschiedene Module installieren kann, darunter <code>lua-resty-template<\/code>. Dies ist eine einfache Template-Engine, die den Django-Templates \u00e4hnelt. Dort kann man Code schreiben und Variablen ersetzen.<\/p>\n<p>Am Ende 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 die Vorlage erneut in zwei Zeilen gerendert. Der Benutzer ist zufrieden, er hat K\u00e4tzchen bekommen. Da wir die Anfrage erweitert haben, hat er zus\u00e4tzlich ein See-Eichh\u00f6rnchen gefunden. Vielleicht hat er genau danach gesucht, konnte aber seine Anfrage nicht korrekt formulieren.<\/p>\n<p>Alles ist gro\u00dfartig, aber wir sind noch in der Entwicklungsphase und m\u00f6chten den Benutzern vorerst nichts zeigen. Lassen Sie uns eine Authentifizierung einrichten. Um dies zu tun, schauen wir uns an, wie NGINX die Anfrage im Kontext von OpenResty verarbeitet:<\/p>\n<ul>\n<li>Die erste Phase\u00a0\u2014 <strong>Access<\/strong>, wenn der Benutzer gerade gekommen ist und wir ihn anhand der Header, der IP-Adresse und anderer Daten analysiert haben. Wir k\u00f6nnen ihn sofort abweisen, wenn er uns nicht gef\u00e4llt. Dies kann zur Authentifizierung verwendet werden oder, falls wir eine gro\u00dfe Anzahl an Anfragen erhalten, k\u00f6nnen wir sie in dieser Phase leicht ablehnen.<\/li>\n<li><strong>rewrite<\/strong>. Wir schreiben einige Daten der Anfrage um.<\/li>\n<li><strong>content<\/strong>. Wir liefern den Inhalt an den Benutzer aus.<\/li>\n<li><strong>headers filter<\/strong>. Wir \u00e4ndern die Header der Antwort. Wenn wir verwendet haben <code>proxy_pass<\/code>, k\u00f6nnen wir einige Header umschreiben, bevor wir sie dem Benutzer zur\u00fcckgeben.<\/li>\n<li><strong>body filter<\/strong>. Wir k\u00f6nnen den Body \u00e4ndern.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 Protokollierung. Wir k\u00f6nnen 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 in den vorher beschriebenen <code>location<\/code>ein und integrieren dort diesen Code:<\/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. Nutzer sind schlau und k\u00f6nnten darauf kommen, das Cookie-Token zu setzen. Deshalb speichern wir es zus\u00e4tzlich 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. Dabei ist der Input\/Output, sowohl dort als auch hier, nicht blockierend. Wenn Sie synchronen Code schreiben, funktioniert es asynchron. Etwa 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 durchf\u00fchren:<\/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 geben an, dass wir den K\u00f6rper der Anfrage lesen m\u00fcssen. Wir erhalten die POST-Argumente und \u00fcberpr\u00fcfen, ob Benutzername und Passwort korrekt sind. Wenn sie falsch sind, leiten wir zur Authentifizierung weiter. Wenn sie richtig 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 geschieht ebenfalls in zwei Zeilen:<\/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, theoretisches Beispiel. Nat\u00fcrlich werden wir keinen Dienst erstellen, der den Menschen Katzenbilder zeigt. Obwohl, wer wei\u00df das schon. Lassen Sie uns daher durchgehen, was in der Produktion m\u00f6glich ist.<\/p>\n<ul>\n<li><strong>Minimalistisches Backend<\/strong>. Manchmal m\u00fcssen wir im Backend nur eine kleine Menge an Daten ausgeben: an manchen Stellen einen Datumswert einsetzen, an anderen Orten eine Liste anzeigen, sagen, wie viele Benutzer gerade auf der Website sind, einen Z\u00e4hler oder Statistiken anh\u00e4ngen. Etwas in dieser Art. Kleine Fragmente lassen sich sehr leicht umsetzen. Das geht schnell, unkompliziert und effizient.\n<\/li>\n<li><strong>Datenvorverarbeitung<\/strong>. Manchmal m\u00f6chten wir Werbung auf unserer Seite integrieren, und diese Werbung beziehen wir \u00fcber API-Anfragen. Das l\u00e4sst sich genau hier sehr einfach realisieren. Wir belasten unser Backend, das ohnehin schon stark beansprucht wird, nicht zus\u00e4tzlich. Stattdessen k\u00f6nnen wir die Informationen hier einsammeln. Wir k\u00f6nnen einige JS-Skripte zusammensetzen oder, im Gegenteil, etwas auftrennen und vorverarbeiten, bevor wir es dem Benutzer bereitstellen.\n<\/li>\n<li><strong>Fassade f\u00fcr Mikrodienste<\/strong>. Das ist ebenfalls ein sehr guter Anwendungsfall, den ich umgesetzt habe. Davor arbeitete ich bei der Firma Tenzor, die elektronische Berichterstattung anbietet und etwa die H\u00e4lfte der Unternehmen im Land unterst\u00fctzt. Wir haben einen Service entwickelt, bei dem viele Vorg\u00e4nge mithilfe desselben Mechanismus realisiert wurden: Routing, Authentifizierung und anderes.<br \/>\nOpenResty kann als Klebstoff f\u00fcr Ihre Mikrodienste verwendet werden, der einen einheitlichen Zugang zu allem und eine einheitliche Schnittstelle bietet. Da Mikrodienste so geschrieben werden k\u00f6nnen, dass Sie hier Node.js, dort PHP, hier Python und dort eine L\u00f6sung auf Erlang haben, verstehen wir, dass wir nicht den gleichen Code \u00fcberall neu schreiben m\u00f6chten. Daher kann OpenResty im Frontend eingesetzt werden.<\/p>\n<\/li>\n<li><strong>Statistik und Analytik<\/strong>. Normalerweise steht NGINX am Eingang, und alle Anfragen laufen \u00fcber ihn. Genau an dieser Stelle l\u00e4sst sich sehr gut sammeln. Man kann sofort etwas z\u00e4hlen und irgendwo hin senden, wie zum Beispiel an Elasticsearch, Logstash oder einfach in ein Protokoll schreiben und sp\u00e4ter woanders hin schicken.\n<\/li>\n<li><strong>Multiplayer-Systeme<\/strong>. Zum Beispiel lassen sich Online-Spiele ebenfalls sehr gut umsetzen. Heute wird Alexander Gladys in Kapstadt dar\u00fcber sprechen, wie man schnell ein Multiplayer-Spiel mit OpenResty prototypisiert.\n<\/li>\n<li><strong>Anfragefilterung (WAF)<\/strong>. Heutzutage ist es angesagt, verschiedene Web Application Firewalls einzurichten, und es gibt viele Dienste, die diese anbieten. Mit OpenResty k\u00f6nnen Sie sich eine Web Application Firewall erstellen, die Anfragen einfach und effizient nach Ihren Anforderungen filtert. Wenn Sie Python verwenden, wissen Sie, dass PHP Ihnen nicht injiziert werden kann, es sei denn, Sie spawnen es zuf\u00e4llig irgendwo aus der Konsole. Sie wissen, dass Sie MySQL und Python haben. Vielleicht versuchen sie hier, einen Directory Traversal durchzuf\u00fchren und irgendetwas in die Datenbank zu injizieren. Daher k\u00f6nnen Sie verd\u00e4chtige Anfragen schnell und kosteng\u00fcnstig gleich am Frontend filtern.\n<\/li>\n<li><strong>Gemeinschaft.<\/strong> Da OpenResty auf NGINX basiert, gibt es einen zus\u00e4tzlichen Vorteil \u2013 das <strong>NGINX-Community<\/strong>. Es ist sehr gro\u00df, und ein erheblicher Teil der Fragen, die Ihnen zun\u00e4chst in den Sinn kommen, wurde bereits von der NGINX-Community gel\u00f6st.\n<p><strong>Lua-Entwickler<\/strong>. Gestern sprach ich mit den Teilnehmern des HighLoad++-Schultages und h\u00f6rte, dass nur Tarantool in Lua geschrieben ist. Das ist nicht korrekt; es gibt viele Projekte in Lua. Beispiele sind: OpenResty, der XMPP-Server Prosody, die Spiel-Engine Love2D, Lua-Skripte in Warcraft und anderswo. Es gibt viele Lua-Entwickler, und die Community ist gro\u00df und hilfsbereit. Alle meine Fragen zu Lua wurden innerhalb weniger Stunden beantwortet. Wenn man in die Mailingliste schreibt, folgen innerhalb weniger Minuten zahlreiche Antworten, die alles erkl\u00e4ren. Das ist wirklich toll. Leider gibt es nicht \u00fcberall so eine freundliche Community.<br \/>\nF\u00fcr OpenResty gibt es ein GitHub-Repository, wo man ein Issue erstellen kann, falls etwas nicht funktioniert. Es gibt eine Mailingliste bei Google Groups, um allgemeine Fragen zu besprechen, und einen chinesischen Newsletter \u2013 falls Ihr Englisch nicht ausreicht, Sie aber Chinesisch sprechen.<\/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 komfortables Framework ist, das speziell f\u00fcr das Web entwickelt wurde.<\/li>\n<li>Es hat eine niedrige Einstiegsh\u00fcrde, da der Code \u00e4hnlich ist wie der, den wir verwenden, und die Sprache ist recht einfach und minimalistisch.<\/li>\n<li>Es bietet asynchrones I\/O ohne Callbacks, sodass wir nicht den un\u00fcbersichtlichen Code haben, den wir manchmal in NodeJS schreiben.<\/li>\n<li>Es l\u00e4sst sich einfach bereitstellen, da wir nur NGINX mit dem ben\u00f6tigten 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 erkl\u00e4rt, wie das Routing funktioniert, da das sehr langwierig geworden w\u00e4re.<\/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 Protasow \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 4.9.10 - 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 \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\" \/>\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) 4.9.10\" \/>\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 \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\" \/>\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 Zusammenfassung des Vortrags von der Konferenz HighLoad++ 2016, die am 7. und 8. November letzten Jahres im Moskauer Gebiet in Skolkowo stattfand. Wladimir Protasow erkl\u00e4rt, wie man die Funktionalit\u00e4t von NGINX mit OpenResty und Lua erweitert. Hallo zusammen, ich bin Wladimir Protasow, ich arbeite bei Parallels. Ich werde ein wenig \u00fcber mich erz\u00e4hlen. Drei Viertel meines Lebens schreibe ich Code. Ich wurde...","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 \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","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"},"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}]}}