Ni kunvenas nian Nginx per kelkaj komandoj

Saluton!
Mi nomiĝas Sergey, mi laboras kiel infrastruktura inĝeniero en la API-teamo de la platformo tinkoff.ru.

En ĉi tiu artikolo mi parolos pri la problemoj, kiujn nia teamo alfrontis kiam preparis ekvilibristojn bazitajn sur Nginx por diversaj projektoj. Mi ankaŭ rakontos al vi pri la ilo, kiu permesis al mi venki la plej multajn el ili.

Nginx estas multfunkcia kaj aktive evoluanta prokurilo. Ĝi havas grandan nombron da moduloj, ĉi tio ne estas kompleta listo. Ĉiu projekto trudas certajn postulojn pri la funkcieco de la ekvilibristo kaj la versio de Nginx (ekzemple, la ĉeesto de http/2 kaj grpc-proxying), kaj la komponado de ĝiaj moduloj.

Ni ŝatus vidi freŝan version kun la bezonata aro de moduloj, funkciante sub specifa Linukso-distribuo. En nia kazo, ĉi tiuj estas deb- kaj rpm-bazitaj sistemoj. La opcio kun ujoj ne estas konsiderata en ĉi tiu artikolo.

Ni volas rapide ŝanĝi la funkciojn de niaj balanciloj. Kaj ĉi tie tuj aperas la demando: kiel atingi ĉi tion elspezante kiel eble plej malmultajn rimedojn? Estus eĉ pli bone agordi la procezon por ke ni povu specifi finian nombron da enigparametroj, kaj ĉe la eligo ricevi artefakton en la formo de deb/rpm-pakaĵo por la dezirata OS.

Kiel rezulto, kelkaj problemoj povas esti formulitaj:

  • Ne ĉiam estas pakaĵoj kun la plej nova versio de Nginx.
  • Ne ekzistas pakoj kun la postulataj moduloj.
  • Kompili kaj konstrui pakaĵon permane estas tempopostula kaj tute teda.
  • Ne estas priskribo pri kiel ĉi tiu aŭ alia Nginx-instanco estas kunvenita.

Por solvi ĉi tiujn problemojn, aperas la bezono de ilo, kiu prenus kiel enigaĵon specifon en homlegebla formato kaj kunvenus Nginx-pakaĵon kun la necesa funkcieco bazita sur ĝi.

Ne trovante taŭgan opcion por ni sur la vasteco de Github, ni decidis krei nian propran ilon - nginx-konstruanto.

Specifoj (redakti)

En nia ilo, ni volis krei priskribon de la specifo en formo de kodo, kiu tiam povas esti metita en Git-deponejon. Por fari tion, ni elektis la konatan formaton por tiaj aferoj - yaml. Specifa ekzemplo:

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

Ĉi tie ni indikas, ke ni volas vidi deb-pakaĵon kun Nginx-versio 1.14.2 kun la bezonata aro de moduloj. La sekcio kun moduloj estas laŭvola. Por ĉiu el ili vi povas agordi:

  • Nomo.
  • Adreso kie vi povas akiri ĝin:
    • Git-deponejo. Vi ankaŭ povas specifi branĉon aŭ etikedon.
    • Arkivu interretligilon.
    • Loka ligilo al la arkivo.

Iuj moduloj postulas pliajn dependecojn esti instalitaj, ekzemple nginx-auth-ldap postulas libldap2-dev instalita. Necesaj dependecoj ankaŭ povas esti specifitaj dum priskribado de la modulo.

La medio

En nia ilo vi povas rapide akiri medion kun instalitaj utilecoj por kompilo, pakaĵaro kaj aliaj helpaj programoj. Docker-ujo kun ĉio, kion vi bezonas, estas ideala ĉi tie (la deponejo jam havas kelkajn ekzemplojn de Docker-dosieroj por ubuntu kaj centos).

Post kiam la specifo estas ellaborita kaj la medio estas preta, ni lanĉas nian konstruilon, antaŭe instalinte ĝiajn dependecojn:

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

La revizia numero ĉi tie estas laŭvola kaj estas uzata por versioj de asembleoj. Ĝi estas skribita en la metainformojn de la pakaĵo, faciligante ĝisdatigon sur serviloj.
El la protokoloj vi povas kontroli kio okazas. Jen ekzemplo de la ĉefaj punktoj:

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

Do, kun nur kelkaj komandoj, ni kreas la medion kaj la bezonatan Nginx-asembleon, kaj la pako aperas en la dosierujo de kie la skripto estas lanĉita.

Enkonstruado

Ni ankaŭ povas integri nian ilon en CI/KD-procezojn. Ĉiu el la multaj CI-sistemoj ekzistantaj hodiaŭ povas helpi kun tio, ekzemple TeamcityGitlab CI.

Kiel rezulto, ĉiufoje kiam la specifo ŝanĝiĝas en la Git-deponejo, la konstruo de la artefakto estas aŭtomate lanĉita. La revizia numero estas ligita al la konstrua lanĉa nombrilo.
Kun iom pli da tempo, vi povas agordi la artefakton por esti sendita al via loka pak-deponejo, Nexus, Artifactory, ktp.

Plia avantaĝo estas, ke la yaml-agorda dosiero povas esti konektita al Ansible aŭ al alia aŭtomata agorda sistemo, kaj de tie ni povas preni la version-numeron kaj pakaĵon, kiujn ni volas disfaldi.

Kio sekvas

La projekto ankoraŭ ne estas finita. Jen pri kio ni laboras nun:

  • Ni pligrandigas la eblecon de agordo, sed samtempe tenas ĝin kiel eble plej simpla. Vi ne volas difini mil parametrojn se vi bezonas nur du, kaj la resto taŭgas defaŭlte. Ĉi tio inkluzivas kompilajn flagojn (nun vi povas ŝanĝi ilin en la interna agorda dosiero src/config.py), instala vojo kaj lanĉa uzanto.
  • Ni aldonas eblojn por aŭtomate sendi pakaĵon al diversaj artefaktaj deponejoj.
  • Efektivigu kutiman komandon dum ŝarĝo de modulo (ekzemple por uzi github.com/nginx-modules/nginx_upstream_check_module vi unue devas apliki flikaĵon de specifa versio)
  • Aldonante testojn:
    • La pako estas instalita ĝuste.
    • Nginx havas la bezonatan version kaj estas konstruita kun la postulataj flagoj kaj moduloj.
    • La necesaj vojoj, kontoj, ktp estas kreitaj.

Sed vi povas uzi ĉi tiun ilon nun, kaj ankaŭ sugesti plibonigojn - github.com/TinkoffCreditSystems/Nginx-builder bonvenon!

fonto: www.habr.com

Aldoni komenton