Stellen Sie Ihren Nginx zusammen

Hallo!
Mein Name ist Sergey, ich arbeite als Infrastrukturingenieur im API-Team der Plattform tinkoff.ru.

In diesem Artikel werde ich über die Probleme sprechen, mit denen unser Team bei der Vorbereitung von Nginx- basierten Balancern für verschiedene Projekte konfrontiert war. Ich werde auch über das Werkzeug sprechen, mit dem ich die meisten von ihnen überwinden konnte.

Nginx ist ein multifunktionaler und sich aktiv entwickelnder Proxyserver. Es hat eine große Anzahl von Modulen, aber dies ist keine vollständige Liste . Jedes Projekt stellt bestimmte Anforderungen an die Funktionalität des Balancers und der Nginx-Version (z. B. das Vorhandensein von http / 2 und Proxy-Grpc) sowie an die Zusammensetzung seiner Module.

Wir möchten die neueste Version mit den richtigen Modulen sehen, die unter einer bestimmten Linux-Distribution funktionieren. In unserem Fall handelt es sich um deb- und rpm-basierte Systeme. Die Containeroption wird in diesem Artikel nicht berücksichtigt.

Wir möchten die Funktionalität unserer Balancer schnell ändern. Und hier stellt sich sofort die Frage: Wie kann dies erreicht werden, indem so wenig Ressourcen wie möglich ausgegeben werden? Und es wäre besser, den Prozess so einzurichten, dass wir eine endliche Anzahl von Eingabeparametern festlegen und am Ausgang ein Artefakt in Form eines deb / rpm-Pakets für das gewünschte Betriebssystem erhalten können.

Infolgedessen kann eine Reihe von Problemen formuliert werden:

  • Es gibt nicht immer Pakete mit der neuesten Version von Nginx.
  • Es gibt keine Pakete mit den richtigen Modulen.
  • Das manuelle Kompilieren und Zusammenstellen eines Pakets nimmt viel Zeit in Anspruch und ist einfach mühsam.
  • Es gibt keine Beschreibung, wie eine bestimmte Nginx-Instanz erstellt wird.

Um diese Probleme zu lösen, muss ein bestimmtes Tool eine Spezifikation in einem für Menschen lesbaren Format akzeptieren und das Nginx-Paket mit den erforderlichen Funktionen sammeln.

Nachdem wir in der Weite des Githubs keine geeignete Option für uns gefunden hatten, beschlossen wir, unser eigenes Tool zu erstellen - den Nginx -Builder .

Technische Daten


In unserem Tool wollten wir eine Spezifikationsbeschreibung in Form von Code erstellen, die dann in das Git-Repository gestellt werden kann. Dazu haben wir das übliche Format für solche Dinge gewählt - yaml. Spezifikationsbeispiel:

nginx_version: 1.14.1 output_package: deb modules: - module: name: nginx-auth-ldap git_url: https://github.com/kvspb/nginx-auth-ldap.git git_branch: master dependencies: - libldap2-dev - module: name: ngx_http_substitutions_filter_module git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git - module: name: headers-more-nginx-module web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip - module: name: nginx-module-vts git_url: https://github.com/vozlt/nginx-module-vts.git git_tag: v0.1.18 - module: name: ngx_devel_kit git_url: https://github.com/simplresty/ngx_devel_kit.git git_tag: v0.3.0 - module: name: ngx_cache_purge git_url: https://github.com/FRiCKLE/ngx_cache_purge.git - module: name: ngx_http_dyups_module git_url: https://github.com/yzprofile/ngx_http_dyups_module.git - module: name: nginx-brotli git_url: https://github.com/eustas/ngx_brotli.git git_tag: v0.1.2 - module: name: nginx_upstream_check_module git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git - module: name: njs git_url: https://github.com/nginx/njs.git git_tag: 0.2.5 config_folder_path: nginx 

Hier geben wir an, dass wir ein Deb-Paket mit Nginx Version 1.14.2 mit dem gewünschten Satz von Modulen sehen möchten. Abschnitt mit Modulen ist optional. Für jeden von ihnen können Sie einstellen:

  • Name.
  • Adresse, wo Sie es bekommen können:
    • Git-Repository. Sie können auch einen Zweig oder ein Tag angeben.
    • Weblink zum Archiv.
    • Lokaler Link zum Archiv.

Einige Module erfordern die Installation zusätzlicher Abhängigkeiten, z. B. muss nginx-auth-ldap libldap2-dev installiert haben. Notwendige Abhängigkeiten können auch in der Beschreibung des Moduls angegeben werden.

Die Umwelt


In unserem Tool können Sie schnell eine Umgebung mit installierten Dienstprogrammen zum Kompilieren, Erstellen eines Pakets und anderer Hilfssoftware erstellen. Hier passt der Docker-Container mit allem, was Sie benötigen, am besten (das Repository enthält bereits einige Beispiele für Docker-Dateien für Ubuntu und Centos).

Nachdem die Spezifikation von der Umgebung kompiliert und vorbereitet wurde, führen wir unseren Kollektor aus und installieren seine Abhängigkeiten vor:

 pip3 install -r requirements.txt ./main.py build -f [_].yaml -r [_] 

Die Versionsnummer hier ist optional und dient zur Versionierung von Assemblys. Es wird in den Metainformationen des Pakets aufgezeichnet, wodurch es einfach ist, es auf Servern zu aktualisieren.
An den Protokollen können Sie beobachten, was passiert. Hier ein Beispiel für Highlights:

 builder - INFO - Parse yaml file: example.config.yaml builder - INFO - Download scripts for build deb package builder - INFO - Downloading nginx src... builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz builder - INFO - Downloading 3d-party modules... builder - INFO - Module nginx-auth-ldap will download by branch builder - INFO - -- Done: nginx-auth-ldap builder - INFO - -- Done: ngx_http_substitutions_filter_module builder - INFO - Module headers-more-nginx-module will downloading builder - INFO - Module nginx-module-vts will download by tag builder - INFO - -- Done: nginx-module-vts builder - INFO - Module ngx_devel_kit will download by tag builder - INFO - -- Done: ngx_devel_kit builder - INFO - -- Done: ngx_cache_purge builder - INFO - -- Done: ngx_http_dyups_module builder - INFO - Downloading dependencies builder - INFO - Building .deb package builder - INFO - Running 'dh_make'... builder - INFO - Running 'dpkg-buildpackage'... dpkg-deb: building package 'nginx' in '../nginx_1.14.1-1_amd64.deb'. 

Mit nur wenigen Befehlen erstellen wir die Umgebung und die gewünschte Nginx-Assembly, und das Paket wird in dem Verzeichnis angezeigt, in dem das Skript ausgeführt wird.

Einbetten


Wir können unser Tool auch in CI / CD-Prozesse einbetten. Jedes der vielen vorhandenen CI-Systeme wie Teamcity oder Gitlab CI kann dabei helfen.

Jedes Mal, wenn Sie die Spezifikation im Git-Repository ändern, wird die Assemblierung des Artefakts automatisch gestartet. Die Revisionsnummer ist an den Build-Startzähler gebunden.
Nachdem Sie einige Zeit verbracht haben, können Sie das Artefakt so konfigurieren, dass es an das lokale Paket-Repository, Nexus, Artifactory usw. gesendet wird.

Ein zusätzliches Plus ist, dass die Konfigurations-Yaml-Datei mit Ansible oder einem anderen System der automatischen Konfiguration verbunden werden kann und daraus die Versionsnummer und den Pakettyp entnimmt, den wir bereitstellen möchten.

Was weiter


Das Projekt ist noch nicht abgeschlossen. Daran arbeiten wir gerade:

  • Wir erweitern die Konfigurationsmöglichkeiten, halten sie aber gleichzeitig so einfach wie möglich. Ich möchte nicht tausend Parameter definieren, wenn nur zwei benötigt werden, und der Rest ist standardmäßig geeignet. Dies umfasst Kompilierungsflags (jetzt können Sie sie in der internen Konfigurationsdatei src / config.py ändern), Installationspfade und auszuführende Benutzer.
  • Fügen Sie Optionen zum automatischen Senden des Pakets an verschiedene Artefakt-Repositorys hinzu.
  • Wenn Sie beim Laden eines Moduls einen Benutzerbefehl ausführen (um beispielsweise github.com/nginx-modules/nginx_upstream_check_module zu verwenden , müssen Sie zuerst einen Patch einer bestimmten Version anwenden).
  • Tests hinzufügen:
    • Das Paket ist korrekt installiert.
    • Nginx hat die richtige Version und wird mit den erforderlichen Flags und Modulen kompiliert.
    • Die erforderlichen Pfade, Konten usw. werden erstellt.

Aber Sie können dieses Tool jetzt verwenden und Verbesserungen vorschlagen - github.com/TinkoffCreditSystems/Nginx-builder wellcome!

Source: https://habr.com/ru/post/de452336/


All Articles