Hi!
Ես Սերգեյն եմ, աշխատում եմ որպես ենթակառուցվածքի ինժեներ tinkoff.ru հարթակի API թիմում։
Այս հոդվածում ես կխոսեմ այն խնդիրների մասին, որոնց հետ մեր թիմը բախվել է բալանսավորողներ պատրաստելիս Nginx տարբեր նախագծերի համար։ Ես ձեզ կասեմ նաև այն գործիքի մասին, որը թույլ տվեց ինձ հաղթահարել դրանցից շատերը:
Nginx-ը բազմաֆունկցիոնալ և ակտիվ զարգացող պրոքսի սերվեր է: Այն ունի մեծ թվով մոդուլներ, սա ամբողջական ցանկ չէ. Յուրաքանչյուր նախագիծ որոշակի պահանջներ է դնում հավասարակշռողի և Nginx-ի տարբերակի (օրինակ՝ http/2 և grpc պրոքսիինգի առկայություն) և դրա մոդուլների կազմի վրա։
Մենք կցանկանայինք տեսնել նոր տարբերակ մոդուլների անհրաժեշտ փաթեթով, որն աշխատում է հատուկ Linux բաշխման ներքո: Մեր դեպքում դրանք deb- և rpm-ի վրա հիմնված համակարգեր են: Տարաներով տարբերակը այս հոդվածում դիտարկված չէ:
Մենք ցանկանում ենք արագ փոխել մեր հավասարակշռողների ֆունկցիոնալությունը: Եվ այստեղ անմիջապես հարց է առաջանում՝ ինչպե՞ս հասնել դրան՝ հնարավորինս քիչ ռեսուրսներ ծախսելով։ Ավելի լավ կլիներ գործընթացը կարգավորել այնպես, որ մենք կարողանանք սահմանել սահմանափակ թվով մուտքային պարամետրեր, իսկ ելքում ստանանք արտեֆակտ ցանկալի ՕՀ-ի համար deb/rpm փաթեթի տեսքով:
Արդյունքում կարելի է ձևակերպել մի շարք խնդիրներ.
Միշտ չէ, որ Nginx-ի վերջին տարբերակով փաթեթներ կան:
Պահանջվող մոդուլներով փաթեթներ չկան:
Փաթեթը ձեռքով կազմելն ու կառուցելը ժամանակատար և ուղղակի հոգնեցուցիչ է:
Չկա նկարագրություն, թե ինչպես է հավաքվում այս կամ այն Nginx օրինակը:
Այս խնդիրները լուծելու համար անհրաժեշտություն է առաջանում մի գործիքի, որը որպես մուտքային կվերցնի մարդու համար ընթեռնելի ձևաչափով հստակեցում և դրա վրա հիմնված անհրաժեշտ ֆունկցիոնալությամբ Nginx փաթեթ կհավաքի:
Չգտնելով մեզ համար հարմար տարբերակ GitHub-ի մեծության մեջ, մենք որոշեցինք ստեղծել մեր սեփական գործիքը. nginx-builder.
Տեխնիկական
Մեր գործիքում մենք ցանկանում էինք ստեղծել ճշգրտման նկարագրություն կոդի տեսքով, որը կարող է այնուհետև տեղադրվել Git պահեստում: Դա անելու համար մենք ընտրեցինք նման բաների համար ծանոթ ֆորմատը՝ yaml: Հստակեցման օրինակ.
Այստեղ մենք նշում ենք, որ մենք ցանկանում ենք տեսնել Nginx 1.14.2 տարբերակով deb փաթեթ՝ անհրաժեշտ մոդուլների հավաքածուով: Մոդուլներով բաժինը ընտրովի է: Նրանցից յուրաքանչյուրի համար կարող եք սահմանել.
Անուն
Հասցե, որտեղ կարող եք ձեռք բերել.
Git պահոց. Կարող եք նաև նշել մասնաճյուղ կամ պիտակ:
Արխիվային վեբ հղում:
Տեղական հղում դեպի արխիվ:
Որոշ մոդուլներ պահանջում են լրացուցիչ կախվածություններ տեղադրել, օրինակ՝ nginx-auth-ldap-ը պահանջում է տեղադրել libldap2-dev: Մոդուլը նկարագրելիս կարելի է նշել նաև անհրաժեշտ կախվածությունները:
Շրջապատը
Մեր գործիքում դուք կարող եք արագորեն ստանալ միջավայր կոմպիլյացիայի, փաթեթների հավաքման և այլ օժանդակ ծրագրերով տեղադրված կոմունալ ծառայություններով: Այստեղ իդեալական է Docker կոնտեյները, որն ունի անհրաժեշտ ամեն ինչ (պահեստն արդեն ունի Docker ֆայլերի մի քանի օրինակ ubuntu-ի և centos-ի համար):
Հստակեցումը կազմելուց և միջավայրը պատրաստելուց հետո մենք գործարկում ենք մեր շինարարը՝ նախապես տեղադրելով դրա կախվածությունները.
Վերանայման համարն այստեղ ընտրովի է և օգտագործվում է հավաքների տարբերակների համար: Այն գրված է փաթեթի մետա տեղեկատվության մեջ՝ հեշտացնելով թարմացումը սերվերների վրա:
Տեղեկամատյաններից կարող եք հետևել, թե ինչ է կատարվում: Ահա հիմնական կետերի օրինակ.
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), տեղադրման ուղին և գործարկման օգտատերը:
Մենք ավելացնում ենք տարբերակներ՝ փաթեթն ավտոմատ կերպով տարբեր արտեֆակտ պահոցներ ուղարկելու համար: