Мо Nginx-и худро бо якчанд фармон ҷамъ мекунем

Салом!
Номи ман Сергей, ман ҳамчун муҳандиси инфрасохтор дар гурӯҳи API платформаи tinkoff.ru кор мекунам.

Дар ин мақола ман дар бораи мушкилоте гап мезанам, ки дастаи мо ҳангоми тайёр кардани мувозинатҳо дар асоси онҳо дучор мешуданд Nginx барои лоиҳаҳои гуногун. Ман инчунин ба шумо дар бораи асбобе мегӯям, ки ба ман имкон дод, ки аксари онҳоро бартараф кунам.

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

Дар ин ҷо мо нишон медиҳем, ки мо мехоҳем бастаи debро бо версияи Nginx 1.14.2 бо маҷмӯи зарурии модулҳо бубинем. Бахши дорои модулҳо ихтиёрӣ аст. Барои ҳар яки онҳо шумо метавонед муқаррар кунед:

  • Ном.
  • Суроғае, ки шумо метавонед онро дастрас кунед:
    • Анбори 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, ки имрӯз мавҷуданд, метавонанд дар ин кор кӯмак кунанд, масалан 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 хуш омадед!

Манбаъ: will.com

Илова Эзоҳ