Vi setter sammen vår Nginx med et par kommandoer

Hei!
Mitt navn er Sergey, jeg jobber som infrastrukturingeniør i API-teamet til tinkoff.ru-plattformen.

I denne artikkelen vil jeg snakke om problemene som teamet vårt sto overfor når de utarbeidet balansere basert på Nginx til ulike prosjekter. Jeg vil også fortelle deg om verktøyet som tillot meg å overvinne de fleste av dem.

Nginx er en multifunksjonell og aktivt utviklende proxy-server. Den har et stort antall moduler, dette er ikke en fullstendig liste. Hvert prosjekt stiller visse krav til funksjonaliteten til balanseren og versjonen av Nginx (for eksempel tilstedeværelsen av http/2 og grpc proxying), og sammensetningen av modulene.

Vi vil gjerne se en fersk versjon med det nødvendige settet med moduler, som kjører under en spesifikk Linux-distribusjon. I vårt tilfelle er dette deb- og rpm-baserte systemer. Alternativet med containere vurderes ikke i denne artikkelen.

Vi ønsker å raskt endre funksjonaliteten til balanserene våre. Og her dukker spørsmålet umiddelbart opp: hvordan oppnå dette mens man bruker så lite ressurser som mulig? Det ville være enda bedre å sette opp prosessen slik at vi kan spesifisere et begrenset antall inngangsparametere, og ved utgangen motta en artefakt i form av en deb/rpm-pakke for ønsket OS.

Som et resultat kan en rekke problemer formuleres:

  • Det er ikke alltid pakker med den nyeste versjonen av Nginx.
  • Det er ingen pakker med de nødvendige modulene.
  • Å kompilere og bygge en pakke manuelt er tidkrevende og rett og slett kjedelig.
  • Det er ingen beskrivelse av hvordan denne eller den Nginx-forekomsten er satt sammen.

For å løse disse problemene, oppstår behovet for et verktøy som vil ta som input en spesifikasjon i et menneskelig lesbart format og sette sammen en Nginx-pakke med nødvendig funksjonalitet basert på den.

Da vi ikke fant et passende alternativ for oss på Githubs enorme område, bestemte vi oss for å lage vårt eget verktøy - nginx-bygger.

Spesifikasjoner

I verktøyet vårt ønsket vi å lage en beskrivelse av spesifikasjonen i form av kode, som deretter kan legges inn i et Git-depot. For å gjøre dette, valgte vi formatet som er kjent for slike ting - yaml. Spesifikasjonseksempel:

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

Her indikerer vi at vi ønsker å se en deb-pakke med Nginx versjon 1.14.2 med det nødvendige settet med moduler. Seksjonen med moduler er valgfri. For hver av dem kan du angi:

  • Navn.
  • Adresse hvor du kan få det:
    • Git repository. Du kan også spesifisere en gren eller tag.
    • Arkivweblink.
    • Lokal lenke til arkivet.

Noen moduler krever ytterligere avhengigheter for å bli installert, for eksempel krever nginx-auth-ldap libldap2-dev installert. Nødvendige avhengigheter kan også spesifiseres ved beskrivelse av modulen.

Miljø

I vårt verktøy kan du raskt få et miljø med installerte verktøy for kompilering, pakkemontering og annen tilleggsprogramvare. En Docker-beholder med alt du trenger er ideell her (depotet har allerede et par eksempler på Docker-filer for ubuntu og centos).

Etter at spesifikasjonen er utarbeidet og miljøet er forberedt, lanserer vi byggmesteren vår, etter å ha installert dens avhengigheter tidligere:

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

Revisjonsnummeret her er valgfritt og brukes til versjonskontroll av sammenstillinger. Det er skrevet inn i pakkens metainformasjon, noe som gjør det enkelt å oppdatere på servere.
Fra loggene kan du følge med på hva som skjer. Her er et eksempel på hovedpunktene:

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 bare et par kommandoer, lager vi miljøet og den nødvendige Nginx-monteringen, og pakken vises i katalogen der skriptet er lansert.

Innebygging

Vi kan også integrere verktøyet vårt i CI/CD-prosesser. Hvilke som helst av de mange CI-systemene som finnes i dag kan hjelpe med dette, for eksempel Teamcity eller Gitlab CI.

Som et resultat, hver gang spesifikasjonen endres i Git-depotet, startes oppbyggingen av artefakten automatisk. Revisjonsnummeret er knyttet til telleren for byggestart.
Med litt mer tid kan du konfigurere artefakten til å sendes til ditt lokale pakkelager, Nexus, Artifactory og så videre.

En ekstra fordel er at yaml-konfigurasjonsfilen kan kobles til Ansible eller et annet automatisk konfigurasjonssystem, og derfra kan vi ta versjonsnummeret og pakketypen som vi ønsker å distribuere.

Hva er neste

Prosjektet er ennå ikke fullført. Her er det vi jobber med nå:

  • Vi utvider muligheten for konfigurasjon, men holder det samtidig så enkelt som mulig. Du vil ikke definere tusen parametere hvis du bare trenger to, og resten passer som standard. Dette inkluderer kompileringsflagg (nå kan du endre dem i den interne konfigurasjonsfilen src/config.py), installasjonsbane og startbruker.
  • Vi legger til alternativer for automatisk å sende en pakke til forskjellige artefaktlager.
  • Utfør en egendefinert kommando når du laster inn en modul (for eksempel for å bruke github.com/nginx-modules/nginx_upstream_check_module du må først bruke en oppdatering av en bestemt versjon)
  • Legger til tester:
    • Pakken er riktig installert.
    • Nginx har den nødvendige versjonen og er bygget med de nødvendige flaggene og modulene.
    • De nødvendige banene, kontoene og så videre opprettes.

Men du kan bruke dette verktøyet nå, og også foreslå forbedringer - github.com/TinkoffCreditSystems/Nginx-builder Velkommen!

Kilde: www.habr.com

Legg til en kommentar