Մենք հավաքում ենք մեր Nginx-ը մի քանի հրամաններով

Hi!
Ես Սերգեյն եմ, աշխատում եմ որպես ենթակառուցվածքի ինժեներ tinkoff.ru հարթակի API թիմում։

Այս հոդվածում ես կխոսեմ այն ​​խնդիրների մասին, որոնց հետ մեր թիմը բախվել է բալանսավորողներ պատրաստելիս Nginx տարբեր նախագծերի համար։ Ես ձեզ կասեմ նաև այն գործիքի մասին, որը թույլ տվեց ինձ հաղթահարել դրանցից շատերը:

Nginx-ը բազմաֆունկցիոնալ և ակտիվ զարգացող պրոքսի սերվեր է: Այն ունի մեծ թվով մոդուլներ, սա ամբողջական ցանկ չէ. Յուրաքանչյուր նախագիծ որոշակի պահանջներ է դնում հավասարակշռողի և Nginx-ի տարբերակի (օրինակ՝ http/2 և grpc պրոքսիինգի առկայություն) և դրա մոդուլների կազմի վրա։

Մենք կցանկանայինք տեսնել նոր տարբերակ մոդուլների անհրաժեշտ փաթեթով, որն աշխատում է հատուկ Linux բաշխման ներքո: Մեր դեպքում դրանք deb- և rpm-ի վրա հիմնված համակարգեր են: Տարաներով տարբերակը այս հոդվածում դիտարկված չէ:

Մենք ցանկանում ենք արագ փոխել մեր հավասարակշռողների ֆունկցիոնալությունը: Եվ այստեղ անմիջապես հարց է առաջանում՝ ինչպե՞ս հասնել դրան՝ հնարավորինս քիչ ռեսուրսներ ծախսելով։ Ավելի լավ կլիներ գործընթացը կարգավորել այնպես, որ մենք կարողանանք սահմանել սահմանափակ թվով մուտքային պարամետրեր, իսկ ելքում ստանանք արտեֆակտ ցանկալի ՕՀ-ի համար deb/rpm փաթեթի տեսքով:

Արդյունքում կարելի է ձևակերպել մի շարք խնդիրներ.

  • Միշտ չէ, որ Nginx-ի վերջին տարբերակով փաթեթներ կան:
  • Պահանջվող մոդուլներով փաթեթներ չկան:
  • Փաթեթը ձեռքով կազմելն ու կառուցելը ժամանակատար և ուղղակի հոգնեցուցիչ է:
  • Չկա նկարագրություն, թե ինչպես է հավաքվում այս կամ այն ​​Nginx օրինակը:

Այս խնդիրները լուծելու համար անհրաժեշտություն է առաջանում մի գործիքի, որը որպես մուտքային կվերցնի մարդու համար ընթեռնելի ձևաչափով հստակեցում և դրա վրա հիմնված անհրաժեշտ ֆունկցիոնալությամբ Nginx փաթեթ կհավաքի:

Չգտնելով մեզ համար հարմար տարբերակ GitHub-ի մեծության մեջ, մենք որոշեցինք ստեղծել մեր սեփական գործիքը. nginx-builder.

Տեխնիկական

Մեր գործիքում մենք ցանկանում էինք ստեղծել ճշգրտման նկարագրություն կոդի տեսքով, որը կարող է այնուհետև տեղադրվել Git պահեստում: Դա անելու համար մենք ընտրեցինք նման բաների համար ծանոթ ֆորմատը՝ yaml: Հստակեցման օրինակ.

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

Այստեղ մենք նշում ենք, որ մենք ցանկանում ենք տեսնել Nginx 1.14.2 տարբերակով deb փաթեթ՝ անհրաժեշտ մոդուլների հավաքածուով: Մոդուլներով բաժինը ընտրովի է: Նրանցից յուրաքանչյուրի համար կարող եք սահմանել.

  • Անուն
  • Հասցե, որտեղ կարող եք ձեռք բերել.
    • Git պահոց. Կարող եք նաև նշել մասնաճյուղ կամ պիտակ:
    • Արխիվային վեբ հղում:
    • Տեղական հղում դեպի արխիվ:

Որոշ մոդուլներ պահանջում են լրացուցիչ կախվածություններ տեղադրել, օրինակ՝ nginx-auth-ldap-ը պահանջում է տեղադրել libldap2-dev: Մոդուլը նկարագրելիս կարելի է նշել նաև անհրաժեշտ կախվածությունները:

Շրջապատը

Մեր գործիքում դուք կարող եք արագորեն ստանալ միջավայր կոմպիլյացիայի, փաթեթների հավաքման և այլ օժանդակ ծրագրերով տեղադրված կոմունալ ծառայություններով: Այստեղ իդեալական է Docker կոնտեյները, որն ունի անհրաժեշտ ամեն ինչ (պահեստն արդեն ունի Docker ֆայլերի մի քանի օրինակ ubuntu-ի և centos-ի համար):

Հստակեցումը կազմելուց և միջավայրը պատրաստելուց հետո մենք գործարկում ենք մեր շինարարը՝ նախապես տեղադրելով դրա կախվածությունները.

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

Վերանայման համարն այստեղ ընտրովի է և օգտագործվում է հավաքների տարբերակների համար: Այն գրված է փաթեթի մետա տեղեկատվության մեջ՝ հեշտացնելով թարմացումը սերվերների վրա:
Տեղեկամատյաններից կարող եք հետևել, թե ինչ է կատարվում: Ահա հիմնական կետերի օրինակ.

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

Այսպիսով, ընդամենը մի քանի հրամաններով մենք ստեղծում ենք միջավայրը և անհրաժեշտ Nginx հավաքը, և փաթեթը հայտնվում է գրացուցակում, որտեղից գործարկվում է սցենարը:

Ներդրում

Մենք կարող ենք նաև ինտեգրել մեր գործիքը CI/CD գործընթացների մեջ: Այսօր գոյություն ունեցող բազմաթիվ CI համակարգերից որևէ մեկը կարող է օգնել դրան, օրինակ Թիմային քաղաք կամ Gitlab CI.

Արդյունքում, ամեն անգամ, երբ ճշգրտումը փոխվում է Git պահոցում, արտեֆակտի կառուցումը ավտոմատ կերպով գործարկվում է: Վերանայման համարը կապված է կառուցման գործարկման հաշվիչի հետ:
Մի քիչ ավելի շատ ժամանակի դեպքում դուք կարող եք կարգավորել արտեֆակտը, որպեսզի ուղարկվի ձեր տեղական փաթեթների պահեստ, Nexus, Artifactory և այլն:

Լրացուցիչ առավելությունն այն է, որ yaml կազմաձևման ֆայլը կարող է միացված լինել Ansible-ին կամ այլ ավտոմատ կազմաձևման համակարգին, և այնտեղից մենք կարող ենք վերցնել տարբերակի համարը և փաթեթի տեսակը, որը ցանկանում ենք տեղակայել:

Ինչ է հաջորդը

Նախագիծը դեռ ավարտված չէ։ Ահա թե ինչի վրա ենք հիմա աշխատում.

  • Մենք ընդլայնում ենք կազմաձևման հնարավորությունը, բայց միևնույն ժամանակ այն հնարավորինս պարզեցնում ենք: Դուք չեք ցանկանում սահմանել հազար պարամետր, եթե ձեզ միայն երկուսն է անհրաժեշտ, իսկ մնացածը տեղավորվում է լռելյայնորեն: Սա ներառում է կոմպիլյացիայի դրոշներ (այժմ դուք կարող եք դրանք փոխել ներքին կազմաձևման ֆայլում՝ src/config.py), տեղադրման ուղին և գործարկման օգտատերը:
  • Մենք ավելացնում ենք տարբերակներ՝ փաթեթն ավտոմատ կերպով տարբեր արտեֆակտ պահոցներ ուղարկելու համար:
  • Մոդուլը բեռնելիս կատարեք հատուկ հրաման (օրինակ՝ օգտագործելու համար github.com/nginx-modules/nginx_upstream_check_module դուք նախ պետք է կիրառեք որոշակի տարբերակի կարկատել)
  • Թեստերի ավելացում.
    • Փաթեթը ճիշտ է տեղադրված։
    • Nginx-ն ունի անհրաժեշտ տարբերակը և կառուցված է անհրաժեշտ դրոշներով և մոդուլներով:
    • Ստեղծվում են անհրաժեշտ ուղիները, հաշիվները և այլն։

Բայց դուք կարող եք օգտագործել այս գործիքը հիմա, ինչպես նաև առաջարկել բարելավումներ. github.com/TinkoffCreditSystems/Nginx-builder բարի գալուստ

Source: www.habr.com

Добавить комментарий