我們用幾個指令組裝 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 歡迎!

來源: www.habr.com

添加評論