Sastavljamo naš Nginx sa nekoliko naredbi

Zdravo!
Moje ime je Sergej, radim kao infrastrukturni inženjer u API timu platforme tinkoff.ru.

U ovom članku govorit ću o problemima sa kojima se naš tim suočio prilikom pripreme balansera na osnovu kojih Nginx za razne projekte. Također ću vam reći o alatu koji mi je omogućio da savladam većinu njih.

Nginx je multifunkcionalni proxy server koji se aktivno razvija. Poseduje veliki broj modula, ovo nije potpuna lista. Svaki projekat nameće određene zahtjeve za funkcionalnost balansera i verziju Nginx-a (na primjer, prisutnost http/2 i grpc proxyja), te sastav njegovih modula.

Željeli bismo vidjeti novu verziju sa potrebnim skupom modula, koja radi pod određenom distribucijom Linuxa. U našem slučaju, to su sistemi zasnovani na deb i rpm. Opcija sa kontejnerima se ne razmatra u ovom članku.

Želimo brzo promijeniti funkcionalnost naših balansera. I tu se odmah postavlja pitanje: kako to postići uz što manje sredstava? Još bolje bi bilo podesiti proces tako da možemo specificirati konačan broj ulaznih parametara, a na izlazu dobiti artefakt u obliku deb/rpm paketa za željeni OS.

Kao rezultat, može se formulirati niz problema:

  • Ne postoje uvijek paketi s najnovijom verzijom Nginxa.
  • Ne postoje paketi sa potrebnim modulima.
  • Ručno sastavljanje i pravljenje paketa je dugotrajno i prilično zamorno.
  • Nema opisa kako se sastavlja ova ili ona instanca Nginxa.

Za rješavanje ovih problema javlja se potreba za alatom koji bi kao ulaz uzeo specifikaciju u ljudskom čitljivom formatu i na osnovu toga sklopio Nginx paket sa potrebnom funkcionalnošću.

Ne pronalazeći odgovarajuću opciju za nas na prostranstvu Githuba, odlučili smo kreirati vlastiti alat - nginx-builder.

Спецификации

U našem alatu, željeli smo kreirati opis specifikacije u obliku koda, koji se zatim može staviti u Git spremište. Da bismo to učinili, odabrali smo format poznat za takve stvari - yaml. Primjer 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

Ovdje ukazujemo da želimo vidjeti deb paket sa Nginx verzijom 1.14.2 sa potrebnim skupom modula. Odjeljak sa modulima nije obavezan. Za svaku od njih možete postaviti:

  • Ime.
  • Adresa na kojoj možete dobiti:
    • Git spremište. Također možete odrediti granu ili oznaku.
    • Arhivirajte web link.
    • Lokalni link na arhivu.

Neki moduli zahtijevaju instaliranje dodatnih ovisnosti, na primjer nginx-auth-ldap zahtijeva instaliran libldap2-dev. Neophodne zavisnosti se takođe mogu specificirati kada se opisuje modul.

Životna sredina

U našem alatu možete brzo dobiti okruženje sa instaliranim uslužnim programima za kompilaciju, sklapanje paketa i drugim pomoćnim softverom. Docker kontejner sa svime što vam treba je idealan ovdje (spremište već ima nekoliko primjera Docker datoteka za ubuntu i centos).

Nakon što je sastavljena specifikacija i pripremljeno okruženje, pokrećemo naš builder, nakon što smo prethodno instalirali njegove zavisnosti:

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

Broj revizije ovdje nije obavezan i koristi se za verzioniranje sklopova. Upisuje se u meta informacije paketa, što olakšava ažuriranje na serverima.
Iz dnevnika možete pratiti šta se dešava. Evo primjera glavnih tačaka:

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

Dakle, doslovno sa par naredbi kreiramo okruženje i potreban Nginx sklop, a paket se pojavljuje u direktoriju odakle se skripta pokreće.

Embedding

Također možemo integrirati naš alat u CI/CD procese. Bilo koji od mnogih CI sistema koji postoje danas može pomoći u tome, na primjer Teamcity ili Gitlab CI.

Kao rezultat, svaki put kada se specifikacija promijeni u Git spremištu, automatski se pokreće izrada artefakta. Broj revizije je povezan sa brojačem pokretanja izgradnje.
Uz malo više vremena, možete konfigurirati artefakt da se pošalje u vaše lokalno spremište paketa, Nexus, Artifactory, itd.

Dodatna prednost je što se yaml konfiguraciona datoteka može povezati na Ansible ili neki drugi sistem za automatsku konfiguraciju, a odatle možemo uzeti broj verzije i tip paketa koji želimo da implementiramo.

Šta sledi

Projekat još nije završen. Evo na čemu sada radimo:

  • Proširujemo mogućnost konfiguracije, ali je u isto vrijeme činimo što jednostavnijom. Ne želite da definišete hiljadu parametara ako su vam potrebna samo dva, a ostali odgovaraju podrazumevano. Ovo uključuje zastavice za kompilaciju (sada ih možete promijeniti u internoj konfiguracijskoj datoteci src/config.py), instalacijsku putanju i korisnika za pokretanje.
  • Dodajemo opcije za automatsko slanje paketa u razna spremišta artefakata.
  • Izvršite prilagođenu naredbu prilikom učitavanja modula (na primjer, za korištenje github.com/nginx-modules/nginx_upstream_check_module prvo morate primijeniti zakrpu određene verzije)
  • Dodavanje testova:
    • Paket je ispravno instaliran.
    • Nginx ima potrebnu verziju i izgrađen je sa potrebnim zastavicama i modulima.
    • Kreiraju se potrebne staze, računi i tako dalje.

Ali sada možete koristiti ovaj alat i predložiti poboljšanja - github.com/TinkoffCreditSystems/Nginx-builder dobrodošli!

izvor: www.habr.com

Dodajte komentar