Vi sätter ihop vår Nginx med ett par kommandon

Hälsningar!
Jag heter Sergey, jag arbetar som infrastrukturingenjör i API-teamet på tinkoff.ru-plattformen.

I den här artikeln kommer jag att prata om problemen som vårt team stod inför när de förberedde balanserare utifrån nginx för olika projekt. Jag kommer också att berätta om verktyget som gjorde att jag kunde övervinna de flesta av dem.

Nginx är en multifunktionell och aktivt utvecklande proxyserver. Den har ett stort antal moduler, detta är inte en komplett lista. Varje projekt ställer vissa krav på funktionaliteten hos balanseraren och versionen av Nginx (till exempel närvaron av http/2 och grpc-proxy), och sammansättningen av dess moduler.

Vi skulle vilja se en ny version med den nödvändiga uppsättningen moduler, som körs under en specifik Linux-distribution. I vårt fall är det deb- och rpm-baserade system. Alternativet med behållare beaktas inte i den här artikeln.

Vi vill snabbt ändra funktionaliteten hos våra balansapparater. Och här uppstår frågan omedelbart: hur ska man uppnå detta samtidigt som man spenderar så lite resurser som möjligt? Det skulle vara ännu bättre att ställa in processen så att vi kan specificera ett ändligt antal ingångsparametrar, och vid utgången ta emot en artefakt i form av ett deb/rpm-paket för det önskade operativsystemet.

Som ett resultat kan ett antal problem formuleras:

  • Det finns inte alltid paket med den senaste versionen av Nginx.
  • Det finns inga paket med de nödvändiga modulerna.
  • Att kompilera och bygga ett paket manuellt är tidskrävande och rent ut sagt tråkigt.
  • Det finns ingen beskrivning av hur den eller den Nginx-instansen är sammansatt.

För att lösa dessa problem uppstår behovet av ett verktyg som tar som input en specifikation i ett läsbart format och sätter ihop ett Nginx-paket med den nödvändiga funktionaliteten baserat på det.

Eftersom vi inte hittade ett lämpligt alternativ för oss på Githubs vidd, bestämde vi oss för att skapa vårt eget verktyg - nginx-byggare.

Specifikationer

I vårt verktyg ville vi skapa en beskrivning av specifikationen i form av kod, som sedan kan läggas in i ett Git-repository. För att göra detta valde vi formatet som är bekant för sådana saker - yaml. Specifikationsexempel:

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

Här anger vi att vi vill se ett deb-paket med Nginx version 1.14.2 med den nödvändiga uppsättningen av moduler. Sektionen med moduler är valfri. För var och en av dem kan du ställa in:

  • Namn.
  • Adress där du kan få det:
    • Git repository. Du kan också ange en gren eller tagg.
    • Arkiv webblänk.
    • Lokal länk till arkivet.

Vissa moduler kräver ytterligare beroenden för att installeras, till exempel kräver nginx-auth-ldap libldap2-dev installerat. Nödvändiga beroenden kan också anges när modulen beskrivs.

Miljö

I vårt verktyg kan du snabbt få en miljö med installerade verktyg för kompilering, paketmontering och annan hjälpprogramvara. En Docker-behållare med allt du behöver är idealisk här (förvaret har redan ett par exempel på Docker-filer för ubuntu och centos).

Efter att specifikationen har upprättats och miljön är förberedd, lanserar vi vår byggare, efter att tidigare ha installerat dess beroenden:

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

Revisionsnumret här är valfritt och används för versionshantering av sammansättningar. Det skrivs in i paketets metainformation, vilket gör det enkelt att uppdatera på servrar.
Från loggarna kan du följa vad som händer. Här är ett exempel på huvudpunkterna:

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

Så med bara ett par kommandon skapar vi miljön och den nödvändiga Nginx-sammansättningen, och paketet visas i katalogen där skriptet startas.

Inbäddning

Vi kan också integrera vårt verktyg i CI/CD-processer. Vilket som helst av de många CI-system som finns idag kan hjälpa till med detta, till exempel Teamcity eller Gitlab CI.

Som ett resultat, varje gång specifikationen ändras i Git-förvaret, startas uppbyggnaden av artefakten automatiskt. Revisionsnumret är kopplat till byggstartsräknaren.
Med lite mer tid kan du konfigurera artefakten så att den skickas till ditt lokala paketförråd, Nexus, Artifactory och så vidare.

En ytterligare fördel är att yaml-konfigurationsfilen kan kopplas till Ansible eller något annat automatiskt konfigurationssystem, och därifrån kan vi ta versionsnummer och pakettyp som vi vill distribuera.

Vad är nästa

Projektet är ännu inte avslutat. Här är vad vi jobbar med nu:

  • Vi utökar möjligheten till konfiguration, men håller det samtidigt så enkelt som möjligt. Du vill inte definiera tusen parametrar om du bara behöver två, och resten passar som standard. Detta inkluderar kompileringsflaggor (nu kan du ändra dem i den interna konfigurationsfilen src/config.py), installationssökväg och startanvändare.
  • Vi lägger till alternativ för att automatiskt skicka ett paket till olika artefaktförråd.
  • Utför ett anpassat kommando när du laddar en modul (till exempel för att använda github.com/nginx-modules/nginx_upstream_check_module du måste först applicera en patch av en specifik version)
  • Lägga till tester:
    • Paketet är korrekt installerat.
    • Nginx har den version som krävs och är byggd med de nödvändiga flaggorna och modulerna.
    • Nödvändiga sökvägar, konton och så vidare skapas.

Men du kan använda det här verktyget nu och även föreslå förbättringar - github.com/TinkoffCreditSystems/Nginx-builder Välkommen!

Källa: will.com

Lägg en kommentar