Muntem el nostre Nginx amb un parell d'ordres

Hi!
Em dic Sergey, treballo com a enginyer d'infraestructures a l'equip d'API de la plataforma tinkoff.ru.

En aquest article parlaré dels problemes amb què es va enfrontar el nostre equip a l'hora de preparar els equilibradors a partir dels quals Nginx per a diferents projectes. També us parlaré de l'eina que em va permetre superar la majoria d'elles.

Nginx és un servidor intermediari multifuncional i en desenvolupament actiu. Compta amb un gran nombre de mòduls, aquesta no és una llista completa. Cada projecte imposa determinats requisits sobre la funcionalitat de l'equilibrador i la versió de Nginx (per exemple, la presència de http/2 i grpc proxy) i la composició dels seus mòduls.

Ens agradaria veure una versió nova amb el conjunt de mòduls necessaris, que s'executi sota una distribució específica de Linux. En el nostre cas, es tracta de sistemes basats en deb i rpm. L'opció amb contenidors no es considera en aquest article.

Volem canviar ràpidament la funcionalitat dels nostres equilibradors. I aquí de seguida sorgeix la pregunta: com aconseguir-ho gastant el mínim de recursos possible? Seria encara millor configurar el procés perquè puguem especificar un nombre finit de paràmetres d'entrada i a la sortida rebre un artefacte en forma de paquet deb/rpm per al sistema operatiu desitjat.

Com a resultat, es poden plantejar una sèrie de problemes:

  • No sempre hi ha paquets amb la darrera versió de Nginx.
  • No hi ha paquets amb els mòduls necessaris.
  • Compilar i crear un paquet manualment requereix molt de temps i és francament tediós.
  • No hi ha cap descripció de com es munta aquesta o aquella instància de Nginx.

Per resoldre aquests problemes, sorgeix la necessitat d'una eina que prengui com a entrada una especificació en un format llegible per l'home i munti un paquet Nginx amb la funcionalitat necessària basada en ella.

En no trobar una opció adequada per a nosaltres a la immensitat de Github, vam decidir crear la nostra pròpia eina: nginx-builder.

Спецификации

A la nostra eina, volíem crear una descripció de l'especificació en forma de codi, que després es pot posar en un repositori Git. Per fer-ho, vam triar el format familiar per a aquestes coses: yaml. Exemple d'especificació:

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

Aquí us indiquem que volem veure un paquet deb amb la versió 1.14.2 de Nginx amb el conjunt de mòduls necessari. La secció amb mòduls és opcional. Per a cadascun d'ells podeu configurar:

  • Nom.
  • Adreça on pots aconseguir-ho:
    • Repositori Git. També podeu especificar una branca o etiqueta.
    • Arxiu enllaç web.
    • Enllaç local a l'arxiu.

Alguns mòduls requereixen instal·lar dependències addicionals, per exemple, nginx-auth-ldap requereix libldap2-dev instal·lat. Les dependències necessàries també es poden especificar quan es descriu el mòdul.

L’entorn

A la nostra eina podeu obtenir ràpidament un entorn amb utilitats instal·lades per a la compilació, el muntatge de paquets i altres programaris auxiliars. Un contenidor Docker amb tot el que necessiteu és ideal aquí (el dipòsit ja té un parell d'exemples de fitxers Docker per a ubuntu i centos).

Després d'elaborar l'especificació i preparar l'entorn, posem en marxa el nostre constructor, havent instal·lat prèviament les seves dependències:

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

El número de revisió aquí és opcional i s'utilitza per crear versions d'assemblatges. S'escriu a la metainformació del paquet, cosa que facilita l'actualització als servidors.
Des dels registres podeu controlar el que està passant. Aquí teniu un exemple dels punts principals:

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

Per tant, amb només un parell d'ordres, creem l'entorn i el muntatge Nginx necessari, i el paquet apareix al directori des d'on es llança l'script.

Incrustació

També podem integrar la nostra eina als processos CI/CD. Qualsevol dels molts sistemes CI existents avui en dia pot ajudar amb això, per exemple Teamcity o Gitlab CI.

Com a resultat, cada vegada que l'especificació canvia al repositori Git, la compilació de l'artefacte es llança automàticament. El número de revisió està vinculat al comptador de llançament de la compilació.
Amb una mica més de temps, podeu configurar l'artefacte perquè s'enviï al vostre dipòsit de paquets local, Nexus, Artifactory, etc.

Un avantatge addicional és que el fitxer de configuració yaml es pot connectar a Ansible o a un altre sistema de configuració automàtica, i a partir d'aquí podem agafar el número de versió i el tipus de paquet que volem desplegar.

Què és el següent

El projecte encara no està acabat. Això és el que estem treballant ara:

  • Ampliem la possibilitat de configuració, però alhora la mantenim el més senzilla possible. No voleu definir mil paràmetres si només en necessiteu dos, i la resta s'ajusta per defecte. Això inclou senyals de compilació (ara els podeu canviar al fitxer de configuració interna src/config.py), camí d'instal·lació i usuari d'inici.
  • Estem afegint opcions per enviar automàticament un paquet a diversos repositoris d'artefactes.
  • Executeu una ordre personalitzada quan carregueu un mòdul (per exemple, per utilitzar github.com/nginx-modules/nginx_upstream_check_module primer heu d'aplicar un pedaç d'una versió específica)
  • Afegir proves:
    • El paquet està instal·lat correctament.
    • Nginx té la versió necessària i està construït amb els indicadors i mòduls necessaris.
    • Es creen els camins, els comptes, etc. necessaris.

Però podeu utilitzar aquesta eina ara i també suggerir millores: github.com/TinkoffCreditSystems/Nginx-builder Benvingut!

Font: www.habr.com

Afegeix comentari