מדריך: כך תקצרו תהליכי פיתוח באמצעות כלי NGINX

לאחרונה עולה המודעות בקהילת הפיתוח ליכולת שמאפשרת לקצר תהליכים בפיתוח, להוסיף קוד קיים ולטפל בתרחישים נפוצים בצורה מהירה. כך תשתמשו בה גם אתם

כך תוכלו להוסיף גמישות ולהרחיב את האפליקציה שלכם (צילום: Dreamstime)

מאת סורין בויאנגיו, מהנדס פתרונות ב-F5

פלטפורמת NGINX ודאי מוכרת לכם כשרת WEB ו-PROXY מבוסס קוד פתוח, המעשיר את יכולות האפליקציה. לאחרונה עולה המודעות בקהילת הפיתוח ליכולת הפיתוח של Middleware באמצעות כלי NGINX: יכולת זו מאפשרת, באמצעות שפת תכנות מוכרת ונפוצה, לקצר תהליכים בפיתוח, להוסיף קוד קיים ולטפל בתרחישים נפוצים בצורה מהירה ובדוקה.

במאמר זה נספק כמה דוגמאות ליישומים שיכולים לפשט או לקצר תהליכים בפיתוח אפליקציות ומתן שירותים נוספים על גביהן.

העקרונות שיעזרו לכם

לאורך השנים פיתחה הקהילה תוספות רבות מבוססות שפת תכנות LUA לפלטפורמה. עם זאת, סט הכלים של המפתחת או איש ה-DevOps לא תמיד כולל ידע אודות השפה עצמה, שאינה נמצאת בשימוש נרחב.

NGINX JavaScript, או בקיצור NJS, היא אימפלמנטציה ייחודית שרצה בצד שרת כ-Middleware.יNJS מרחיבה את היכולות המובנות שקיימות ב-NGINX באמצעות שפת פיתוח שנפוצה בקהילת המפתחים. המטרה של NJS היא לספק כלים נוחים לפיתוח ארכיטקטורות מורכבות או להרחבת יכולות האפליקציה.

על מנת לספק ביצועים מקסימליים פותחו כמה עקרונות בפלטפורמה:

  • סביבת ה-Runtime מוקמת עם כל בקשה: אתחול ה-Runtime הוא מאד מהיר ואין צורך בשיטות מורכבות לניהול הזיכרון.
  • Non-Blocking Code: כאשר מבוצעת פעולת Blocking כגון בקשה לשירות חיצוני, NJS משהה את ה-VM שבו הקוד רץ עד לקבלת תשובה מהשירות החיצוני. המשמעות היא שניתן לפתח לוגיקה ללא התחשבות בהשפעתם של שירותים חיצוניים על המערכת.
  • ECMAScript 5.1/6 specification: הנה רשימת הפונקציות הנתמכות בפורמט.
  • אינטגרציה מלאה עם NGINX Processing Phase:
Stream ModuleHTTP ModuleProcessing Phase
js_accesauth_request and js_contentAccess – Authentication and access control
js_prereadN/APre-read – Read/write payload
js_filterjs_body_filter
js_header_filter
Filter – Read/write response during proxy
N/Ajs_contentContent – Send response to client
js_setjs_setLog / Variables – Evaluated on demand

איך להתחיל עם NGINX JavaScript?

NJS הוא מודול שמתווסף ל-NGINX, לכן יש צורך להתקין אותו בנפרד:

  • Ubuntu ו-Debian:
    sudo apt-get install nginx-module-njs $
  • Red Hat ,CentOS ו-Oracle Linux:
    sudo yum install nginx-module-njs $

בקובץ NGINX.CONF תחת ה-Context הראשי, יש להוסיף את השורות הבאות אשר יביאו לטעינה של מודול ה-NJS:

load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;

קדימה, לעבודה

דוגמה טובה ליכולת ה-NJS היא ביצוע בדיקה לתוכן הבקשות שמגיעות מהמשתמש. תוקפים יכולים לנצל את ערוצי ה-API של האפליקציה ולנסות לפרוץ באמצעות שימוש בשיטות של Buffer overflow ומידע לא תקין, שיגרמו להתנהגות לא צפויה בצד האפליקציה והיא תחשוף מידע רגיש או אפילו תספק גישת BASH לתוקף.

באמצעות היכולות של NJS נוכל לבדוק שהמידע בפורמט JSON תקין, ובמקרה שלא – נוכל לחסום את הבקשה. את קוד ה-NJS שלנו נשמור בקובץ נפרד שנקרא לו JSON_VALIDATION.JS. פונקציית ה-parseRequestBody תבדוק אם התוכן הוא בפורמט JSON על ידי שימוש במתודה JSON.parse. אם הכל תקין, היא תחזיר את קבוצת השרתים שצריכים להעביר אליה את התעבורה, ואם לא – היא תחזיר מיקום פנימי ב-NGINX, שבתורה תחזיר הודעת שגיאה.

export default { parseRequestBody };
 
function parseRequestBody(r) {
    try {
        if (r.variables.request_body) {
            JSON.parse(r.variables.request_body);
        }
        return r.variables.upstream;
    } catch (e) {
        r.error('JSON.parse exception');
        return '127.0.0.1:10415'; // Address for error response
    }
}

 

על מנת שנוכל לעשות שימוש בקוד שלנו אנחנו צריכים לעשות לו Import תחת ה-HTTP context. בכל פעם שנתייחס לפרמטר json_validated$ הפונקציה שלנו תרוץ.

js_import json_validation.js;
js_set $json_validated json_validation.parseRequestBody;

כפי שניתן לראות תחת הקונפיגורציה של ה-proxy_pass, אנחנו קוראים למשתנה json_validated$ שגורם לקריאת הפונקציה שלנו ומחזיר את התוצאה.

location /api/warehouse/pricing {
    set $upstream warehouse_pricing;
    mirror /_get_request_body;        # Force early read
    client_body_in_single_buffer on;  # Minimize memory copy operations 
                                      # on request body
    client_body_buffer_size      16k; # Largest body to keep in memory 
                                      # (before writing to file)
    client_max_body_size         16k;
    proxy_pass http://$json_validated$request_uri;
}

כמו כן, אנחנו צריכים להגדיר את המיקום שמטפל בהחזרת הודעת שגיאה.

server {
    location / {
        return 415 '{"status":415,"message":"Unsupported media type"}\n';
    }    
}

בעזרת קונפיגורציה פשוטה, בשילוב NJS, אנחנו יכולים להגן על השירותים שלנו ואפילו להרחיב את יכולות האפליקציה במידת הצורך.

הנה דוגמה לתשובה לקריאה תקינה:

$ curl -iX POST -d '{"sku":"item002","price":85.00}' https://api.example.com/api/warehouse/pricing
HTTP/1.1 201 Created
Server: nginx/1.19.5
Location: /api/warehouse/pricing/item002

והנה דוגמה לתשובה לקריאה לא תקינה עם מידע שלא בפורמט JSON:

$ curl -X POST -d 'item002=85.00' https://api.example.com/api/warehouse/pricing
{"status":415,"message":"Unsupported media type"}

 

הקהילה הוסיפה וכתבה בעצמה כמה יישומים אפשריים, ובחיפוש קצר בגוגל ניתן למצוא פתרונות נוספים שקיימים ב-NJS:

עבודה בשיטה זו מספקת גמישות ויכולת להרחבת האפליקציה שלכם, תוך שימוש בשפה מוכרת על ידי הקהילה. אם יש לכם דוגמאות נוספות לפתרונות שבניתם בעצמכם, כתבו לנו בתגובות.

הכתבה בחסות F5

F5 הינה חברה לאבטחת יישומים והעברתם בסביבות רב-ענניות, המאפשרת ללקוחות, הכוללים את הארגונים הגדולים בעולם, מוסדות פיננסיים, ספקי שירותים וממשלות – לספק חוויות דיגיטליות יוצאות מהכלל. בשנתיים האחרונות, חברת F5 רכשה את החברות NGINX ו-Shape Security ו-Volterra, ושילבה אותם באופן אורגני עם פתרונותיה. מרכז הפיתוח הישראלי של F5, הממוקם בתל אביב, מעסיק כ-300 עובדים. המרכז אחראי על פיתוח פתרונות אבטחת המידע של החברה. פתרונות החברה הוטמעו בקרב הארגונים הגדולים בישראל.

כתב אורח

אנחנו מארחים מפעם לפעם כותבים טכנולוגים אורחים, המפרסמים כתבות בתחומי התמחות שלהם. במידה ואתם מעוניינים לפרסם פוסט בשמכם, פנו אלינו באמצעות טופס יצירת קשר באתר.

הגב

4 תגובות על "מדריך: כך תקצרו תהליכי פיתוח באמצעות כלי NGINX"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 

* היי, אנחנו אוהבים תגובות!
תיקונים, תגובות קוטלות וכמובן תגובות מפרגנות - בכיף.
חופש הביטוי הוא ערך עליון, אבל לא נוכל להשלים עם תגובות שכוללות הסתה, הוצאת דיבה, תגובות שכוללות מידע המפר את תנאי השימוש של Geektime, תגובות שחורגות מהטעם הטוב ותגובות שהן בניגוד לדין. תגובות כאלו יימחקו מייד.

סידור לפי:   חדש | ישן | הכי מדורגים
חוליו
Guest

למדתי משהו

עמית מרכס
Guest

היתה לנו חוויה נוראית מnjs.
בעיקר כשניסינו לעבוד בצורה מקבילית על יותר מאשר 50 בקשות במקביל.
להבנתנו, בעקבות המשתנה הזה:

https://github.com/nginx/nginx/blob/0a683fdd9313b9796bf39442fd117beaa63a7157/src/http/ngx_http_request.h?fbclid=IwAR0VXsuElBYrdcT6VeVNpVBOfjoo6S0nLo2Elif7mpMD50A4Pwn-r64pDtg#L13

אור
Guest

מוזמן לפנות לכותב על מנת לבדוק את הנושא. הכלי תופס תאוצה וכמו כל דבר מן הסתם ענין של לימוד

הדיות
Guest

סוף סוף תוכן ממומן שנותן ערך. תודה

wpDiscuz

תגיות לכתבה: