Montamos o noso Nginx cun par de comandos

Ola!
Chámome Sergey, traballo como enxeñeiro de infraestruturas no equipo de API da plataforma tinkoff.ru.

Neste artigo falarei dos problemas aos que se enfrontou o noso equipo á hora de preparar os equilibradores baseados Nginx para diversos proxectos. Tamén vos falarei da ferramenta que me permitiu superar a maioría delas.

Nginx é un servidor proxy multifuncional e en desenvolvemento activo. Presenta un gran número de módulos, esta non é unha lista completa. Cada proxecto impón certos requisitos sobre a funcionalidade do equilibrador e a versión de Nginx (por exemplo, a presenza de http/2 e o proxy grpc) e a composición dos seus módulos.

Gustaríanos ver unha versión nova co conxunto necesario de módulos, que se execute nunha distribución específica de Linux. No noso caso, estes son sistemas baseados en deb e rpm. Neste artigo non se contempla a opción con contedores.

Queremos cambiar rapidamente a funcionalidade dos nosos equilibradores. E aquí xorde inmediatamente a pregunta: como logralo gastando o menor número posible de recursos? Sería aínda mellor configurar o proceso para que poidamos especificar un número finito de parámetros de entrada e na saída recibir un artefacto en forma de paquete deb/rpm para o SO desexado.

Como resultado, pódense formular unha serie de problemas:

  • Non sempre hai paquetes coa última versión de Nginx.
  • Non hai paquetes cos módulos necesarios.
  • Compilar e construír un paquete manualmente leva moito tempo e é francamente tedioso.
  • Non hai ningunha descrición de como se monta esta ou aquela instancia de Nginx.

Para solucionar estes problemas, xorde a necesidade dunha ferramenta que tome como entrada unha especificación nun formato lexible por humanos e monte un paquete Nginx coa funcionalidade necesaria baseada nel.

Non atopando unha opción adecuada para nós na inmensidade de Github, decidimos crear a nosa propia ferramenta: nginx-builder.

Especificacións

Na nosa ferramenta, queriamos crear unha descrición da especificación en forma de código, que despois se pode poñer nun repositorio de Git. Para iso, escollemos o formato familiar para tales cousas: yaml. Exemplo de especificación:

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í indicamos que queremos ver un paquete deb coa versión 1.14.2 de Nginx co conxunto de módulos necesario. A sección con módulos é opcional. Para cada un deles pódese configurar:

  • Nome.
  • Enderezo onde podes conseguilo:
    • Repositorio Git. Tamén pode especificar unha rama ou etiqueta.
    • Arquivo ligazón web.
    • Ligazón local ao arquivo.

Algúns módulos requiren que se instalen dependencias adicionais, por exemplo, nginx-auth-ldap require que se instale libldap2-dev. As dependencias necesarias tamén se poden especificar ao describir o módulo.

Medio Ambiente

Na nosa ferramenta pode obter rapidamente un ambiente con utilidades instaladas para compilación, montaxe de paquetes e outro software auxiliar. Un contedor Docker con todo o que necesitas é ideal aquí (o repositorio xa ten un par de exemplos de ficheiros Docker para ubuntu e centos).

Despois de elaborar a especificación e preparar o entorno, lanzamos o noso constructor, instalando previamente as súas dependencias:

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

O número de revisión aquí é opcional e úsase para a versión de conxuntos. Está escrito na metainformación do paquete, o que facilita a súa actualización nos servidores.
Desde os rexistros pode supervisar o que está a suceder. Aquí tes un exemplo dos puntos principais:

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

Entón, con só un par de comandos, creamos o ambiente e o conxunto Nginx necesario, e o paquete aparece no directorio desde onde se inicia o script.

Incorporación

Tamén podemos integrar a nosa ferramenta nos procesos CI/CD. Calquera dos moitos sistemas CI existentes hoxe en día pode axudar con isto, por exemplo Teamcity ou Gitlab CI.

Como resultado, cada vez que a especificación cambia no repositorio de Git, a compilación do artefacto lánzase automaticamente. O número de revisión está ligado ao contador de lanzamento da compilación.
Cun pouco máis de tempo, podes configurar o artefacto para que se envíe ao teu repositorio de paquetes local, Nexus, Artifactory, etc.

Unha vantaxe adicional é que o ficheiro de configuración de yaml pódese conectar a Ansible ou a outro sistema de configuración automática, e de aí podemos tomar o número de versión e o tipo de paquete que queremos implantar.

Que hai a continuación

O proxecto aínda non está rematado. Aquí está o que estamos a traballar agora:

  • Ampliamos a posibilidade de configuración, pero ao mesmo tempo mantemos o máis sinxelo posible. Non queres definir mil parámetros se só precisas dous, e o resto encaixa por defecto. Isto inclúe marcas de compilación (agora podes cambialas no ficheiro de configuración interno src/config.py), ruta de instalación e usuario de inicio.
  • Estamos engadindo opcións para enviar automaticamente un paquete a varios repositorios de artefactos.
  • Execute un comando personalizado ao cargar un módulo (por exemplo, para usar github.com/nginx-modules/nginx_upstream_check_module primeiro debes aplicar un parche dunha versión específica)
  • Engadindo probas:
    • O paquete está instalado correctamente.
    • Nginx ten a versión necesaria e está construído coas bandeiras e os módulos necesarios.
    • Créanse os camiños, contas, etc. necesarios.

Pero podes usar esta ferramenta agora e tamén suxerir melloras: github.com/TinkoffCreditSystems/Nginx-builder benvida!

Fonte: www.habr.com

Engadir un comentario