Wy sammelje ús Nginx mei in pear kommando's

Hallo!
Myn namme is Sergey, ik wurkje as ynfrastruktueringenieur yn it API-team fan it tinkoff.ru-platfoarm.

Yn dit artikel sil ik prate oer de problemen dy't ús team tsjinkaam by it tarieden fan balancers basearre op Nginx foar ferskate projekten. Ik sil jo ek fertelle oer it ark dat my de measte fan har koe oerwinnen.

Nginx is in multyfunksjonele en aktyf ûntwikkeljen proxy-tsjinner. It hat in grut oantal modules, dit is net in folsleine list. Elk projekt stelt bepaalde easken op 'e funksjonaliteit fan' e balancer en de ferzje fan Nginx (bygelyks de oanwêzigens fan http/2 en grpc proxying), en de gearstalling fan syn modules.

Wy wolle graach in frisse ferzje sjen mei de fereaske set modules, dy't rint ûnder in spesifike Linux-distribúsje. Yn ús gefal binne dit deb- en rpm-basearre systemen. De opsje mei konteners wurdt net beskôge yn dit artikel.

Wy wolle de funksjonaliteit fan ús balancers fluch feroarje. En hjir ûntstiet fuortendaliks de fraach: hoe dit te berikken mei sa min mooglik middels útjaan? It soe noch better wêze om it proses yn te stellen sadat wy in einich oantal ynfierparameters kinne opjaan, en by de útfier in artefakt ûntfange yn 'e foarm fan in deb / rpm-pakket foar it winske OS.

As gefolch dêrfan kinne in oantal problemen formulearre wurde:

  • D'r binne net altyd pakketten mei de lêste ferzje fan Nginx.
  • D'r binne gjin pakketten mei de fereaske modules.
  • It gearstallen en bouwen fan in pakket mei de hân is tiidslinend en gewoan saai.
  • D'r is gjin beskriuwing fan hoe't dit of dat Nginx-eksimplaar is gearstald.

Om dizze problemen op te lossen, ûntstiet de needsaak foar in ark dat as ynfier in spesifikaasje yn in minsklik lêsber formaat soe nimme en in Nginx-pakket gearstalle mei de nedige funksjonaliteit dêrop basearre.

Net fûn in geskikte opsje foar ús op 'e wiidweidichens fan Github, wy besletten om ús eigen ark te meitsjen - nginx-bouwer.

Spesifikaasjes [bewurkje]

Yn ús ark woene wy ​​in beskriuwing meitsje fan 'e spesifikaasje yn' e foarm fan koade, dy't dan yn in Git-repository kin wurde pleatst. Om dit te dwaan, hawwe wy keazen foar it fertroude formaat foar sokke dingen - yaml. Foarbyld fan spesifikaasje:

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

Hjir jouwe wy oan dat wy in deb-pakket wolle sjen mei Nginx ferzje 1.14.2 mei de fereaske set fan modules. De seksje mei modules is opsjoneel. Foar elk fan harren kinne jo ynstelle:

  • Namme.
  • Adres wêr't jo it kinne krije:
    • Git repository. Jo kinne ek in branch of tag opjaan.
    • Argyf web keppeling.
    • Lokale keppeling nei it argyf.

Guon modules fereaskje ekstra ôfhinklikens te ynstallearjen, bygelyks nginx-auth-ldap fereasket libldap2-dev ynstallearre. Needsaaklike ôfhinklikens kinne ek oanjûn wurde by it beskriuwen fan de module.

Miljeu

Yn ús ark kinne jo fluch in omjouwing krije mei ynstalleare nutsfoarsjenningen foar kompilaasje, pakketassemblage en oare helpsoftware. In Docker-kontener mei alles wat jo nedich binne is hjir ideaal (it repository hat al in pear foarbylden fan Docker-bestannen foar ubuntu en centos).

Nei't de spesifikaasje is opsteld en de omjouwing is taret, lansearje wy ús bouwer, nei't wy earder syn ôfhinklikens ynstalleare:

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

It revyzjenûmer hjir is opsjoneel en wurdt brûkt foar ferzjes fan gearstallingen. It is skreaun yn 'e meta-ynformaasje fan it pakket, wêrtroch it maklik is om te aktualisearjen op servers.
Ut de logs kinne jo kontrolearje wat der bart. Hjir is in foarbyld fan 'e haadpunten:

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

Dat, mei mar in pear kommando's, meitsje wy de omjouwing en de fereaske Nginx-assemblage, en it pakket ferskynt yn 'e map wêr't it skript wurdt lansearre.

Ynbêde

Wy kinne ús ark ek yntegrearje yn CI / CD-prosessen. Elk fan 'e protte CI-systemen dy't hjoeddedei besteane, kinne bygelyks helpe mei dit Teamcity of Gitlab CI.

As gefolch, elke kear as de spesifikaasje feroaret yn it Git-repository, wurdt de bou fan it artefakt automatysk lansearre. It revyzjenûmer is keppele oan de build-startteller.
Mei in bytsje mear tiid kinne jo it artefakt ynstelle om te stjoeren nei jo lokale pakketrepository, Nexus, Artifactory, ensfh.

In ekstra foardiel is dat it yaml-konfiguraasjetriem kin wurde ferbûn mei Ansible of in oar automatysk konfiguraasjesysteem, en fanôf dêr kinne wy ​​it ferzjenûmer en pakkettype nimme dat wy wolle ynsette.

Wat is hjirnei

It projekt is noch net klear. Hjir is wêr't wy no oan wurkje:

  • Wy wreidzje de mooglikheid fan konfiguraasje út, mar tagelyk hâlde it sa ienfâldich mooglik. Jo wolle gjin tûzen parameters definiearje as jo mar twa nedich binne, en de rest past standert. Dit omfettet kompilaasjeflaggen (no kinne jo se wizigje yn it ynterne konfiguraasjetriem src/config.py), ynstallaasjepaad en startbrûker.
  • Wy foegje opsjes ta foar it automatysk ferstjoeren fan in pakket nei ferskate artefaktrepositories.
  • Fier in oanpast kommando út by it laden fan in module (bygelyks om te brûken github.com/nginx-modules/nginx_upstream_check_module jo moatte earst in patch fan in spesifike ferzje tapasse)
  • Tests tafoegje:
    • It pakket is goed ynstalleare.
    • Nginx hat de fereaske ferzje en is boud mei de fereaske flaggen en modules.
    • De nedige paden, akkounts, ensafuorthinne wurde oanmakke.

Mar jo kinne dit ark no brûke, en ek ferbetterings foarstelle - github.com/TinkoffCreditSystems/Nginx-builder wolkom!

Boarne: www.habr.com

Add a comment