Tunakusanya Nginx yetu na amri kadhaa

Hi!
Jina langu ni Sergey, ninafanya kazi kama mhandisi wa miundombinu katika timu ya API ya jukwaa la tinkoff.ru.

Katika makala hii nitazungumzia matatizo ambayo timu yetu ilikabiliana nayo wakati wa kuandaa mizani kulingana na Nginx kwa miradi mbalimbali. Pia nitakuambia kuhusu chombo ambacho kiliniruhusu kushinda wengi wao.

Nginx ni seva mbadala inayofanya kazi nyingi na inayoendelea kikamilifu. Inayo idadi kubwa ya moduli, hii sio orodha kamili. Kila mradi unaweka mahitaji fulani juu ya utendaji wa usawazishaji na toleo la Nginx (kwa mfano, uwepo wa http/2 na grpc proxying), na muundo wa modules zake.

Tungependa kuona toleo jipya lenye seti inayohitajika ya moduli, inayoendeshwa chini ya usambazaji mahususi wa Linux. Kwa upande wetu, hizi ni mifumo ya msingi wa deni na rpm. Chaguo na vyombo haizingatiwi katika makala hii.

Tunataka kubadilisha haraka utendakazi wa wasawazishaji wetu. Na hapa swali linatokea mara moja: jinsi ya kufikia hili wakati unatumia rasilimali chache iwezekanavyo? Itakuwa bora zaidi kusanidi mchakato ili tuweze kutaja idadi ndogo ya vigezo vya pembejeo, na kwa pato kupokea artifact katika mfumo wa kifurushi cha deb/rpm kwa OS inayotaka.

Kama matokeo, shida kadhaa zinaweza kutatuliwa:

  • Hakuna vifurushi vilivyo na toleo la hivi karibuni la Nginx kila wakati.
  • Hakuna vifurushi vilivyo na moduli zinazohitajika.
  • Kukusanya na kutengeneza kifurushi kwa mikono ni muda mwingi na kuchosha kabisa.
  • Hakuna maelezo ya jinsi hii au mfano huo wa Nginx umekusanyika.

Ili kusuluhisha shida hizi, hitaji linatokea la zana ambayo inaweza kuchukua kama uainishaji wa kuingiza katika umbizo linaloweza kusomeka na binadamu na kukusanya kifurushi cha Nginx chenye utendakazi unaohitajika kulingana nacho.

Bila kupata chaguo linalofaa kwetu juu ya ukubwa wa Github, tuliamua kuunda zana yetu wenyewe - mjenzi wa nginx.

Specifications

Katika zana yetu, tulitaka kuunda maelezo ya vipimo katika mfumo wa nambari, ambayo inaweza kuwekwa kwenye hazina ya Git. Ili kufanya hivyo, tulichagua muundo unaojulikana kwa vitu kama hivyo - yaml. Mfano wa Specification:

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

Hapa tunaonyesha kuwa tunataka kuona kifurushi cha deni na toleo la Nginx 1.14.2 na seti inayohitajika ya moduli. Sehemu iliyo na moduli ni ya hiari. Kwa kila mmoja wao unaweza kuweka:

  • Jina.
  • Anwani unapoweza kuipata:
    • Hifadhi ya Git. Unaweza pia kutaja tawi au lebo.
    • Hifadhi kiungo cha wavuti.
    • Kiungo cha ndani cha kumbukumbu.

Baadhi ya moduli zinahitaji vitegemezi vya ziada kusakinishwa, kwa mfano nginx-auth-ldap inahitaji libldap2-dev kusakinishwa. Vitegemezi vinavyohitajika vinaweza pia kubainishwa wakati wa kuelezea moduli.

Mazingira

Katika chombo chetu unaweza kupata haraka mazingira na huduma zilizowekwa kwa ajili ya mkusanyiko, mkusanyiko wa mfuko na programu nyingine ya msaidizi. Chombo cha Docker kilicho na kila kitu unachohitaji ni bora hapa (hazina tayari ina mifano michache ya faili za Docker za ubuntu na centos).

Baada ya uainishaji kutayarishwa na mazingira kutayarishwa, tunazindua mjenzi wetu, akiwa ameweka utegemezi wake hapo awali:

pip3 install -r requirements.txt
./main.py build -f [ΠΊΠΎΠ½Ρ„ΠΈΠ³_Ρ„Π°ΠΉΠ»].yaml -r [Π½ΠΎΠΌΠ΅Ρ€_Ρ€Π΅Π²ΠΈΠ·ΠΈΠΈ]

Nambari ya marekebisho hapa ni ya hiari na inatumika kwa makusanyiko ya matoleo. Imeandikwa katika maelezo ya meta ya kifurushi, na kuifanya iwe rahisi kusasisha kwenye seva.
Kutoka kwa magogo unaweza kufuatilia kinachotokea. Hapa kuna mfano wa mambo makuu:

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

Kwa hivyo, kwa amri chache tu, tunaunda mazingira na mkusanyiko unaohitajika wa Nginx, na kifurushi kinaonekana kwenye saraka kutoka ambapo hati imezinduliwa.

Kupachika

Tunaweza pia kuunganisha zana yetu katika michakato ya CI/CD. Yoyote ya mifumo mingi ya CI iliyopo leo inaweza kusaidia na hii, kwa mfano Timu ya pamoja au Gitlab CI.

Kama matokeo, kila wakati vipimo vinapobadilika kwenye hazina ya Git, muundo wa kisanii huzinduliwa kiatomati. Nambari ya marekebisho imeunganishwa kwenye kihesabu cha uzinduzi wa jengo.
Kwa muda kidogo zaidi, unaweza kusanidi vizalia vya programu kutumwa kwenye hazina ya kifurushi chako cha ndani, Nexus, Artifactory, na kadhalika.

Faida ya ziada ni kwamba faili ya usanidi ya yaml inaweza kuunganishwa kwa Ansible au mfumo mwingine wa usanidi wa kiotomatiki, na kutoka hapo tunaweza kuchukua nambari ya toleo na aina ya kifurushi tunachotaka kusambaza.

Nini kifuatacho

Mradi bado haujakamilika. Haya ndiyo tunayofanyia kazi sasa:

  • Tunapanua uwezekano wa usanidi, lakini wakati huo huo uifanye iwe rahisi iwezekanavyo. Hutaki kufafanua vigezo elfu ikiwa unahitaji mbili tu, na zingine zinafaa kwa chaguo-msingi. Hii inajumuisha bendera za ujumuishaji (sasa unaweza kuzibadilisha katika faili ya usanidi wa ndani src/config.py), njia ya usakinishaji, na kuzindua mtumiaji.
  • Tunaongeza chaguo za kutuma kifurushi kiotomatiki kwenye hazina mbalimbali za vizalia vya programu.
  • Tekeleza amri maalum wakati wa kupakia moduli (kwa mfano, kutumia github.com/nginx-modules/nginx_upstream_check_module lazima kwanza utumie kiraka cha toleo maalum)
  • Kuongeza vipimo:
    • Kifurushi kimewekwa kwa usahihi.
    • Nginx ina toleo linalohitajika na imeundwa kwa bendera na moduli zinazohitajika.
    • Njia zinazohitajika, akaunti, na kadhalika zinaundwa.

Lakini unaweza kutumia zana hii sasa, na pia kupendekeza uboreshaji - github.com/TinkoffCreditSystems/Nginx-builder karibu!

Chanzo: mapenzi.com

Kuongeza maoni