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:
Ở đâ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 đó:
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.