Montamos nosso Nginx com alguns comandos

Oi!
Meu nome é Sergey, trabalho como engenheiro de infraestrutura na equipe de API da plataforma tinkoff.ru.

Neste artigo falarei sobre os problemas que nossa equipe enfrentou ao preparar balanceadores baseados em nginx para vários projetos. Também falarei sobre a ferramenta que me permitiu superar a maioria deles.

Nginx é um servidor proxy multifuncional e em desenvolvimento ativo. Possui um grande número de módulos, Essa não é uma lista completa. Cada projeto impõe certos requisitos à funcionalidade do balanceador e à versão do Nginx (por exemplo, a presença de proxy http/2 e grpc) e à composição de seus módulos.

Gostaríamos de ver uma nova versão com o conjunto de módulos necessário, rodando em uma distribuição Linux específica. No nosso caso, estes são sistemas baseados em deb e rpm. A opção com containers não é considerada neste artigo.

Queremos mudar rapidamente a funcionalidade dos nossos balanceadores. E aqui surge imediatamente a questão: como conseguir isso gastando o mínimo de recursos possível? Seria ainda melhor configurar o processo para que possamos definir um número finito de parâmetros de entrada e, na saída, receber um artefato na forma de um pacote deb/rpm para o sistema operacional desejado.

Como resultado, vários problemas podem ser formulados:

  • Nem sempre existem pacotes com a versão mais recente do Nginx.
  • Não há pacotes com os módulos necessários.
  • Compilar e construir um pacote manualmente é demorado e totalmente tedioso.
  • Não há descrição de como esta ou aquela instância do Nginx é montada.

Para resolver esses problemas, surge a necessidade de uma ferramenta que tome como entrada uma especificação em formato legível por humanos e monte um pacote Nginx com as funcionalidades necessárias baseadas nela.

Não encontrando uma opção adequada para nós nas extensões do Github, decidimos criar nossa própria ferramenta - construtor nginx.

Especificações

Em nossa ferramenta, queríamos criar uma descrição da especificação na forma de código, que pode então ser colocada em um repositório Git. Para fazer isso, escolhemos o formato familiar para essas coisas - yaml. Exemplo de especificação:

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

Aqui indicamos que queremos ver um pacote deb com Nginx versão 1.14.2 com o conjunto de módulos necessário. A seção com módulos é opcional. Para cada um deles você pode definir:

  • O nome
  • Endereço onde você pode obtê-lo:
    • Repositório Git. Você também pode especificar uma ramificação ou tag.
    • Arquivar link da web.
    • Link local para o arquivo.

Alguns módulos requerem a instalação de dependências adicionais, por exemplo, nginx-auth-ldap requer libldap2-dev instalado. As dependências necessárias também podem ser especificadas ao descrever o módulo.

Meio ambiente

Em nossa ferramenta você pode obter rapidamente um ambiente com utilitários instalados para compilação, montagem de pacotes e outros softwares auxiliares. Um contêiner Docker com tudo que você precisa é ideal aqui (o repositório já possui alguns exemplos de arquivos Docker para Ubuntu e Centos).

Depois de traçada a especificação e preparado o ambiente, lançamos nosso construtor, tendo previamente instalado suas dependências:

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

O número de revisão aqui é opcional e é usado para versionamento de assemblies. Ele está gravado nas metainformações do pacote, facilitando a atualização nos servidores.
A partir dos logs você pode monitorar o que está acontecendo. Aqui está um exemplo dos pontos 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ão, literalmente, com alguns comandos, criamos o ambiente e o assembly Nginx necessário, e o pacote aparece no diretório de onde o script é iniciado.

Incorporação

Também podemos integrar nossa ferramenta em processos de CI/CD. Qualquer um dos muitos sistemas de CI existentes hoje pode ajudar com isso, por exemplo Cidade da equipe ou CI do Gitlab.

Como resultado, toda vez que a especificação muda no repositório Git, a construção do artefato é iniciada automaticamente. O número de revisão está vinculado ao contador de lançamento do build.
Com um pouco mais de tempo, você pode configurar o artefato para ser enviado ao seu repositório de pacotes local, Nexus, Artifactory e assim por diante.

Uma vantagem adicional é que o arquivo de configuração yaml pode ser conectado ao Ansible ou outro sistema de configuração automática, e a partir daí podemos obter o número da versão e o tipo de pacote que queremos implantar.

Qual é o próximo

O projeto ainda não está concluído. Aqui está o que estamos trabalhando agora:

  • Ampliamos a possibilidade de configuração, mas ao mesmo tempo a mantemos o mais simples possível. Você não quer definir mil parâmetros se precisar apenas de dois e o resto cabe por padrão. Isso inclui sinalizadores de compilação (agora você pode alterá-los no arquivo de configuração interno src/config.py), caminho de instalação e usuário de inicialização.
  • Estamos adicionando opções para enviar automaticamente um pacote para vários repositórios de artefatos.
  • Execute um comando personalizado ao carregar um módulo (por exemplo, para usar github.com/nginx-modules/nginx_upstream_check_module você deve primeiro aplicar um patch de uma versão específica)
  • Adicionando testes:
    • O pacote está instalado corretamente.
    • O Nginx possui a versão necessária e é construído com os sinalizadores e módulos necessários.
    • Os caminhos, contas necessários e assim por diante são criados.

Mas você pode usar esta ferramenta agora e também sugerir melhorias - github.com/TinkoffCreditSystems/Nginx-builder Bem vindo!

Fonte: habr.com

Adicionar um comentário