Assembliamo il nostro Nginx con un paio di comandi

Hi!
Mi chiamo Sergey, lavoro come ingegnere delle infrastrutture nel team API della piattaforma tinkoff.ru.

In questo articolo parlerò dei problemi che il nostro team ha dovuto affrontare durante la preparazione dei bilanciatori basati su Nginx per vari progetti. Ti parlerò anche dello strumento che mi ha permesso di superarne la maggior parte.

Nginx è un server proxy multifunzionale e in sviluppo attivo. È dotato di un gran numero di moduli, questa non è una lista completa. Ogni progetto impone determinati requisiti sulla funzionalità del bilanciatore e sulla versione di Nginx (ad esempio, la presenza di proxy http/2 e grpc) e sulla composizione dei suoi moduli.

Ci piacerebbe vedere una nuova versione con il set di moduli richiesto, in esecuzione sotto una specifica distribuzione Linux. Nel nostro caso, si tratta di sistemi basati su deb e rpm. L'opzione con contenitori non è considerata in questo articolo.

Vogliamo cambiare rapidamente la funzionalità dei nostri bilanciatori. E qui sorge subito la domanda: come raggiungere questo obiettivo spendendo meno risorse possibile? Sarebbe ancora meglio impostare il processo in modo da poter specificare un numero finito di parametri di input e ricevere in output un artefatto sotto forma di pacchetto deb/rpm per il sistema operativo desiderato.

Di conseguenza si possono formulare una serie di problemi:

  • Non sempre ci sono pacchetti con l'ultima versione di Nginx.
  • Non ci sono pacchetti con i moduli richiesti.
  • Compilare e costruire manualmente un pacchetto richiede molto tempo ed è decisamente noioso.
  • Non c'è descrizione di come viene assemblata questa o quella istanza Nginx.

Per risolvere questi problemi, nasce la necessità di uno strumento che prenda come input una specifica in un formato leggibile dall'uomo e assembli un pacchetto Nginx con le funzionalità necessarie basate su di essa.

Non trovando un'opzione adatta a noi nella vastità di Github, abbiamo deciso di creare il nostro strumento: nginx-builder.

Specificazioni

Nel nostro strumento, volevamo creare una descrizione delle specifiche sotto forma di codice, che può poi essere inserito in un repository Git. Per fare ciò, abbiamo scelto il formato familiare a queste cose: yaml. Esempio di specifica:

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

Qui indichiamo che vogliamo vedere un pacchetto deb con Nginx versione 1.14.2 con il set di moduli richiesto. La sezione con i moduli è facoltativa. Per ognuno di essi è possibile impostare:

  • Titolo.
  • Indirizzo dove puoi ottenerlo:
    • Deposito Git. Puoi anche specificare un ramo o un tag.
    • Collegamento web all'archivio.
    • Collegamento locale all'archivio.

Alcuni moduli richiedono l'installazione di dipendenze aggiuntive, ad esempio nginx-auth-ldap richiede libldap2-dev installato. Le dipendenze necessarie possono essere specificate anche durante la descrizione del modulo.

dintorni

Nel nostro strumento puoi ottenere rapidamente un ambiente con utilità installate per la compilazione, l'assemblaggio di pacchetti e altri software ausiliari. Un contenitore Docker con tutto ciò di cui hai bisogno è l'ideale qui (il repository ha già un paio di esempi di file Docker per Ubuntu e Centos).

Dopo aver redatto le specifiche e preparato l'ambiente, lanciamo il nostro builder, dopo aver precedentemente installato le sue dipendenze:

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

Il numero di revisione qui è facoltativo e viene utilizzato per il controllo delle versioni degli assembly. È scritto nelle metainformazioni del pacchetto, facilitando l'aggiornamento sui server.
Dai log puoi monitorare cosa sta succedendo. Ecco un esempio dei punti principali:

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

Quindi, con solo un paio di comandi, creiamo l'ambiente e l'assembly Nginx richiesto e il pacchetto apparirà nella directory da cui viene lanciato lo script.

Incorporamento

Possiamo anche integrare il nostro strumento nei processi CI/CD. Uno qualsiasi dei tanti sistemi CI esistenti oggi può aiutare in questo, ad esempio Teamcity o CI Gitlab.

Di conseguenza, ogni volta che la specifica cambia nel repository Git, la compilazione dell'artefatto viene avviata automaticamente. Il numero di revisione è collegato al contatore di lancio della build.
Con un po' più di tempo, puoi configurare l'artefatto da inviare al repository di pacchetti locale, Nexus, Artifactory e così via.

Un ulteriore vantaggio è che il file di configurazione yaml può essere collegato ad Ansible o ad un altro sistema di configurazione automatica e da lì possiamo prendere il numero di versione e il tipo di pacchetto che vogliamo distribuire.

Cosa c'è Next

Il progetto non è ancora completato. Ecco a cosa stiamo lavorando ora:

  • Espandiamo la possibilità di configurazione, ma allo stesso tempo la manteniamo il più semplice possibile. Non vuoi definire mille parametri se te ne servono solo due e il resto si adatta per impostazione predefinita. Ciò include i flag di compilazione (ora puoi modificarli nel file di configurazione interno src/config.py), il percorso di installazione e l'utente di avvio.
  • Stiamo aggiungendo opzioni per inviare automaticamente un pacchetto a vari repository di artefatti.
  • Esegui un comando personalizzato durante il caricamento di un modulo (ad esempio, per utilizzare github.com/nginx-modules/nginx_upstream_check_module è necessario prima applicare una patch di una versione specifica)
  • Aggiunta di test:
    • Il pacchetto è installato correttamente.
    • Nginx ha la versione richiesta ed è costruito con i flag e i moduli richiesti.
    • Vengono creati i percorsi, gli account e così via necessari.

Ma puoi utilizzare questo strumento ora e anche suggerire miglioramenti: github.com/TinkoffCreditSystems/Nginx-builder benvenuto!

Fonte: habr.com

Aggiungi un commento