Συναρμολογούμε το Nginx μας με μερικές εντολές

Γεια σας!
Ονομάζομαι Σεργκέι, εργάζομαι ως μηχανικός υποδομής στην ομάδα API της πλατφόρμας tinkoff.ru.

Σε αυτό το άρθρο θα μιλήσω για τα προβλήματα που αντιμετώπισε η ομάδα μας κατά την προετοιμασία των balancers με βάση nginx για διάφορα έργα. Θα σας πω επίσης για το εργαλείο που μου επέτρεψε να ξεπεράσω τα περισσότερα από αυτά.

Το Nginx είναι ένας πολυλειτουργικός και ενεργά αναπτυσσόμενος διακομιστής μεσολάβησης. Διαθέτει μεγάλο αριθμό ενοτήτων, αυτή δεν είναι μια πλήρης λίστα. Κάθε έργο επιβάλλει ορισμένες απαιτήσεις σχετικά με τη λειτουργικότητα του εξισορροπητή και την έκδοση του Nginx (για παράδειγμα, την παρουσία του διακομιστή μεσολάβησης http/2 και grpc) και τη σύνθεση των μονάδων του.

Θα θέλαμε να δούμε μια νέα έκδοση με το απαιτούμενο σύνολο μονάδων, που να εκτελείται σε μια συγκεκριμένη διανομή Linux. Στην περίπτωσή μας, αυτά είναι συστήματα που βασίζονται σε deb και rpm. Η επιλογή με δοχεία δεν εξετάζεται σε αυτό το άρθρο.

Θέλουμε να αλλάξουμε γρήγορα τη λειτουργικότητα των εξισορροπητών μας. Και εδώ τίθεται αμέσως το ερώτημα: πώς να το πετύχουμε αυτό, ενώ ξοδεύουμε όσο το δυνατόν λιγότερους πόρους; Θα ήταν ακόμη καλύτερο να ρυθμίσουμε τη διαδικασία έτσι ώστε να μπορούμε να καθορίσουμε έναν πεπερασμένο αριθμό παραμέτρων εισόδου και στην έξοδο να λαμβάνουμε ένα τεχνούργημα με τη μορφή πακέτου deb/rpm για το επιθυμητό λειτουργικό σύστημα.

Ως αποτέλεσμα, μπορούν να διατυπωθούν μια σειρά από προβλήματα:

  • Δεν υπάρχουν πάντα πακέτα με την πιο πρόσφατη έκδοση του Nginx.
  • Δεν υπάρχουν πακέτα με τις απαιτούμενες ενότητες.
  • Η σύνταξη και η κατασκευή ενός πακέτου με το χέρι είναι χρονοβόρα και εντελώς κουραστική.
  • Δεν υπάρχει περιγραφή του τρόπου συναρμολόγησης αυτού ή εκείνου του Nginx.

Για την επίλυση αυτών των προβλημάτων, προκύπτει η ανάγκη για ένα εργαλείο που θα έπαιρνε ως είσοδο μια προδιαγραφή σε μορφή αναγνώσιμη από τον άνθρωπο και θα συναρμολογούσε ένα πακέτο Nginx με την απαραίτητη λειτουργικότητα που θα βασίζεται σε αυτό.

Μη βρίσκοντας την κατάλληλη επιλογή για εμάς στην απεραντοσύνη του Github, αποφασίσαμε να δημιουργήσουμε το δικό μας εργαλείο - nginx-builder.

Προδιαγραφές

Στο εργαλείο μας, θέλαμε να δημιουργήσουμε μια περιγραφή της προδιαγραφής με τη μορφή κώδικα, ο οποίος στη συνέχεια μπορεί να τοποθετηθεί σε ένα αποθετήριο 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).

Αφού καταρτιστεί η προδιαγραφή και προετοιμαστεί το περιβάλλον, ξεκινάμε το builder μας, έχοντας προηγουμένως εγκαταστήσει τις εξαρτήσεις του:

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 που υπάρχουν σήμερα μπορεί να βοηθήσει σε αυτό, για παράδειγμα Teamcity ή Gitlab CI.

Ως αποτέλεσμα, κάθε φορά που αλλάζει η προδιαγραφή στο αποθετήριο Git, εκκινείται αυτόματα το build του artifact. Ο αριθμός αναθεώρησης συνδέεται με τον μετρητή εκκίνησης του build.
Με λίγο περισσότερο χρόνο, μπορείτε να διαμορφώσετε το τεχνούργημα ώστε να αποστέλλεται στο τοπικό αποθετήριο πακέτων, στο Nexus, στο Artifactory και ούτω καθεξής.

Ένα επιπλέον πλεονέκτημα είναι ότι το αρχείο διαμόρφωσης yaml μπορεί να συνδεθεί με το Ansible ή άλλο σύστημα αυτόματης διαμόρφωσης και από εκεί μπορούμε να πάρουμε τον αριθμό έκδοσης και τον τύπο του πακέτου που θέλουμε να αναπτύξουμε.

Ποιο είναι το επόμενο

Το έργο δεν έχει ακόμη ολοκληρωθεί. Εδώ είναι αυτό που εργαζόμαστε τώρα:

  • Επεκτείνουμε τη δυνατότητα διαμόρφωσης, αλλά ταυτόχρονα τη διατηρούμε όσο πιο απλή γίνεται. Δεν θέλετε να ορίσετε χίλιες παραμέτρους εάν χρειάζεστε μόνο δύο και οι υπόλοιπες ταιριάζουν από προεπιλογή. Αυτό περιλαμβάνει σημαίες μεταγλώττισης (τώρα μπορείτε να τις αλλάξετε στο εσωτερικό αρχείο διαμόρφωσης src/config.py), διαδρομή εγκατάστασης και χρήστη εκκίνησης.
  • Προσθέτουμε επιλογές για την αυτόματη αποστολή ενός πακέτου σε διάφορα αποθετήρια τεχνουργημάτων.
  • Εκτελέστε μια προσαρμοσμένη εντολή κατά τη φόρτωση μιας λειτουργικής μονάδας (για παράδειγμα, για χρήση github.com/nginx-modules/nginx_upstream_check_module πρέπει πρώτα να εφαρμόσετε ένα patch μιας συγκεκριμένης έκδοσης)
  • Προσθήκη τεστ:
    • Το πακέτο έχει εγκατασταθεί σωστά.
    • Το Nginx έχει την απαιτούμενη έκδοση και είναι κατασκευασμένο με τις απαιτούμενες σημαίες και ενότητες.
    • Δημιουργούνται οι απαραίτητες διαδρομές, λογαριασμοί κ.λπ.

Αλλά μπορείτε να χρησιμοποιήσετε αυτό το εργαλείο τώρα και επίσης να προτείνετε βελτιώσεις - github.com/TinkoffCreditSystems/Nginx-builder καλώς ήρθες!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο