เรารวบรวม Nginx ของเราด้วยคำสั่งสองสามคำสั่ง

Hi!
ฉันชื่อ Sergey ฉันทำงานเป็นวิศวกรโครงสร้างพื้นฐานในทีม API ของแพลตฟอร์ม tinkoff.ru

ในบทความนี้ ผมจะพูดถึงปัญหาที่ทีมของเราเผชิญเมื่อเตรียมบาลานซ์ตาม Nginx สำหรับโครงการต่างๆ ฉันจะบอกคุณเกี่ยวกับเครื่องมือที่ทำให้ฉันเอาชนะเครื่องมือส่วนใหญ่ได้

Nginx เป็นพร็อกซีเซิร์ฟเวอร์มัลติฟังก์ชั่นและกำลังพัฒนาอย่างแข็งขัน มันมีโมดูลจำนวนมาก นี่ไม่ใช่รายการที่สมบูรณ์. แต่ละโปรเจ็กต์กำหนดข้อกำหนดบางประการเกี่ยวกับการทำงานของบาลานเซอร์และเวอร์ชันของ Nginx (เช่น การมีอยู่ของ http/2 และพร็อกซี grpc) และองค์ประกอบของโมดูล

เราต้องการเห็นเวอร์ชันใหม่พร้อมชุดโมดูลที่จำเป็น ซึ่งทำงานภายใต้การกระจาย Linux ที่เฉพาะเจาะจง ในกรณีของเรา ระบบเหล่านี้คือระบบที่ใช้เดบิตและรอบต่อนาที ตัวเลือกที่มีคอนเทนเนอร์ไม่ได้รับการพิจารณาในบทความนี้

เราต้องการเปลี่ยนฟังก์ชันการทำงานของบาลานเซอร์ของเราอย่างรวดเร็ว และนี่คือคำถามที่เกิดขึ้นทันที: ทำอย่างไรจึงจะบรรลุเป้าหมายนี้โดยใช้ทรัพยากรให้น้อยที่สุด? จะดีกว่าหากตั้งค่ากระบวนการเพื่อให้เราสามารถระบุพารามิเตอร์อินพุตจำนวนจำกัดได้ และที่เอาต์พุตจะได้รับสิ่งประดิษฐ์ในรูปแบบของแพ็คเกจ deb/rpm สำหรับระบบปฏิบัติการที่ต้องการ

เป็นผลให้สามารถกำหนดปัญหาได้หลายประการ:

  • ไม่มีแพ็คเกจที่มี Nginx เวอร์ชันล่าสุดเสมอไป
  • ไม่มีแพ็คเกจที่มีโมดูลที่จำเป็น
  • การคอมไพล์และสร้างแพ็คเกจด้วยตนเองนั้นใช้เวลานานและน่าเบื่ออย่างยิ่ง
  • ไม่มีคำอธิบายเกี่ยวกับวิธีการประกอบอินสแตนซ์ Nginx นี้หรือนั้น

เพื่อแก้ไขปัญหาเหล่านี้ จำเป็นต้องมีเครื่องมือที่จะนำไปใช้เป็นข้อกำหนดอินพุตในรูปแบบที่มนุษย์สามารถอ่านได้ และประกอบแพ็คเกจ Nginx พร้อมฟังก์ชันการทำงานที่จำเป็นตามนั้น

ไม่พบตัวเลือกที่เหมาะสมสำหรับเราบน Github อันกว้างใหญ่ เราจึงตัดสินใจสร้างเครื่องมือของเราเอง - nginx-builder.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

ที่นี่เราระบุว่าเราต้องการดูแพ็คเกจ deb ด้วย Nginx เวอร์ชัน 1.14.2 พร้อมชุดโมดูลที่จำเป็น ส่วนที่มีโมดูลเป็นทางเลือก คุณสามารถตั้งค่าสำหรับแต่ละรายการได้:

  • ชื่อ
  • ที่อยู่ที่คุณสามารถรับได้:
    • พื้นที่เก็บข้อมูล Git คุณยังสามารถระบุสาขาหรือแท็กได้
    • ลิงค์เว็บเก็บถาวร
    • ลิงก์ท้องถิ่นไปยังไฟล์เก็บถาวร

บางโมดูลจำเป็นต้องติดตั้งการพึ่งพาเพิ่มเติม เช่น nginx-auth-ldap จำเป็นต้องติดตั้ง libldap2-dev การขึ้นต่อกันที่จำเป็นสามารถระบุได้เมื่ออธิบายโมดูล

สิ่งแวดล้อม

ในเครื่องมือของเรา คุณสามารถรับสภาพแวดล้อมพร้อมยูทิลิตี้ที่ติดตั้งไว้สำหรับการคอมไพล์ การประกอบแพ็คเกจ และซอฟต์แวร์เสริมอื่นๆ ได้อย่างรวดเร็ว คอนเทนเนอร์ Docker ที่มีทุกสิ่งที่คุณต้องการเหมาะอย่างยิ่งที่นี่ (พื้นที่เก็บข้อมูลมีตัวอย่างไฟล์ Docker สำหรับ Ubuntu และ Centos อยู่สองสามตัวอย่างแล้ว)

หลังจากที่ร่างข้อกำหนดและเตรียมสภาพแวดล้อมแล้ว เราจะเปิดตัวตัวสร้างของเรา โดยได้ติดตั้งการขึ้นต่อกันไว้ก่อนหน้านี้แล้ว:

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 หรือระบบการกำหนดค่าอัตโนมัติอื่นได้ และจากนั้นเราสามารถใช้หมายเลขเวอร์ชันและประเภทแพ็คเกจที่เราต้องการปรับใช้

มีอะไรต่อไป

โครงการยังไม่แล้วเสร็จ นี่คือสิ่งที่เรากำลังทำอยู่ตอนนี้:

  • เราขยายความเป็นไปได้ของการกำหนดค่า แต่ในขณะเดียวกันก็ทำให้มันง่ายที่สุดเท่าที่จะทำได้ คุณไม่ต้องการกำหนดพารามิเตอร์นับพันหากคุณต้องการเพียงสองตัว และส่วนที่เหลือจะพอดีตามค่าเริ่มต้น ซึ่งรวมถึงแฟล็กการคอมไพล์ (ตอนนี้คุณสามารถเปลี่ยนได้ในไฟล์คอนฟิกูเรชันภายใน src/config.py) พาธการติดตั้ง และผู้ใช้ที่เปิดใช้งาน
  • เรากำลังเพิ่มตัวเลือกสำหรับการส่งแพ็กเกจไปยังที่เก็บอาร์ติแฟกต์ต่างๆ โดยอัตโนมัติ
  • ดำเนินการคำสั่งแบบกำหนดเองเมื่อโหลดโมดูล (เช่น เมื่อต้องการใช้ github.com/nginx-modules/nginx_upstream_check_module คุณต้องใช้แพทช์ของเวอร์ชันเฉพาะก่อน)
  • การเพิ่มการทดสอบ:
    • มีการติดตั้งแพ็คเกจอย่างถูกต้อง
    • Nginx มีเวอร์ชันที่ต้องการและสร้างขึ้นด้วยแฟล็กและโมดูลที่จำเป็น
    • มีการสร้างเส้นทาง บัญชี และอื่นๆ ที่จำเป็น

แต่คุณสามารถใช้เครื่องมือนี้ได้ทันทีและยังแนะนำการปรับปรุงอีกด้วย - github.com/TinkoffCreditSystems/Nginx-builder ยินดีต้อนรับ!

ที่มา: will.com

เพิ่มความคิดเห็น