Mēs saliekam savu Nginx ar pāris komandām

Hi!
Mani sauc Sergejs, es strādāju par infrastruktūras inženieri platformas tinkoff.ru API komandā.

Å ajā rakstā es runāŔu par problēmām, ar kurām saskārās mÅ«su komanda, pamatojoties uz balansieriem Nginx dažādiem projektiem. Es arÄ« pastāstÄ«Å”u par rÄ«ku, kas ļāva man pārvarēt lielāko daļu no tiem.

Nginx ir daudzfunkcionāls un aktīvi attīstās starpniekserveris. Tam ir liels skaits moduļu, tas nav pilnīgs saraksts. Katrs projekts uzliek noteiktas prasības balansētāja funkcionalitātei un Nginx versijai (piemēram, http/2 un grpc starpniekservera klātbūtnei) un tā moduļu sastāvam.

Mēs vēlētos redzēt jaunu versiju ar nepiecieÅ”amo moduļu komplektu, kas darbojas saskaņā ar noteiktu Linux izplatÄ«Å”anu. MÅ«su gadÄ«jumā tās ir uz deb un rpm balstÄ«tas sistēmas. Å ajā rakstā nav apskatÄ«ta iespēja ar konteineriem.

Mēs vēlamies ātri mainīt savu balansētāju funkcionalitāti. Un te uzreiz rodas jautājums: kā to panākt, tērējot pēc iespējas mazāk resursu? Vēl labāk būtu iestatīt procesu tā, lai mēs varētu norādīt ierobežotu skaitu ievades parametru un izejā saņemtu artefaktu deb/rpm pakotnes veidā vēlamajai OS.

Rezultātā var formulēt vairākas problēmas:

  • Ne vienmēr ir pakotnes ar jaunāko Nginx versiju.
  • Nav nevienas pakotnes ar nepiecieÅ”amajiem moduļiem.
  • Manuāla pakotnes sastādÄ«Å”ana un izveide ir laikietilpÄ«ga un patiesi nogurdinoÅ”a.
  • Nav apraksta par to, kā Ŕī vai cita Nginx instance tiek samontēta.

Lai atrisinātu Ŕīs problēmas, rodas vajadzÄ«ba pēc rÄ«ka, kas par ievadi ņemtu specifikāciju cilvēkam lasāmā formātā un uz tās pamata saliktu Nginx pakotni ar nepiecieÅ”amo funkcionalitāti.

Neatrodot mums piemērotu iespēju Github plaÅ”ajā vietā, mēs nolēmām izveidot savu rÄ«ku - nginx veidotājs.

Specifikācijas

MÅ«su rÄ«kā mēs vēlējāmies izveidot specifikācijas aprakstu koda veidā, ko pēc tam var ievietot Git repozitorijā. Lai to izdarÄ«tu, mēs izvēlējāmies Ŕādām lietām pazÄ«stamu formātu - yaml. Specifikācijas piemērs:

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

Å eit mēs norādām, ka vēlamies redzēt deb pakotni ar Nginx versiju 1.14.2 ar nepiecieÅ”amo moduļu komplektu. Sadaļa ar moduļiem nav obligāta. Katram no tiem varat iestatÄ«t:

  • Vārds.
  • Adrese, kur to var saņemt:
    • Git repozitorijs. Varat arÄ« norādÄ«t filiāli vai tagu.
    • ArhÄ«va tÄ«mekļa saite.
    • Vietējā saite uz arhÄ«vu.

Dažiem moduļiem ir jāinstalē papildu atkarÄ«bas, piemēram, nginx-auth-ldap ir jāinstalē libldap2-dev. Aprakstot moduli, var norādÄ«t arÄ« nepiecieÅ”amās atkarÄ«bas.

Vide

MÅ«su rÄ«kā varat ātri iegÅ«t vidi ar instalētām utilÄ«tprogrammām kompilÄ“Å”anai, pakotņu montāžai un citai palÄ«gprogrammatÅ«rai. Å eit ir ideāls Docker konteiners ar visu nepiecieÅ”amo (repozitorijā jau ir daži Docker failu piemēri ubuntu un centos).

Pēc specifikācijas sastādÄ«Å”anas un vides sagatavoÅ”anas mēs palaižam savu celtnieku, iepriekÅ” uzstādot tā atkarÄ«bas:

pip3 install -r requirements.txt
./main.py build -f [ŠŗŠ¾Š½Ń„ŠøŠ³_фŠ°Š¹Š»].yaml -r [Š½Š¾Š¼ŠµŃ€_рŠµŠ²ŠøŠ·ŠøŠø]

PārskatīŔanas numurs Ŕeit nav obligāts un tiek izmantots komplektu versiju veidoŔanai. Tas ir ierakstīts pakotnes metainformācijā, padarot to viegli atjaunināmu serveros.
No žurnāliem varat pārraudzÄ«t notiekoÅ”o. Å eit ir galveno punktu piemērs:

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

Tātad, tikai ar pāris komandām mēs izveidojam vidi un nepiecieÅ”amo Nginx montāžu, un pakotne parādās direktorijā, no kura tiek palaists skripts.

IegulŔana

Mēs varam arÄ« integrēt mÅ«su rÄ«ku CI/CD procesos. Piemēram, jebkura no daudzajām mÅ«sdienās esoÅ”ajām CI sistēmām var palÄ«dzēt Å”ajā jautājumā Teamcity vai Gitlab CI.

Rezultātā katru reizi, kad Git krātuvē mainās specifikācijas, artefakta bÅ«vējums tiek automātiski palaists. PārskatÄ«Å”anas numurs ir saistÄ«ts ar bÅ«vējuma palaiÅ”anas skaitÄ«tāju.
Patērējot nedaudz vairāk laika, varat konfigurēt artefaktu, lai tas tiktu nosūtīts uz vietējo pakotņu krātuvi, Nexus, Artifactory un tā tālāk.

Papildu priekÅ”rocÄ«ba ir tā, ka yaml konfigurācijas failu var savienot ar Ansible vai citu automātisko konfigurācijas sistēmu, un no turienes mēs varam paņemt versijas numuru un pakotnes veidu, kuru vēlamies izvietot.

Kas ir nākamais

Projekts vēl nav pabeigts. LÅ«k, pie kā mēs paÅ”laik strādājam:

  • Mēs paplaÅ”inām konfigurācijas iespēju, bet tajā paŔā laikā saglabājam to pēc iespējas vienkārŔāku. JÅ«s nevēlaties definēt tÅ«kstoÅ” parametru, ja jums ir nepiecieÅ”ami tikai divi, un pārējie ir piemēroti pēc noklusējuma. Tas ietver kompilācijas karogus (tagad varat tos mainÄ«t iekŔējā konfigurācijas failā src/config.py), instalācijas ceļu un palaiÅ”anas lietotāju.
  • Mēs pievienojam opcijas automātiskai pakotnes nosÅ«tÄ«Å”anai uz dažādām artefaktu krātuvēm.
  • Ielādējot moduli, izpildiet pielāgotu komandu (piemēram, lai izmantotu github.com/nginx-modules/nginx_upstream_check_module vispirms jāpieliek noteiktas versijas ielāps)
  • Testu pievienoÅ”ana:
    • Pakete ir instalēta pareizi.
    • Nginx ir vajadzÄ«gā versija, un tā ir veidota ar nepiecieÅ”amajiem karodziņiem un moduļiem.
    • Tiek izveidoti nepiecieÅ”amie ceļi, konti un tā tālāk.

Bet jūs varat izmantot Ŕo rīku tagad un arī ieteikt uzlabojumus - github.com/TinkoffCreditSystems/Nginx-builder laipni lūgti!

Avots: www.habr.com

Pievieno komentāru