Naš Nginx sestavimo z nekaj ukazi

Lep pozdrav!
Moje ime je Sergej, delam kot infrastrukturni inženir v skupini API platforme tinkoff.ru.

V tem članku bom govoril o težavah, s katerimi se je soočila naša ekipa pri pripravi balancev na osnovi Nginx za razne projekte. Povedal vam bom tudi o orodju, ki mi je omogočilo premagati večino od njih.

Nginx je večnamenski proxy strežnik, ki se aktivno razvija. Vsebuje veliko število modulov, to ni popoln seznam. Vsak projekt nalaga določene zahteve glede funkcionalnosti uravnoteženja in različice Nginx (na primer prisotnost http/2 in grpc proxy) ter sestavo njegovih modulov.

Želeli bi videti svežo različico z zahtevanim naborom modulov, ki deluje pod določeno distribucijo Linuxa. V našem primeru so to sistemi, ki temeljijo na deb in rpm. Možnost s kontejnerji v tem članku ni obravnavana.

Želimo hitro spremeniti funkcionalnost naših balansirk. In tu se takoj pojavi vprašanje: kako to doseči in pri tem porabiti čim manj sredstev? Še bolje bi bilo proces nastaviti tako, da lahko podamo končno število vhodnih parametrov, na izhodu pa dobimo artefakt v obliki paketa deb/rpm za želeni OS.

Posledično je mogoče oblikovati številne težave:

  • Ni vedno paketov z najnovejšo različico Nginx.
  • Ni paketov z zahtevanimi moduli.
  • Ročno prevajanje in sestavljanje paketa je dolgotrajno in naravnost dolgočasno.
  • Ni opisa, kako je sestavljen ta ali oni primerek Nginx.

Za rešitev teh težav se pojavi potreba po orodju, ki bi kot vhod vzelo specifikacijo v človeku berljivi obliki in na njeni podlagi sestavilo paket Nginx s potrebno funkcionalnostjo.

Ker nismo našli primerne možnosti za nas na prostranosti Githuba, smo se odločili ustvariti svoje orodje - nginx-builder.

Tehnični podatki

V našem orodju smo želeli ustvariti opis specifikacije v obliki kode, ki jo lahko nato damo v repozitorij Git. Da bi to naredili, smo izbrali obliko, ki je znana za takšne stvari - yaml. Primer specifikacije:

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

Tukaj označimo, da želimo videti paket deb z Nginx različico 1.14.2 z zahtevanim naborom modulov. Razdelek z moduli je neobvezen. Za vsakega od njih lahko nastavite:

  • Ime.
  • Naslov, kjer ga lahko dobite:
    • Git repozitorij. Določite lahko tudi vejo ali oznako.
    • Arhivska spletna povezava.
    • Lokalna povezava do arhiva.

Nekateri moduli zahtevajo namestitev dodatnih odvisnosti, na primer nginx-auth-ldap zahteva nameščen libldap2-dev. Potrebne odvisnosti lahko navedete tudi pri opisu modula.

Okolje

V našem orodju lahko hitro dobite okolje z nameščenimi pripomočki za prevajanje, sestavljanje paketov in drugo pomožno programsko opremo. Vsebnik Docker z vsem, kar potrebujete, je tukaj idealen (repozitorij že ima nekaj primerov datotek Docker za ubuntu in centos).

Ko je specifikacija sestavljena in okolje pripravljeno, zaženemo naš gradilnik, pri čemer smo predhodno namestili njegove odvisnosti:

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

Številka revizije tukaj ni obvezna in se uporablja za sestave različic. Zapisan je v metainformacijah paketa, kar olajša posodabljanje na strežnikih.
Iz dnevnikov lahko spremljate, kaj se dogaja. Tukaj je primer glavnih točk:

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

Tako z le nekaj ukazi ustvarimo okolje in zahtevano zbirko Nginx, paket pa se prikaže v imeniku, iz katerega se zažene skript.

Vdelava

Naše orodje lahko integriramo tudi v procese CI/CD. Pri tem lahko na primer pomaga kateri koli od številnih sistemov CI, ki danes obstajajo Teamcity ali Gitlab CI.

Posledično se ob vsaki spremembi specifikacije v repozitoriju Git samodejno zažene zgradba artefakta. Številka revizije je povezana s števcem zagona gradnje.
Z malo več časa lahko konfigurirate artefakt tako, da bo poslan v vaš lokalni repozitorij paketov, Nexus, Artifactory itd.

Dodatna prednost je, da lahko konfiguracijsko datoteko yaml povežemo z Ansible ali drugim avtomatskim konfiguracijskim sistemom, od tam pa lahko vzamemo številko različice in vrsto paketa, ki ga želimo namestiti.

Kaj je naslednje?

Projekt še ni zaključen. Zdaj delamo na tem:

  • Razširimo možnost konfiguracije, a jo hkrati čim bolj poenostavimo. Nočete definirati tisoč parametrov, če potrebujete samo dva, ostali pa privzeto ustrezajo. To vključuje zastavice prevajanja (zdaj jih lahko spremenite v notranji konfiguracijski datoteki src/config.py), namestitveno pot in zagonskega uporabnika.
  • Dodajamo možnosti za samodejno pošiljanje paketa v različna skladišča artefaktov.
  • Izvedite ukaz po meri pri nalaganju modula (na primer za uporabo github.com/nginx-modules/nginx_upstream_check_module najprej morate uporabiti popravek določene različice)
  • Dodajanje testov:
    • Paket je pravilno nameščen.
    • Nginx ima zahtevano različico in je zgrajen z zahtevanimi zastavicami in moduli.
    • Ustvarijo se potrebne poti, računi itd.

Toda to orodje lahko uporabite zdaj in tudi predlagate izboljšave - github.com/TinkoffCreditSystems/Nginx-builder Dobrodošli!

Vir: www.habr.com

Dodaj komentar