Биз Nginxти бир нече буйруктар менен чогултабыз

Силерге тынчтык болсун!
Менин атым Сергей, мен tinkoff.ru платформасынын API командасында инфраструктура боюнча инженер болуп иштейм.

Бул макалада мен баланстоочуларды даярдоодо биздин команда туш болгон көйгөйлөр жөнүндө сүйлөшөм жөргөмүш ар кандай долбоорлор үчүн. Мен ошондой эле мага алардын көбүн жеңүүгө мүмкүндүк берген курал жөнүндө айтып берем.

Nginx – көп функциялуу жана активдүү өнүгүп жаткан прокси сервер. Ал көптөгөн модулдарды камтыйт, бул толук тизме эмес. Ар бир долбоор баланстоочунун функционалдуулугуна жана Nginx версиясына (мисалы, http/2 жана grpc проксисинин болушу) жана анын модулдарынын курамына белгилүү талаптарды коёт.

Биз белгилүү бир Linux дистрибуциясында иштеген модулдардын керектүү топтому менен жаңы версиясын көргүбүз келет. Биздин учурда, бул деб- жана rpm негизделген системалар. Бул макалада контейнерлер менен вариант каралбайт.

Биз балансерлерибиздин функцияларын тез арада өзгөрткүбүз келет. Бул жерде дароо суроо туулат: мүмкүн болушунча аз ресурстарды коротуп, буга кантип жетишсе болот? Процессти биз чектүү сандагы киргизүү параметрлерин аныктай тургандай кылып орнотсок, андан да жакшыраак болмок, ал эми чыгууда керектүү ОС үчүн deb/rpm пакети түрүндөгү артефактты алабыз.

Натыйжада, бир катар көйгөйлөрдү түзүүгө болот:

  • Nginxтин акыркы версиясы бар пакеттер дайыма боло бербейт.
  • Керектүү модулдары бар пакеттер жок.
  • Пакетти кол менен түзүү жана куруу көп убакытты талап кылат жана такыр тажатма.
  • Тигил же бул Nginx инстанциясы кантип чогултулганы жөнүндө эч кандай сүрөттөмө жок.

Бул көйгөйлөрдү чечүү үчүн, адам окуй турган форматта спецификацияны киргизе турган жана анын негизинде керектүү функциялуу Nginx пакетин чогулта турган куралга муктаждык пайда болот.

Github'тун кеңдигинен бизге ылайыктуу вариантты таппай, өзүбүздүн куралыбызды түзүүнү чечтик - nginx куруучу.

Техникалык мүнөздөмөлөр

Биздин куралда биз спецификациянын сыпаттамасын код түрүндө түзгүбүз келди, аны 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 версиясы менен талап кылынган модулдар топтомун көргүбүз келет деп көрсөтөбүз. модулдар менен бөлүм милдеттүү эмес. Алардын ар бири үчүн сиз белгилей аласыз:

  • Аты.
  • Кайдан алса болот дареги:
    • Git репозиторий. Сиз ошондой эле бутакты же тегди көрсөтө аласыз.
    • Архивдик веб шилтеме.
    • Архивге жергиликтүү шилтеме.

Кээ бир модулдар кошумча көз карандылыктарды орнотууну талап кылат, мисалы nginx-auth-ldap libldap2-dev орнотулушун талап кылат. Керектүү көз карандылыктарды модулду сүрөттөп жатканда да көрсөтүүгө болот.

г.

Биздин куралда сиз компиляция, пакетти чогултуу жана башка көмөкчү программалык камсыздоо үчүн орнотулган утилиталары бар чөйрөнү тез ала аласыз. Бул жерде сизге керектүү нерселердин баары камтылган Docker контейнери идеалдуу (репозиторийде ubuntu жана centos үчүн Docker файлдарынын бир нече мисалдары бар).

Спецификация түзүлгөндөн жана чөйрө даярдалгандан кийин, биз анын көз карандылыктарын мурда орнотуп алып, куруучубузду ишке киргизебиз:

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 системаларынын кайсынысы болбосун, мисалы, буга жардам бере алат Teamcity же 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

Комментарий кошуу