Binubuo namin ang aming Nginx gamit ang ilang mga utos

ΠŸΡ€ΠΈΠ²Π΅Ρ‚!
Ang pangalan ko ay Sergey, nagtatrabaho ako bilang isang inhinyero ng imprastraktura sa API team ng tinkoff.ru platform.

Sa artikulong ito ay pag-uusapan ko ang tungkol sa mga problema na kinakaharap ng aming koponan sa paghahanda ng mga balanse batay sa Nginx para sa iba't ibang proyekto. Sasabihin ko rin sa iyo ang tungkol sa tool na nagbigay-daan sa akin upang madaig ang karamihan sa kanila.

Ang Nginx ay isang multifunctional at aktibong pagbuo ng proxy server. Nagtatampok ito ng malaking bilang ng mga module, hindi ito kumpletong listahan. Ang bawat proyekto ay nagpapataw ng ilang mga kinakailangan sa pag-andar ng balancer at ang bersyon ng Nginx (halimbawa, ang pagkakaroon ng http/2 at grpc proxying), at ang komposisyon ng mga module nito.

Gusto naming makakita ng bagong bersyon na may kinakailangang hanay ng mga module, na tumatakbo sa ilalim ng isang partikular na pamamahagi ng Linux. Sa aming kaso, ang mga ito ay deb- at rpm-based na mga sistema. Ang opsyon na may mga lalagyan ay hindi isinasaalang-alang sa artikulong ito.

Gusto naming mabilis na baguhin ang functionality ng aming mga balancer. At narito ang tanong kaagad na lumitaw: kung paano makamit ito habang gumagastos ng kaunting mga mapagkukunan hangga't maaari? Mas mainam na i-set up ang proseso upang matukoy natin ang isang tiyak na bilang ng mga parameter ng input, at sa output ay makatanggap ng isang artifact sa anyo ng isang deb/rpm na pakete para sa nais na OS.

Bilang isang resulta, ang isang bilang ng mga problema ay maaaring mabuo:

  • Hindi palaging may mga pakete na may pinakabagong bersyon ng Nginx.
  • Walang mga pakete na may kinakailangang mga module.
  • Ang pag-compile at pagbuo ng isang package nang manu-mano ay nakakaubos ng oras at talagang nakakapagod.
  • Walang paglalarawan kung paano ito o ang Nginx instance na iyon ay binuo.

Upang malutas ang mga problemang ito, ang pangangailangan ay lumitaw para sa isang tool na kukuha bilang input ng isang detalye sa isang format na nababasa ng tao at mag-assemble ng isang Nginx package na may kinakailangang functionality batay dito.

Hindi nakakahanap ng angkop na opsyon para sa amin sa kalakhan ng Github, nagpasya kaming lumikha ng sarili naming tool - nginx-builder.

Mga pagtutukoy

Sa aming tool, gusto naming lumikha ng isang paglalarawan ng detalye sa anyo ng code, na maaaring ilagay sa isang Git repository. Upang gawin ito, pinili namin ang format na pamilyar para sa mga naturang bagay - yaml. Halimbawa ng pagtutukoy:

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

Dito ipinapahiwatig namin na gusto naming makakita ng deb package na may bersyon ng Nginx 1.14.2 na may kinakailangang hanay ng mga module. Ang seksyon na may mga module ay opsyonal. Para sa bawat isa sa kanila maaari mong itakda:

  • Pangalan
  • Address kung saan mo ito makukuha:
    • Git repository. Maaari ka ring tumukoy ng sangay o tag.
    • I-archive ang link sa web.
    • Lokal na link sa archive.

Ang ilang mga module ay nangangailangan ng mga karagdagang dependency na mai-install, halimbawa nginx-auth-ldap ay nangangailangan ng libldap2-dev na naka-install. Ang mga kinakailangang dependency ay maaari ding tukuyin kapag inilalarawan ang module.

Kapaligiran

Sa aming tool maaari kang mabilis na makakuha ng isang kapaligiran na may naka-install na mga utility para sa compilation, package assembly at iba pang auxiliary software. Ang isang lalagyan ng Docker na may lahat ng kailangan mo ay perpekto dito (ang repositoryo ay mayroon nang ilang mga halimbawa ng mga file ng Docker para sa ubuntu at centos).

Matapos mabuo ang detalye at maihanda ang kapaligiran, inilunsad namin ang aming tagabuo, na dati nang na-install ang mga dependency nito:

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

Ang numero ng rebisyon dito ay opsyonal at ginagamit para sa mga pagtitipon ng bersyon. Nakasulat ito sa meta information ng package, na ginagawang madali ang pag-update sa mga server.
Mula sa mga log maaari mong subaybayan kung ano ang nangyayari. Narito ang isang halimbawa ng mga pangunahing punto:

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

Kaya, sa ilang utos lang, nililikha namin ang kapaligiran at ang kinakailangang pagpupulong ng Nginx, at lalabas ang package sa direktoryo kung saan inilunsad ang script.

Pag-embed

Maaari rin naming isama ang aming tool sa mga proseso ng CI/CD. Anuman sa maraming mga CI system na umiiral ngayon ay maaaring makatulong dito, halimbawa Teamcity o Gitlab CI.

Bilang resulta, sa tuwing nagbabago ang detalye sa repositoryo ng Git, awtomatikong inilulunsad ang pagbuo ng artifact. Ang numero ng rebisyon ay naka-link sa build launch counter.
Sa kaunting oras, maaari mong i-configure ang artifact na ipapadala sa iyong lokal na imbakan ng package, Nexus, Artifactory, at iba pa.

Ang isang karagdagang bentahe ay ang yaml configuration file ay maaaring ikonekta sa Ansible o isa pang awtomatikong configuration system, at mula doon maaari naming kunin ang numero ng bersyon at uri ng package na gusto naming i-deploy.

kung ano ang susunod

Hindi pa tapos ang proyekto. Narito ang ginagawa namin ngayon:

  • Pinapalawak namin ang posibilidad ng pagsasaayos, ngunit sa parehong oras ay pinapanatili itong simple hangga't maaari. Hindi mo nais na tukuyin ang isang libong mga parameter kung kailangan mo lamang ng dalawa, at ang iba ay umaangkop bilang default. Kabilang dito ang mga flag ng compilation (ngayon ay maaari mo nang baguhin ang mga ito sa panloob na configuration file src/config.py), landas ng pag-install, at paglunsad ng user.
  • Nagdaragdag kami ng mga opsyon para sa awtomatikong pagpapadala ng package sa iba't ibang mga artifact repository.
  • Magsagawa ng custom na command kapag naglo-load ng module (halimbawa, para gamitin github.com/nginx-modules/nginx_upstream_check_module kailangan mo munang maglapat ng patch ng isang partikular na bersyon)
  • Pagdaragdag ng mga pagsubok:
    • Ang pakete ay na-install nang tama.
    • Ang Nginx ay may kinakailangang bersyon at binuo gamit ang mga kinakailangang flag at module.
    • Ang mga kinakailangang landas, mga account, at iba pa ay nilikha.

Ngunit maaari mong gamitin ang tool na ito ngayon, at magmungkahi din ng mga pagpapabuti - github.com/TinkoffCreditSystems/Nginx-builder maligayang pagdating!

Pinagmulan: www.habr.com

Magdagdag ng komento