いくつかのコマンドを使用して Nginx を組み立てます

Привет!
私の名前は Sergey です。tinkoff.ru プラットフォームの API チームでインフラストラクチャ エンジニアとして働いています。

この記事では、私たちのチームがバランサーを準備するときに直面した問題について説明します。 nginx さまざまなプロジェクトに。 また、それらのほとんどを克服することができたツールについても説明します。

Nginx は、多機能で活発に開発されているプロキシ サーバーです。 多数のモジュールが搭載されているのが特徴で、 これは完全なリストではありません。 各プロジェクトは、バランサーの機能と Nginx のバージョン (http/2 や grpc プロキシの存在など)、およびそのモジュールの構成に特定の要件を課します。

私たちは、特定の Linux ディストリビューションで実行される、必要なモジュールのセットを備えた新しいバージョンを確認したいと考えています。 私たちの場合、これらは deb ベースおよび rpm ベースのシステムです。 この記事では、コンテナーを使用するオプションについては考慮しません。

バランサーの機能をすぐに変更したいと考えています。 そして、ここですぐに疑問が生じます。できるだけ少ないリソースを費やしながらこれを達成するにはどうすればよいでしょうか? 有限数の入力パラメーターを指定し、出力で目的の OS の 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 リポジトリ。 ブランチやタグを指定することもできます。
    • アーカイブ 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 システムはいずれもこれに役立ちます。たとえば、 チームシティ または Gitlab CI.

その結果、Git リポジトリで仕様が変更されるたびに、アーティファクトのビルドが自動的に開始されます。 リビジョン番号はビルド起動カウンターにリンクされています。
もう少し時間があれば、ローカル パッケージ リポジトリ、Nexus、Artifactory などに送信されるようにアーティファクトを構成できます。

さらなる利点は、yaml 設定ファイルを Ansible または別の自動設定システムに接続でき、そこからデプロイするバージョン番号とパッケージ タイプを取得できることです。

次のステップ

プロジェクトはまだ完了していません。 私たちが現在取り組んでいることは次のとおりです。

  • 構成の可能性を広げますが、同時に可能な限りシンプルに保ちます。 必要なパラメータが XNUMX つだけで、残りはデフォルトで適合する場合は、XNUMX 個のパラメータを定義する必要はありません。 これには、コンパイル フラグ (内部構成ファイル src/config.py で変更できるようになりました)、インストール パス、および起動ユーザーが含まれます。
  • さまざまなアーティファクト リポジトリにパッケージを自動的に送信するオプションを追加しています。
  • モジュールをロードするときにカスタム コマンドを実行します (たとえば、 github.com/nginx-modules/nginx_upstream_check_module 最初に特定のバージョンのパッチを適用する必要があります)
  • テストの追加:
    • パッケージは正しくインストールされています。
    • Nginx には必要なバージョンがあり、必要なフラグとモジュールを使用してビルドされています。
    • 必要なパスやアカウントなどが作成されます。

ただし、このツールを今すぐ使用でき、改善を提案することもできます。 github.com/TinkoffCreditSystems/Nginx-builder ようこそ!

出所: habr.com

コメントを追加します