Ne mbledhim Nginx-in tonë me disa komanda

Привет!
Emri im është Sergey, unë punoj si inxhinier infrastrukture në ekipin API të platformës tinkoff.ru.

Në këtë artikull do të flas për problemet me të cilat u përball ekipi ynë gjatë përgatitjes së balancuesve në bazë të tyre nginx për projekte të ndryshme. Do t'ju tregoj gjithashtu për mjetin që më lejoi të kapërcej shumicën e tyre.

Nginx është një server proxy multifunksional dhe në zhvillim aktiv. Ai përmban një numër të madh modulesh, kjo nuk është një listë e plotë. Çdo projekt imponon kërkesa të caktuara për funksionalitetin e balancuesit dhe versionin e Nginx (për shembull, prania e proxying http/2 dhe grpc), dhe përbërjen e moduleve të tij.

Ne do të dëshironim të shihnim një version të ri me grupin e nevojshëm të moduleve, që funksionojnë nën një shpërndarje specifike Linux. Në rastin tonë, këto janë sisteme të bazuara në deb dhe rpm. Opsioni me kontejnerë nuk merret parasysh në këtë artikull.

Ne duam të ndryshojmë shpejt funksionalitetin e balancuesve tanë. Dhe këtu lind menjëherë pyetja: si të arrihet kjo duke shpenzuar sa më pak burime? Do të ishte edhe më mirë ta konfiguronim procesin në mënyrë që të mund të specifikojmë një numër të kufizuar parametrash hyrëse dhe në dalje të marrim një objekt në formën e një pakete deb/rpm për OS-në e dëshiruar.

Si rezultat, mund të formulohen një sërë problemesh:

  • Nuk ka gjithmonë paketa me versionin më të fundit të Nginx.
  • Nuk ka paketa me modulet e kërkuara.
  • Përpilimi dhe ndërtimi i një pakete në mënyrë manuale kërkon kohë dhe plotësisht i mundimshëm.
  • Nuk ka asnjë përshkrim se si është mbledhur ky apo ai shembull Nginx.

Për të zgjidhur këto probleme, lind nevoja për një mjet që do të merrte si hyrje një specifikim në një format të lexueshëm nga njeriu dhe do të mblidhte një paketë Nginx me funksionalitetin e nevojshëm bazuar në të.

Duke mos gjetur një opsion të përshtatshëm për ne në pafundësinë e Github, vendosëm të krijojmë mjetin tonë - nginx-ndërtues.

Specifikimet

Në mjetin tonë, ne donim të krijonim një përshkrim të specifikimit në formën e kodit, i cili më pas mund të vendoset në një depo Git. Për ta bërë këtë, ne zgjodhëm formatin e njohur për gjëra të tilla - yaml. Shembull specifikimi:

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

Këtu tregojmë se duam të shohim një paketë deb me versionin 1.14.2 Nginx me grupin e kërkuar të moduleve. Seksioni me module është opsional. Për secilën prej tyre mund të vendosni:

  • Emrin
  • Adresa ku mund ta merrni:
    • Depoja e Git. Ju gjithashtu mund të specifikoni një degë ose etiketë.
    • Lidhja e internetit e arkivimit.
    • Lidhje lokale me arkivin.

Disa module kërkojnë varësi shtesë për t'u instaluar, për shembull nginx-auth-ldap kërkon instalimin e libldap2-dev. Gjatë përshkrimit të modulit mund të specifikohen edhe varësitë e nevojshme.

mjedis

Në veglën tonë mund të merrni shpejt një mjedis me programe të instaluara për kompilim, montim të paketave dhe softuer të tjerë ndihmës. Një kontejner Docker me gjithçka që ju nevojitet është ideal këtu (depoja ka tashmë disa shembuj të skedarëve Docker për ubuntu dhe centos).

Pasi të hartohet specifikimi dhe të përgatitet mjedisi, ne lëshojmë ndërtuesin tonë, pasi kemi instaluar më parë varësitë e tij:

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

Numri i rishikimit këtu është opsional dhe përdoret për versionimin e asambleve. Është shkruar në meta informacionin e paketës, duke e bërë të lehtë përditësimin në serverë.
Nga regjistrat mund të monitoroni se çfarë po ndodh. Këtu është një shembull i pikave kryesore:

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

Pra, me vetëm disa komanda, ne krijojmë mjedisin dhe asamblenë e kërkuar Nginx, dhe paketa shfaqet në drejtorinë nga ku niset skripti.

Embedding

Ne gjithashtu mund të integrojmë mjetin tonë në proceset CI/CD. Për shembull, ndonjë nga sistemet e shumta CI ekzistuese sot mund të ndihmojë me këtë Teamcity ose Gitlab CI.

Si rezultat, sa herë që ndryshon specifikimi në depo Git, ndërtimi i artefaktit nis automatikisht. Numri i rishikimit është i lidhur me numëruesin e nisjes së ndërtimit.
Me pak më shumë kohë, mund të konfiguroni objektin që të dërgohet në depon e paketave lokale, Nexus, Artifactory etj.

Një avantazh shtesë është se skedari i konfigurimit yaml mund të lidhet me Ansible ose një sistem tjetër konfigurimi automatik, dhe prej andej mund të marrim numrin e versionit dhe llojin e paketës që duam të vendosim.

Ç'pritet më tej

Projekti nuk ka përfunduar ende. Ja se për çfarë po punojmë tani:

  • Zgjerojmë mundësinë e konfigurimit, por në të njëjtën kohë e mbajmë sa më të thjeshtë. Ju nuk dëshironi të përcaktoni një mijë parametra nëse ju duhen vetëm dy, dhe pjesa tjetër përshtatet si parazgjedhje. Kjo përfshin flamujt e përpilimit (tani mund t'i ndryshoni ato në skedarin e konfigurimit të brendshëm src/config.py), shtegun e instalimit dhe përdoruesin e nisjes.
  • Ne po shtojmë opsione për dërgimin automatik të një pakete në depo të ndryshme objektesh.
  • Ekzekutoni një komandë të personalizuar kur ngarkoni një modul (për shembull, për t'u përdorur github.com/nginx-modules/nginx_upstream_check_module së pari duhet të aplikoni një patch të një versioni specifik)
  • Shtimi i testeve:
    • Paketa është instaluar saktë.
    • Nginx ka versionin e kërkuar dhe është ndërtuar me flamujt dhe modulet e kërkuara.
    • Krijohen shtigjet e nevojshme, llogaritë, e kështu me radhë.

Por ju mund ta përdorni këtë mjet tani, dhe gjithashtu të sugjeroni përmirësime - github.com/TinkoffCreditSystems/Nginx-builder mire se erdhe!

Burimi: www.habr.com

Shto një koment