将您的Nginx放在一起

你好
我叫Sergey,我是tinkoff.ru平台API团队的基础架构工程师。

在本文中,我将讨论我们的团队在为各种项目准备基于Nginx的平衡器时遇到的问题。 我还将讨论使我克服其中大多数问题的工具。

Nginx是一个多功能且积极开发的代理服务器。 它具有大量模块, 但这不是完整列表 。 每个项目都对平衡器和Nginx版本的功能(例如,http / 2和代理grpc的存在)及其模块组成施加了某些要求。

我们希望看到在特定Linux发行版下工作的具有正确模块集的最新版本。 在我们的案例中,这些是基于deb和rpm的系统。 本文不考虑容器选项。

我们希望快速更改平衡器的功能。 在这里,问题立即出现了-如何通过尽可能少地花费资源来实现这一目标? 而且最好设置该过程,以便我们可以设置有限数量的输入参数,并在输出处获得所需OS的deb / rpm软件包形式的工件。

结果,可以提出许多问题:

  • 并非总是带有最新版本的Nginx的软件包。
  • 没有带有正确模块的软件包。
  • 手动编译和组装程序包需要花费大量时间,并且非常乏味。
  • 没有关于如何构建特定Nginx实例的描述。

为了解决这些问题,一个工具乞求接受人类可读格式的规范,并收集具有必要功能的Nginx软件包。

在庞大的github中找不到适合我们的选项之后,我们决定创建自己的工具-nginx-builder

技术指标


在我们的工具中,我们希望以代码形式创建一个规范描述,然后可以将其放入Git存储库中。 为此,我们选择了这种格式的常用格式-yaml。 规格示例:

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 

在这里,我们表明我们希望看到具有所需模块集的Nginx版本1.14.2的deb软件包。 带有模块的部分是可选的。 您可以为每个设置:

  • 名字
  • 地址,在哪里可以得到它:
    • Git存储库。 您还可以指定分支或标签。
    • Web链接到存档。
    • 到存档的本地链接。

一些模块需要安装其他依赖项,例如,nginx-auth-ldap需要安装libldap2-dev。 必要的依赖关系也可以在模块的描述中指定。

环境


在我们的工具中,您可以快速获得一个带有已安装实用程序的环境,用于编译,构建软件包和其他辅助软件。 在这里,具有所需容器的docker容器是最合适的(存储库中已经有一些ubuntu和centos的docker文件示例)。

在环境编译并准备好规范之后,我们运行收集器,预安装其依赖项:

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

此处的修订号是可选的,用于版本装配。 它记录在包的元信息中,从而可以轻松在服务器上对其进行更新。
通过日志,您可以观察发生了什么。 这是一个重点示例:

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

因此,我们仅需几个命令就可以创建环境和所需的Nginx程序集,并且该程序包将显示在运行脚本的目录中。

嵌入


我们还可以将我们的工具嵌入CI / CD流程中。 现有的许多CI系统中的任何一种,例如TeamcityGitlab CI,都可以帮助解决这一问题。

结果,每次在Git存储库中更改规范时,工件的组装就会自动开始。 版本号与构建启动计数器绑定。
花了更多时间后,您可以配置工件以将其发送到本地软件包存储库,Nexus,Artifactory等。

另一个好处是,配置yaml文件可以连接到Ansible或其他自动配置系统,并从中获取我们要部署的软件包的版本号和类型。

接下来是什么


该项目尚未完成。 这是我们现在正在做的事情:

  • 我们扩大了配置的可能性,但同时又使其尽可能地简单。 如果只需要两个参数,则我不想定义一千个参数,其余的默认情况下适用。 这包括编译标志(现在您可以在内部配置文件src / config.py中对其进行更改),安装路径,要运行的用户。
  • 添加用于将软件包自动发送到各种工件存储库的选项。
  • 加载模块时执行用户命令(例如,要使用github.com/nginx-modules/nginx_upstream_check_module,必须首先应用特定版本的补丁程序)
  • 添加测试:
    • 该软件包已正确安装。
    • Nginx具有正确的版本,并使用必需的标志和模块进行编译。
    • 创建了必要的路径,帐户等。

但是您现在就可以使用该工具,并进行改进-github.com/TinkoffCreditSystems/Nginx-builder很好

Source: https://habr.com/ru/post/zh-CN452336/


All Articles