Nou rasanble Nginx nou an ak yon koup nan kòmandman

Hi!
Non mwen se Sergey, mwen travay kòm yon enjenyè enfrastrikti nan ekip la API nan platfòm la tinkoff.ru.

Nan atik sa a mwen pral pale sou pwoblèm yo ke ekip nou an te fè fas lè prepare balanse ki baze sou Nginx pou plizyè pwojè. Mwen pral pale tou sou zouti ki pèmèt mwen simonte pifò nan yo.

Nginx se yon sèvè prokurasyon ki gen plizyè fonksyon epi k ap devlope aktivman. Li prezante yon gwo kantite modil, sa a se pa yon lis konplè. Chak pwojè enpoze sèten kondisyon sou fonksyonalite balans lan ak vèsyon Nginx (pa egzanp, prezans http/2 ak grpc proxy), ak konpozisyon modil li yo.

Nou ta renmen wè yon vèsyon fre ak seri modil ki nesesè yo, kouri anba yon distribisyon Linux espesifik. Nan ka nou an, sa yo se sistèm ki baze sou deb ak rpm. Opsyon an ak resipyan pa konsidere nan atik sa a.

Nou vle chanje byen vit fonksyonalite balanse nou yo. Ak isit la kesyon an imedyatman rive: ki jan yo reyalize sa a pandan y ap depanse kòm kèk resous ke posib? Li ta menm pi bon yo mete kanpe pwosesis la pou nou ka presize yon kantite fini nan paramèt opinyon, ak nan pwodiksyon an resevwa yon asosye nan fòm lan nan yon pake deb / rpm pou eksplwatasyon an vle.

Kòm yon rezilta, yon kantite pwoblèm ka formul:

  • Pa toujou gen pakè ak dènye vèsyon Nginx.
  • Pa gen pakè ki gen modil obligatwa yo.
  • Konpile ak bati yon pake manyèlman se tan konsome ak kareman fatigan.
  • Pa gen okenn deskripsyon sou fason sa a oswa ki egzanp Nginx reyini.

Pou rezoud pwoblèm sa yo, bezwen an rive pou yon zouti ki ta pran kòm antre yon spesifikasyon nan yon fòma moun lizib epi rasanble yon pake Nginx ak fonksyonalite ki nesesè ki baze sou li.

Pa jwenn yon opsyon apwopriye pou nou sou imansite Github, nou deside kreye pwòp zouti nou an - nginx-builder.

Espesifikasyon

Nan zouti nou an, nou te vle kreye yon deskripsyon nan spesifikasyon nan fòm lan nan kòd, ki ka Lè sa a, dwe mete nan yon depo Git. Pou fè sa, nou te chwazi fòma abitye pou bagay sa yo - yaml. Egzanp spesifikasyon:

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

Isit la nou endike ke nou vle wè yon pake deb ak vèsyon Nginx 1.14.2 ak seri modil ki nesesè yo. Seksyon an ak modil opsyonèl. Pou chak nan yo ou ka mete:

  • Non.
  • Adrès kote ou ka jwenn li:
    • Git depo. Ou kapab tou presize yon branch oswa tag.
    • Achiv lyen entènèt.
    • Lyen lokal nan achiv la.

Gen kèk modil ki mande depandans adisyonèl yo dwe enstale, pou egzanp nginx-auth-ldap mande pou libldap2-dev enstale. Depandans ki nesesè yo ka espesifye tou lè w ap dekri modil la.

Environ

Nan zouti nou an ou ka byen vit jwenn yon anviwònman ak sèvis piblik enstale pou konpilasyon, asanble pake ak lòt lojisyèl oksilyè. Yon veso Docker ak tout sa ou bezwen se ideyal isit la (repozitwa a deja gen yon koup nan egzanp dosye Docker pou ubuntu ak centos).

Apre spesifikasyon an fin prepare epi anviwònman an prepare, nou lanse mason nou an, li te deja enstale depandans li yo:

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

Nimewo revizyon isit la se opsyonèl epi li itilize pou asanble vèsyon. Li ekri nan meta enfòmasyon pake a, sa ki fè li fasil pou mete ajou sou serveurs.
Soti nan mòso bwa yo ou ka kontwole sa k ap pase. Men yon egzanp pwen prensipal yo:

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

Se konsa, ak jis yon koup nan kòmandman, nou kreye anviwònman an ak asanble Nginx ki nesesè yo, ak pake a parèt nan anyè ki soti nan kote script la te lanse.

Entègrasyon

Nou kapab tou entegre zouti nou an nan pwosesis CI/CD. Nenpòt nan anpil sistèm CI ki egziste jodi a ka ede ak sa, pou egzanp Teamcity oswa Gitlab CI.

Kòm yon rezilta, chak fwa spesifikasyon an chanje nan repozitwa Git la, bati nan zafè a otomatikman lanse. Nimewo revizyon an lye ak kontwa lansman konstriksyon an.
Avèk yon ti kras plis tan, ou ka konfigirasyon asosye a yo dwe voye nan repozitwa pake lokal ou a, Nexus, Artifactory, ak sou sa.

Yon avantaj adisyonèl se ke dosye a konfigirasyon yaml ka konekte ak Ansible oswa yon lòt sistèm konfigirasyon otomatik, epi soti nan la nou ka pran nimewo a vèsyon ak kalite pake ke nou vle deplwaye.

Ki sa ki nan pwochen an

Pwojè a poko fini. Men sa n ap travay kounye a:

  • Nou elaji posiblite pou konfigirasyon, men an menm tan kenbe li kòm senp ke posib. Ou pa vle defini mil paramèt si ou sèlman bezwen de, ak rès la adapte pa default. Sa a gen ladan drapo konpilasyon (kounye a ou ka chanje yo nan dosye konfigirasyon entèn src/config.py), chemen enstalasyon, ak itilizatè lansman.
  • Nou ap ajoute opsyon pou voye otomatikman yon pakè nan plizyè depo zam.
  • Egzekite yon lòd koutim lè w ap chaje yon modil (pa egzanp, pou itilize github.com/nginx-modules/nginx_upstream_check_module ou dwe premye aplike yon plak nan yon vèsyon espesifik)
  • Ajoute tès:
    • Pake a enstale kòrèkteman.
    • Nginx gen vèsyon ki nesesè yo epi li bati ak drapo ak modil ki nesesè yo.
    • Chemen ki nesesè yo, kont, ak sou sa yo kreye.

Men, ou ka sèvi ak zouti sa a kounye a, epi tou sijere amelyorasyon - github.com/TinkoffCreditSystems/Nginx-builder byenveni!

Sous: www.habr.com

Add nouvo kòmantè