Sastavljamo naš Nginx s nekoliko naredbi

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

U ovom članku govorit ću o problemima s kojima se naš tim susreo pri pripremi balansera na temelju Nginx za razne projekte. Također ću vam reći o alatu koji mi je omogućio da prevladam većinu njih.

Nginx je višenamjenski proxy poslužitelj koji se aktivno razvija. Sadrži veliki broj modula, ovo nije potpuni popis. Svaki projekt nameće određene zahtjeve za funkcionalnost balansera i verziju Nginxa (na primjer, prisutnost http/2 i grpc proxying), te sastav njegovih modula.

Željeli bismo vidjeti svježu verziju s potrebnim skupom modula, koja radi pod specifičnom distribucijom Linuxa. U našem slučaju to su sustavi bazirani na deb-u i rpm-u. Opcija s kontejnerima nije razmatrana u ovom članku.

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

Kao rezultat toga, mogu se formulirati brojni problemi:

  • Ne postoje uvijek paketi s najnovijom verzijom Nginxa.
  • Ne postoje paketi sa potrebnim modulima.
  • Ručno sastavljanje i izrada paketa oduzima puno vremena i doista je zamorno.
  • Ne postoji opis kako se ova ili ona instanca Nginxa sastavlja.

Kako bi se riješili ovi problemi, javlja se potreba za alatom koji bi kao ulaz uzeo specifikaciju u formatu čitljivom za čovjeka i na temelju toga sastavio Nginx paket s potrebnom funkcionalnošću.

Ne pronalazeći prikladnu opciju za nas na prostranstvima Githuba, odlučili smo stvoriti vlastiti alat - nginx-sagraditelj.

Tehnički podaci

U našem alatu željeli smo stvoriti opis specifikacije u obliku koda, koji se zatim može staviti u Git repozitorij. 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 označavamo da želimo vidjeti deb paket s Nginx verzijom 1.14.2 sa potrebnim skupom modula. Odjeljak s modulima nije obavezan. Za svaki od njih možete postaviti:

  • Ime.
  • Adresa na kojoj se može nabaviti:
    • Git spremište. Također možete odrediti granu ili oznaku.
    • Arhivska web poveznica.
    • Lokalni link na arhivu.

Neki moduli zahtijevaju instaliranje dodatnih ovisnosti, na primjer nginx-auth-ldap zahtijeva instaliran libldap2-dev. Neophodne ovisnosti također se mogu navesti prilikom opisa modula.

Okoliš

U našem alatu možete brzo dobiti okruženje s instaliranim uslužnim programima za kompilaciju, sastavljanje paketa i drugi pomoćni softver. Ovdje je idealan Docker spremnik sa svime što vam treba (repozitorij 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 ovisnosti:

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

Broj revizije ovdje nije obavezan i koristi se za sklopove verzija. Zapisan je u metainformacijama paketa, što olakšava ažuriranje na poslužiteljima.
Iz zapisa možete pratiti što se događa. Evo primjera glavnih toč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, sa samo par naredbi kreiramo okruženje i potreban Nginx sklop, a paket se pojavljuje u direktoriju iz kojeg se pokreće skripta.

Ugrađivanje

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

Kao rezultat toga, svaki put kada se specifikacija promijeni u Git repozitoriju, izgradnja artefakta se automatski pokreće. Broj revizije povezan je s brojačem pokretanja međugradnje.
Uz malo više vremena, možete konfigurirati artefakt za slanje u vaš lokalni repozitorij paketa, Nexus, Artifactory i tako dalje.

Dodatna prednost je što se yaml konfiguracijska datoteka može spojiti na Ansible ili neki drugi sustav za automatsku konfiguraciju, a odatle možemo uzeti broj verzije i vrstu paketa koji želimo implementirati.

što dalje

Projekt još nije dovršen. Evo na čemu sada radimo:

  • Proširujemo mogućnost konfiguracije, ali u isto vrijeme održavamo je što jednostavnijom. Ne želite definirati tisuću parametara ako su vam potrebna samo dva, a ostatak vam odgovara prema zadanim postavkama. Ovo uključuje oznake kompilacije (sada ih možete promijeniti u internoj konfiguracijskoj datoteci src/config.py), instalacijsku stazu i korisnika za pokretanje.
  • Dodajemo opcije za automatsko slanje paketa u različita 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 s potrebnim oznakama i modulima.
    • Stvoreni su potrebni putovi, računi i tako dalje.

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

Izvor: www.habr.com

Dodajte komentar