Juntando o seu Nginx

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 vou falar sobre a ferramenta que me permitiu superar a maioria deles.

O Nginx é um servidor proxy multifuncional e com desenvolvimento ativo. Possui um grande número de módulos, mas esta 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 http / 2 e proxying grpc) e a composição de seus módulos.

Queremos ver a versão mais recente com o conjunto certo de módulos, trabalhando sob uma distribuição específica do Linux. No nosso caso, estes são sistemas baseados em deb e rpm. A opção de contêiner não é considerada neste artigo.

Queremos alterar rapidamente a funcionalidade de nossos balanceadores. E aqui surge a pergunta imediatamente - como conseguir isso gastando o mínimo de recursos possível? E seria melhor configurar o processo para que possamos definir um número finito de parâmetros de entrada e obter um artefato na forma de um pacote deb / rpm para o sistema operacional desejado na saída.

Como resultado, vários problemas podem ser formulados:

  • Nem sempre há pacotes com a versão mais recente do Nginx.
  • Não há pacotes com os módulos certos.
  • Compilar e montar um pacote manualmente leva muito tempo e é simplesmente entediante.
  • Não há descrição de como uma instância específica do Nginx é criada.

Para resolver esses problemas, uma certa ferramenta implora para aceitar uma especificação em formato legível por humanos e coletar o pacote Nginx com a funcionalidade necessária.

Como não encontramos uma opção adequada para nós na vastidão do github, decidimos criar nossa própria ferramenta - nginx-builder .

Especificações


Em nossa ferramenta, queríamos criar uma descrição de especificação na forma de código, que pode ser colocada no repositório Git. Para fazer isso, escolhemos o formato usual 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 o Nginx versão 1.14.2 com o conjunto de módulos desejado. A seção com módulos é opcional. Para cada um deles, você pode definir:

  • Name.
  • Endereço onde você pode obtê-lo:
    • Repositório Git. Você também pode especificar uma ramificação ou marca.
    • Link da Web para o arquivo morto.
    • Link local para o arquivo.

Alguns módulos requerem a instalação de dependências adicionais, por exemplo, o nginx-auth-ldap precisa do libldap2-dev instalado. Dependências necessárias também podem ser especificadas na descrição do módulo.

O meio ambiente


Em nossa ferramenta, você pode obter rapidamente um ambiente com utilitários instalados para compilar, criar um pacote e outro software auxiliar. Aqui, o contêiner do docker com tudo o que você precisa é o mais adequado (o repositório já possui alguns exemplos de arquivos do docker para ubuntu e centos).

Após a especificação ser compilada e preparada pelo ambiente, executamos nosso coletor, pré-instalando suas dependências:

 pip3 install -r requirements.txt ./main.py build -f [_].yaml -r [_] 

O número da revisão aqui é opcional e serve para montagens de versão. Ele é registrado nas meta-informações do pacote, o que facilita a atualização nos servidores.
Pelos logs, você pode observar o que está acontecendo. Aqui está um exemplo de destaques:

 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, apenas alguns comandos, criamos o ambiente e o assembly Nginx desejado, e o pacote aparece no diretório em que o script está sendo executado.

Incorporação


Também podemos incorporar nossa ferramenta nos processos de CI / CD. Qualquer um dos muitos sistemas de IC existentes, como o Teamcity ou o Gitlab CI, pode ajudar nisso.

Como resultado, toda vez que você altera a especificação no repositório Git, a montagem do artefato é iniciada automaticamente. O número da revisão está vinculado ao contador de lançamento da compilação.
Depois de passar mais tempo, você pode configurar o artefato para ser enviado ao repositório de pacotes local, Nexus, Artifactory, etc.

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

O que vem a seguir


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

  • Expandimos a possibilidade de configuração, mas ao mesmo tempo mantemos o mais simples possível. Não quero definir mil parâmetros, se apenas dois forem necessários, e o restante é adequado por padrão. Isso inclui sinalizadores de compilação (agora você pode alterá-los no arquivo de configuração interno src / config.py), caminhos de instalação, usuário a executar.
  • Inclua opções para enviar automaticamente o pacote para vários repositórios de artefatos.
  • Executando um comando de usuário 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 determinada versão)
  • Adicionar teste:
    • O pacote está instalado corretamente.
    • O Nginx possui a versão correta e é compilado com os sinalizadores e módulos necessários.
    • Os caminhos, contas e assim por diante necessários são criados.

Mas você pode usar essa ferramenta agora e sugerir melhorias - github.com/TinkoffCreditSystems/Nginx-builder bem- vindo!

Source: https://habr.com/ru/post/pt452336/


All Articles