Mir sammelen eisen Nginx mat e puer Kommandoen

Hallo!
Mäin Numm ass Sergey, ech schaffen als Infrastrukturingenieur am API Team vun der tinkoff.ru Plattform.

An dësem Artikel wäert ech iwwer d'Problemer schwätzen, déi eist Team konfrontéiert huet wann Dir Balancer virbereet baséiert op Nginx fir verschidde Projeten. Ech soen Iech och iwwer e Tool dat mir erlaabt huet déi meescht vun hinnen ze iwwerwannen.

Nginx ass e multifunktionnellen an aktiv entwéckelende Proxy Server. Et enthält eng grouss Zuel vu Moduler, dëst ass net eng komplett Lëscht. All Projet setzt gewësse Viraussetzunge fir d'Funktionalitéit vum Balancer an der Versioun vum Nginx (zum Beispill d'Präsenz vun http/2 a grpc Proxying), an d'Zesummesetzung vu senge Moduler.

Mir wëllen eng frësch Versioun mat dem erfuerderleche Set vu Moduler gesinn, déi ënner enger spezifescher Linux Verdeelung leeft. An eisem Fall sinn dës Deb- a Rpm-baséiert Systemer. D'Optioun mat Container gëtt net an dësem Artikel berücksichtegt.

Mir wëllen d'Funktionalitéit vun eise Balancer séier änneren. An hei stellt sech direkt d'Fro: Wéi kann een dat erreechen, wann ee sou wéineg wéi méiglech Ressourcen ausginn? Et wier nach besser de Prozess opzestellen sou datt mir eng endlech Unzuel vun Inputparameter kënne spezifizéieren, a beim Ausgang en Artefakt a Form vun engem Deb/rpm Package fir de gewënschten OS kréien.

Als Resultat kënnen eng Rei Probleemer formuléiert ginn:

  • Et ginn net ëmmer Packagen mat der leschter Versioun vun Nginx.
  • Et gi keng Packagen mat den erfuerderleche Moduler.
  • E Package manuell ze kompiléieren an ze bauen ass Zäitopwänneg a richteg langweileg.
  • Et gëtt keng Beschreiwung vu wéi dës oder déi Nginx Instanz zesummegesat ass.

Fir dës Problemer ze léisen, entsteet de Besoin fir e Tool dat als Input eng Spezifizéierung an engem mënschlech liesbare Format géif huelen an en Nginx Package mat der néideger Funktionalitéit opbauen.

Net eng gëeegent Optioun fir eis op der Wäitheet vu Github ze fannen, hu mir décidéiert eisen eegene Tool ze kreéieren - nginx-Builder.

Spezifikatioune

An eisem Tool wollte mir eng Beschreiwung vun der Spezifizéierung a Form vu Code erstellen, deen dann an e Git Repository gesat ka ginn. Fir dëst ze maachen, hu mir d'Format vertraut fir sou Saachen gewielt - yaml. Spezifizéierung Beispill:

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

Hei weisen mir datt mir e Deb Package mat Nginx Versioun 1.14.2 mat der erfuerderlecher Set vu Moduler gesinn. D'Sektioun mat Moduler ass fakultativ. Fir jiddereng vun hinnen kënnt Dir setzen:

  • Numm.
  • Adress wou Dir et kritt:
    • Git Repository. Dir kënnt och eng Branche oder Tag uginn.
    • Archiv Web Link.
    • Lokal Link op d'Archiv.

E puer Moduler erfuerderen zousätzlech Ofhängegkeete fir installéiert ze ginn, zum Beispill nginx-auth-ldap erfuerdert libldap2-dev installéiert. Néideg Ofhängegkeeten kënnen och uginn ginn wann Dir de Modul beschreiwen.

D'Ëmwelt

An eisem Tool kënnt Dir séier en Ëmfeld mat installéierten Utilities fir Compilatioun, Package Assemblée an aner Hëllefssoftware kréien. En Docker Container mat alles wat Dir braucht ass hei ideal (de Repository huet schonn e puer Beispiller vun Docker Dateien fir Ubuntu a Centos).

Nodeems d'Spezifikatioun ausgeschafft ass an d'Ëmwelt virbereet ass, lancéiere mir eise Builder, nodeems se virdru seng Ofhängegkeeten installéiert hunn:

pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]

D'Versiounsnummer hei ass fakultativ a gëtt fir Versiounsversammlungen benotzt. Et ass an d'Meta-Informatioun vum Package geschriwwe ginn, wat et einfach mécht op Serveren ze aktualiséieren.
Vun de Logbicher kënnt Dir iwwerwaachen wat geschitt. Hei ass e Beispill vun den Haaptpunkten:

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'.

Also, mat nëmmen e puer Kommandoen, kreéiere mir d'Ëmfeld an déi erfuerderlech Nginx Versammlung, an de Package erschéngt am Verzeechnes vu wou de Skript gestart gëtt.

Embedding

Mir kënnen och eisen Tool an CI / CD Prozesser integréieren. Jiddereen vun de ville CI Systemer, déi haut existéieren, kënnen zum Beispill hëllefen Teamcity oder Gitlab CI.

Als Resultat, all Kéier wann d'Spezifikatioun am Git Repository ännert, gëtt de Bau vum Artefakt automatesch gestart. D'Revisiounsnummer ass mat dem Buildstartscounter verbonnen.
Mat e bësse méi Zäit kënnt Dir den Artefakt konfiguréieren fir an Äre lokalen Package Repository, Nexus, Artifactory, a sou weider ze schécken.

En zousätzleche Virdeel ass datt d'yaml Konfiguratiounsdatei mat Ansible oder engem aneren automatesche Konfiguratiounssystem verbonne ka ginn, a vun do kënne mir d'Versiounsnummer an d'Packagetyp huelen, déi mir wëllen ofsetzen.

Wat ass Next

De Projet ass nach net ofgeschloss. Hei ass wat mir elo schaffen:

  • Mir erweideren d'Méiglechkeet vun der Konfiguratioun, awer gläichzäiteg halen et sou einfach wéi méiglech. Dir wëllt net dausend Parameteren definéieren wann Dir nëmmen zwee braucht, an de Rescht passt als Standard. Dëst beinhalt d'Kompiléierungsfändelen (elo kënnt Dir se an der interner Konfiguratiounsdatei änneren src/config.py), Installatiounswee a Start Benotzer.
  • Mir addéieren Optiounen fir automatesch e Package op verschidden Artefaktrepositories ze schécken.
  • Fëllt e personaliséierte Kommando aus wann Dir e Modul luet (zum Beispill fir ze benotzen github.com/nginx-modules/nginx_upstream_check_module Dir musst als éischt e Patch vun enger spezifescher Versioun applizéieren)
  • Tester addéieren:
    • De Package ass richteg installéiert.
    • Nginx huet déi erfuerderlech Versioun a gëtt mat den erfuerderleche Fändelen a Moduler gebaut.
    • Déi néideg Weeër, Konten, asw.

Awer Dir kënnt dëst Tool elo benotzen, an och Verbesserunge proposéieren - github.com/TinkoffCreditSystems/Nginx-builder wëllkomm!

Source: will.com

Setzt e Commentaire