Biz Nginx-ni bir nechta buyruqlar bilan yig'amiz

Salom!
Mening ismim Sergey, men tinkoff.ru platformasining API jamoasida infratuzilma muhandisi bo'lib ishlayman.

Ushbu maqolada men balanschilarni tayyorlashda jamoamiz duch kelgan muammolar haqida gapiraman nginx turli loyihalar uchun. Men sizga ularning ko'pchiligini engishga imkon bergan vosita haqida ham aytib beraman.

Nginx ko'p funksiyali va faol rivojlanayotgan proksi-serverdir. U juda ko'p sonli modullarga ega, bu to'liq ro'yxat emas. Har bir loyiha balanslashtiruvchining funksionalligi va Nginx versiyasiga (masalan, http/2 va grpc proksi-serverining mavjudligi) va uning modullari tarkibiga ma'lum talablarni qo'yadi.

Biz ma'lum bir Linux tarqatish ostida ishlaydigan kerakli modullar to'plamiga ega yangi versiyani ko'rishni xohlaymiz. Bizning holatlarimizda bu debi va rpmga asoslangan tizimlardir. Konteynerlar bilan variant ushbu maqolada ko'rib chiqilmaydi.

Biz balanschilarimizning funksiyalarini tezda o'zgartirmoqchimiz. Va bu erda darhol savol tug'iladi: iloji boricha kamroq resurslarni sarflagan holda bunga qanday erishish mumkin? Jarayonni chekli miqdordagi kirish parametrlarini o'rnatishimiz va chiqishda kerakli OT uchun deb/rpm paketi ko'rinishidagi artefaktni olishimiz uchun sozlash yanada yaxshi bo'lar edi.

Natijada, bir qator muammolarni shakllantirish mumkin:

  • Nginx-ning so'nggi versiyasiga ega paketlar har doim ham mavjud emas.
  • Kerakli modullarga ega paketlar mavjud emas.
  • Paketni qo'lda kompilyatsiya qilish va qurish ko'p vaqt talab etadi va juda zerikarli.
  • U yoki bu Nginx nusxasi qanday yig'ilganligi haqida hech qanday ta'rif yo'q.

Ushbu muammolarni hal qilish uchun odam o'qiy oladigan formatda spetsifikatsiyani kiritadigan va unga asoslangan kerakli funksionallikka ega Nginx paketini yig'adigan vositaga ehtiyoj tug'iladi.

Github-ning kengligida biz uchun mos variantni topa olmay, biz o'z vositamizni yaratishga qaror qildik - nginx-quruvchi.

Texnik xususiyatlari

Bizning vositamizda biz kod ko'rinishida spetsifikatsiya tavsifini yaratmoqchi edik, uni keyinchalik Git omboriga qo'yish mumkin. Buning uchun biz bunday narsalarga tanish bo'lgan formatni tanladik - yaml. Spetsifikatsiyaga misol:

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

Bu erda biz Nginx 1.14.2 versiyasiga ega deb to'plamini kerakli modullar to'plami bilan ko'rishni xohlayotganimizni bildiramiz. Modulli bo'lim ixtiyoriy. Ularning har biri uchun siz quyidagilarni belgilashingiz mumkin:

  • Ism.
  • Uni olish mumkin bo'lgan manzil:
    • Git ombori. Siz filial yoki tegni ham belgilashingiz mumkin.
    • Arxiv veb havolasi.
    • Arxivga mahalliy havola.

Ba'zi modullar qo'shimcha bog'liqliklarni o'rnatishni talab qiladi, masalan, nginx-auth-ldap libldap2-dev o'rnatilishini talab qiladi. Modulni tavsiflashda zarur bog'liqliklar ham ko'rsatilishi mumkin.

Atrof-muhit

Bizning vositamizda siz kompilyatsiya, paketlarni yig'ish va boshqa yordamchi dasturlar uchun o'rnatilgan yordamchi dasturlarga ega muhitni tezda olishingiz mumkin. Sizga kerak bo'lgan hamma narsaga ega Docker konteyneri bu erda juda mos keladi (omborda allaqachon ubuntu va centos uchun Docker fayllariga bir nechta misollar mavjud).

Spetsifikatsiya tuzilib, atrof-muhit tayyorlangandan so'ng, biz uning bog'liqliklarini oldindan o'rnatgan holda quruvchimizni ishga tushiramiz:

pip3 install -r requirements.txt
./main.py build -f [ΠΊΠΎΠ½Ρ„ΠΈΠ³_Ρ„Π°ΠΉΠ»].yaml -r [Π½ΠΎΠΌΠ΅Ρ€_Ρ€Π΅Π²ΠΈΠ·ΠΈΠΈ]

Bu yerda qayta ko'rib chiqish raqami ixtiyoriy va yig'ilishlarni versiyalash uchun ishlatiladi. U paketning meta-ma'lumotlariga yozilgan bo'lib, serverlarda yangilanishni osonlashtiradi.
Jurnallardan nima bo'layotganini kuzatishingiz mumkin. Mana asosiy fikrlarga misol:

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

Shunday qilib, bir nechta buyruqlar bilan biz muhit va kerakli Nginx yig'ilishini yaratamiz va paket skript ishga tushirilgan katalogda paydo bo'ladi.

OΚ»rnatish

Shuningdek, biz vositamizni CI/CD jarayonlariga integratsiyalashimiz mumkin. Masalan, bugungi kunda mavjud bo'lgan ko'plab CI tizimlarining har biri bunga yordam berishi mumkin Teamcity yoki Gitlab CI.

Natijada, har safar Git omborida spetsifikatsiya o'zgarganda, artefaktni yaratish avtomatik ravishda ishga tushiriladi. Tahrirlash raqami qurilishni ishga tushirish hisoblagichiga bog'langan.
Bir oz ko'proq vaqt o'tgach, siz artefaktni mahalliy paketlar omboriga, Nexus, Artifactory va hokazolarga yuborish uchun sozlashingiz mumkin.

Qo'shimcha afzallik shundaki, yaml konfiguratsiya fayli Ansible yoki boshqa avtomatik konfiguratsiya tizimiga ulanishi mumkin va u erdan biz o'rnatmoqchi bo'lgan versiya raqami va paket turini olishimiz mumkin.

Keyin nima

Loyiha hali tugallanmagan. Mana biz hozir nima ustida ishlayapmiz:

  • Biz konfiguratsiya imkoniyatini kengaytiramiz, lekin ayni paytda uni iloji boricha soddalashtiramiz. Agar sizga faqat ikkita kerak bo'lsa, mingta parametrni belgilashni xohlamaysiz, qolganlari esa sukut bo'yicha mos keladi. Bunga kompilyatsiya bayroqlari (endi ularni src/config.py ichki konfiguratsiya faylida o'zgartirishingiz mumkin), o'rnatish yo'li va ishga tushirish foydalanuvchisi kiradi.
  • Biz paketni turli artefakt omborlariga avtomatik yuborish imkoniyatlarini qo'shmoqdamiz.
  • Modulni yuklashda maxsus buyruqni bajaring (masalan, foydalanish uchun github.com/nginx-modules/nginx_upstream_check_module avval ma'lum bir versiyaning yamog'ini qo'llashingiz kerak)
  • Sinovlarni qo'shish:
    • Paket to'g'ri o'rnatilgan.
    • Nginx kerakli versiyaga ega va kerakli bayroqlar va modullar bilan qurilgan.
    • Kerakli yo'llar, hisoblar va boshqalar yaratiladi.

Ammo siz hozir ushbu vositadan foydalanishingiz mumkin, shuningdek, yaxshilanishlarni taklif qilishingiz mumkin - github.com/TinkoffCreditSystems/Nginx-builder xush kelibsiz!

Manba: www.habr.com

a Izoh qo'shish