Chúng tôi lắp ráp Nginx của mình bằng một vài lệnh

Hi!
Tên tôi là Sergey, tôi làm kỹ sư cơ sở hạ tầng trong nhóm API của nền tảng tinkoff.ru.

Trong bài viết này, tôi sẽ nói về những vấn đề mà nhóm chúng tôi gặp phải khi chuẩn bị bộ cân bằng dựa trên Nginx cho các dự án khác nhau. Tôi cũng sẽ kể cho bạn nghe về công cụ đã cho phép tôi vượt qua hầu hết chúng.

Nginx là một máy chủ proxy đa chức năng và đang phát triển tích cực. Nó có một số lượng lớn các mô-đun, Đây không phải là một danh sách đầy đủ. Mỗi dự án đặt ra các yêu cầu nhất định về chức năng của bộ cân bằng và phiên bản Nginx (ví dụ: sự hiện diện của proxy http/2 và grpc) cũng như thành phần của các mô-đun của nó.

Chúng tôi muốn thấy một phiên bản mới với bộ mô-đun cần thiết, chạy trên một bản phân phối Linux cụ thể. Trong trường hợp của chúng tôi, đây là các hệ thống dựa trên lỗi và vòng/phút. Tùy chọn với vùng chứa không được xem xét trong bài viết này.

Chúng tôi muốn nhanh chóng thay đổi chức năng của bộ cân bằng của mình. Và ở đây câu hỏi ngay lập tức được đặt ra: làm thế nào để đạt được điều này trong khi tiêu tốn ít nguồn lực nhất có thể? Sẽ tốt hơn nữa nếu thiết lập quy trình sao cho chúng ta có thể chỉ định số lượng tham số đầu vào hữu hạn và ở đầu ra sẽ nhận được một thành phần lạ dưới dạng gói deb/rpm cho hệ điều hành mong muốn.

Kết quả là, một số vấn đề có thể được hình thành:

  • Không phải lúc nào cũng có các gói có phiên bản Nginx mới nhất.
  • Không có gói nào có các mô-đun cần thiết.
  • Việc biên dịch và xây dựng một gói theo cách thủ công rất tốn thời gian và hết sức tẻ nhạt.
  • Không có mô tả nào về cách lắp ráp phiên bản Nginx này hoặc phiên bản Nginx kia.

Để giải quyết những vấn đề này, cần có một công cụ lấy thông số kỹ thuật đầu vào ở định dạng mà con người có thể đọc được và lắp ráp gói Nginx với chức năng cần thiết dựa trên nó.

Không tìm được lựa chọn phù hợp cho mình trước sự rộng lớn của Github, chúng tôi quyết định tạo công cụ của riêng mình - nginx-builder.

Thông số kỹ thuật

Trong công cụ của mình, chúng tôi muốn tạo một mô tả về đặc tả dưới dạng mã, sau đó có thể đưa vào kho lưu trữ Git. Để làm điều này, chúng tôi đã chọn định dạng quen thuộc cho những thứ như vậy - yaml. Ví dụ về đặc điểm kỹ thuật:

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

Ở đây chúng tôi chỉ ra rằng chúng tôi muốn xem gói gỡ lỗi với Nginx phiên bản 1.14.2 với bộ mô-đun được yêu cầu. Phần có các mô-đun là tùy chọn. Đối với mỗi người trong số họ, bạn có thể đặt:

  • Tên.
  • Địa chỉ nơi bạn có thể nhận được nó:
    • Kho lưu trữ Git. Bạn cũng có thể chỉ định một nhánh hoặc thẻ.
    • Lưu trữ liên kết web.
    • Liên kết cục bộ đến kho lưu trữ.

Một số mô-đun yêu cầu cài đặt các phần phụ thuộc bổ sung, ví dụ nginx-auth-ldap yêu cầu cài đặt libldap2-dev. Các phụ thuộc cần thiết cũng có thể được chỉ định khi mô tả mô-đun.

Môi trường

Trong công cụ của chúng tôi, bạn có thể nhanh chóng có được một môi trường với các tiện ích được cài đặt để biên dịch, lắp ráp gói và phần mềm phụ trợ khác. Ở đây, một bộ chứa Docker với mọi thứ bạn cần là lý tưởng (kho lưu trữ đã có một vài ví dụ về tệp Docker cho ubuntu và centos).

Sau khi thông số kỹ thuật được soạn thảo và môi trường được chuẩn bị, chúng tôi khởi chạy trình xây dựng của mình, sau khi đã cài đặt các phần phụ thuộc của nó trước đó:

pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]

Số sửa đổi ở đây là tùy chọn và được sử dụng cho các tập hợp phiên bản. Nó được ghi vào thông tin meta của gói, giúp dễ dàng cập nhật trên máy chủ.
Từ nhật ký, bạn có thể theo dõi những gì đang xảy ra. Dưới đây là một ví dụ về những điểm chính:

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

Vì vậy, chỉ với một vài lệnh, chúng ta tạo ra môi trường và tập hợp Nginx cần thiết, đồng thời gói sẽ xuất hiện trong thư mục nơi tập lệnh được khởi chạy.

Nhúng

Chúng tôi cũng có thể tích hợp công cụ của mình vào các quy trình CI/CD. Ví dụ, bất kỳ hệ thống CI nào hiện có đều có thể trợ giúp việc này đội nhóm hoặc CI Gitlab.

Kết quả là, mỗi khi thông số kỹ thuật thay đổi trong kho Git, bản dựng của tạo phẩm sẽ tự động được khởi chạy. Số sửa đổi được liên kết với bộ đếm khởi chạy bản dựng.
Chỉ cần thêm một chút thời gian, bạn có thể định cấu hình thành phần lạ để gửi đến kho lưu trữ gói cục bộ, Nexus, Artifactory, v.v.

Một ưu điểm nữa là tệp cấu hình yaml có thể được kết nối với Ansible hoặc hệ thống cấu hình tự động khác và từ đó chúng ta có thể lấy số phiên bản và loại gói mà chúng ta muốn triển khai.

những gì tiếp theo

Dự án vẫn chưa hoàn thành. Đây là những gì chúng tôi đang làm bây giờ:

  • Chúng tôi mở rộng khả năng cấu hình nhưng đồng thời giữ nó đơn giản nhất có thể. Bạn không muốn xác định hàng nghìn tham số nếu bạn chỉ cần hai tham số và phần còn lại phù hợp theo mặc định. Điều này bao gồm các cờ biên dịch (bây giờ bạn có thể thay đổi chúng trong tệp cấu hình nội bộ src/config.py), đường dẫn cài đặt và khởi chạy người dùng.
  • Chúng tôi đang thêm các tùy chọn để tự động gửi gói đến các kho lưu trữ tạo tác khác nhau.
  • Thực thi lệnh tùy chỉnh khi tải mô-đun (ví dụ: để sử dụng github.com/nginx-modules/nginx_upstream_check_module trước tiên bạn phải áp dụng bản vá của một phiên bản cụ thể)
  • Thêm bài kiểm tra:
    • Gói được cài đặt chính xác.
    • Nginx có phiên bản bắt buộc và được xây dựng với các cờ và mô-đun cần thiết.
    • Các đường dẫn, tài khoản cần thiết, v.v. sẽ được tạo.

Nhưng bạn có thể sử dụng công cụ này ngay bây giờ và cũng có thể đề xuất các cải tiến - github.com/TinkoffCreditSystems/Nginx-builder chào mừng!

Nguồn: www.habr.com

Thêm một lời nhận xét