我们用几个命令组装 Nginx

您好!
我叫 Sergey,是 Tinkoff.ru 平台 API 团队的基础设施工程师。

在这篇文章中我将讨论我们团队在准备基于的平衡器时遇到的问题 Nginx的 用于各种项目。 我还将向您介绍帮助我克服大部分问题的工具。

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

我们希望看到一个包含所需模块集、在特定 Linux 发行版下运行的新版本。 在我们的例子中,这些是基于 deb 和 rpm 的系统。 本文不考虑容器选项。

我们希望快速改变平衡器的功能。 那么问题就来了:如何在花费尽可能少的资源的情况下实现这一目标? 最好设置该流程,以便我们可以指定有限数量的输入参数,并在输出处接收所需操作系统的 deb/rpm 包形式的工件。

因此,可以提出许多问题:

  • 并不总是有包含最新版本 Nginx 的软件包。
  • 没有包含所需模块的软件包。
  • 手动编译和构建包非常耗时且乏味。
  • 没有描述这个或那个 Nginx 实例是如何组装的。

为了解决这些问题,需要一种工具,它将人类可读格式的规范作为输入,并基于它组装具有必要功能的 Nginx 包。

在浩瀚的 Github 上没有找到适合我们的选择,我们决定创建自己的工具 - nginx 构建器.

产品规格

在我们的工具中,我们希望以代码的形式创建规范的描述,然后可以将其放入 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 存储库。 您还可以指定分支或标签。
    • 存档网页链接。
    • 存档的本地链接。

某些模块需要安装额外的依赖项,例如 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 系统中的任何一个都可以帮助解决这个问题 团队城市 или 亚特实验室持续集成.

因此,每次 Git 存储库中的规范发生更改时,都会自动启动工件的构建。 修订号链接到构建启动计数器。
再多花一点时间,您就可以配置要发送到本地包存储库、Nexus、Artifactory 等的工件。

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

接下来是什么

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

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

但您现在可以使用这个工具,并且还提出改进建议 - github.com/TinkoffCreditSystems/Nginx-builder 欢迎!

来源: habr.com

添加评论