Salut
Je m'appelle Sergey, je travaille comme ingénieur en infrastructure dans l'équipe API de la plateforme tinkoff.ru.
Dans cet article, je parlerai des problèmes rencontrés par notre équipe lors de la préparation des équilibreurs basés sur
Nginx pour divers projets. Je parlerai également de l'outil qui m'a permis de surmonter la plupart d'entre eux.
Nginx est un serveur proxy multifonctionnel et en développement actif. Il a un grand nombre de modules,
mais ce n'est pas une liste complète . Chaque projet impose certaines exigences sur la fonctionnalité de l'équilibreur et la version Nginx (par exemple, la présence de http / 2 et du proxy grpc), et la composition de ses modules.
Nous voulons voir la dernière version avec le bon ensemble de modules, fonctionnant sous une distribution Linux spécifique. Dans notre cas, il s'agit de systèmes basés sur deb et rpm. L'option de conteneur n'est pas considérée dans cet article.
Nous voulons changer rapidement la fonctionnalité de nos équilibreurs. Et ici, la question se pose immédiatement - comment y parvenir en dépensant le moins de ressources possible? Et il serait préférable de configurer le processus afin que nous puissions définir un nombre fini de paramètres d'entrée et obtenir un artefact sous la forme d'un paquet deb / rpm pour le système d'exploitation souhaité à la sortie.
En conséquence, un certain nombre de problèmes peuvent être formulés:
- Il n'y a pas toujours de packages avec la dernière version de Nginx.
- Il n'y a pas de packages avec les bons modules.
- Compiler et assembler un package manuellement prend beaucoup de temps et est simplement fastidieux.
- Il n'y a aucune description de la façon dont une instance Nginx particulière est construite.
Pour résoudre ces problèmes, un certain outil supplie d'accepter une spécification au format lisible par l'homme et de collecter le package Nginx avec les fonctionnalités nécessaires.
N'ayant pas trouvé une option appropriée pour nous dans l'immensité du github, nous avons décidé de créer notre propre outil -
nginx-builder .
Spécifications techniques
Dans notre outil, nous voulions créer une description de spécification sous forme de code, qui peut ensuite être placée dans le référentiel Git. Pour ce faire, nous avons choisi le format habituel pour de telles choses - yaml. Exemple de spécification:
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
Ici, nous indiquons que nous voulons voir un paquet deb avec Nginx version 1.14.2 avec l'ensemble de modules souhaité. La section avec modules est facultative. Pour chacun d'eux, vous pouvez définir:
- Nom.
- Adresse où vous pouvez l'obtenir:
- Dépôt Git. Vous pouvez également spécifier une branche ou une balise.
- Lien Web vers l'archive.
- Lien local vers l'archive.
Certains modules nécessitent l'installation de dépendances supplémentaires, par exemple, nginx-auth-ldap doit être installé libldap2-dev. Les dépendances nécessaires peuvent également être spécifiées dans la description du module.
L'environnement
Dans notre outil, vous pouvez rapidement obtenir un environnement avec des utilitaires installés pour la compilation, la construction d'un package et d'autres logiciels auxiliaires. Ici, le conteneur Docker avec tout ce dont vous avez besoin est le mieux adapté (le référentiel contient déjà quelques exemples de fichiers Docker pour Ubuntu et Centos).
Une fois la spécification compilée et préparée par l'environnement, nous exécutons notre collecteur, en préinstallant ses dépendances:
pip3 install -r requirements.txt ./main.py build -f [_].yaml -r [_]
Le numéro de révision ici est facultatif et sert à la version des assemblys. Il est enregistré dans les méta-informations du package, ce qui facilite sa mise à jour sur les serveurs.
Par les journaux, vous pouvez observer ce qui se passe. Voici un exemple de faits saillants:
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'.
Donc, juste quelques commandes, nous créons l'environnement et l'assembly Nginx souhaité, et le package apparaît dans le répertoire à partir duquel le script s'exécute.
Incorporation
Nous pouvons également intégrer notre outil dans les processus CI / CD. N'importe lequel des nombreux systèmes CI existants, tels que
Teamcity ou
Gitlab CI, peut vous y aider.
Par conséquent, chaque fois que vous modifiez la spécification dans le référentiel Git, l'assemblage de l'artefact démarre automatiquement. Le numéro de révision est lié au compteur de lancement de build.
Après avoir passé un peu plus de temps, vous pouvez configurer l'artefact à envoyer au référentiel de packages local, Nexus, Artifactory, etc.
Un avantage supplémentaire est que le fichier de configuration yaml peut être connecté à Ansible ou à un autre système de configuration automatique, et en prendre le numéro de version et le type de package que nous voulons déployer.
Et ensuite
Le projet n'est pas encore terminé. Voici ce sur quoi nous travaillons actuellement:
- Nous élargissons la possibilité de configuration, mais en même temps, nous la gardons aussi simple que possible. Je ne veux pas définir mille paramètres, si seulement deux sont nécessaires, et le reste convient par défaut. Cela inclut les drapeaux de compilation (vous pouvez maintenant les modifier dans le fichier de configuration interne src / config.py), les chemins d'installation, l'utilisateur à exécuter.
- Ajoutez des options pour envoyer automatiquement le package à divers référentiels d'artefacts.
- Exécution d'une commande utilisateur lors du chargement d'un module (par exemple, pour utiliser github.com/nginx-modules/nginx_upstream_check_module, vous devez d'abord appliquer un correctif d'une certaine version)
- Ajouter des tests:
- Le package est installé correctement.
- Nginx a la bonne version et est compilé avec les drapeaux et modules requis.
- Les chemins, comptes, etc. nécessaires sont créés.
Mais vous pouvez utiliser cet outil maintenant, ainsi que suggérer des améliorations -
Bienvenue sur github.com/TinkoffCreditSystems/Nginx-builder !