סביבת זמן הריצה של Node.js היא מחסנית התוכנה שאחראית להתקנה של קוד שירות האינטרנט והתלויות שלו, ולהרצת השירות.
זמן הריצה של Node.js ב-App Engine בסביבה הרגילה מוצהר בקובץ app.yaml:
runtime: nodejsVERSION
כאשר VERSION הוא מספר הגרסה של Node.js MAJOR. לדוגמה, כדי להשתמש בגרסה האחרונה של Node.js, Node.js 24, מציינים 24.
לגרסאות נתמכות אחרות של Node.js ולגרסת Ubuntu התואמת לגרסת Node.js שלכם, אפשר לעיין בלוח הזמנים לתמיכה בזמן ריצה.
גרסת Node.js
הגרסה העדכנית ביותר של Node.js שנתמכת היא 24. Node.js runtime משתמש בגרסה היציבה האחרונה של הגרסה שצוינה בקובץ app.yaml. App Engine מתעדכן אוטומטית לגרסאות חדשות של תיקוני אבטחה וגרסאות משניות, אבל הוא לא מתעדכן אוטומטית לגרסה ראשית.
לדוגמה, יכול להיות שהאפליקציה שלכם נפרסה ב-Node.js 10.9.4 ומעלה, והיא תתעדכן אוטומטית לגרסה 10.10.0, אבל היא לא תתעדכן אוטומטית ל-Node.js 12.x.x.
מכיוון שגרסאות משניות וגרסאות תיקון מתעדכנות באופן אוטומטי, אם הן קיימות, המאפיין engines.node בקובץ package.json יכול לציין רק את הגרסה הראשית ולהיות תואם לגרסת Node.js שצוינה בקובץ app.yaml.
לדוגמה, עבור 24:
24.x.x^24.0.0~24>=6
אם תציינו גרסת Node.js לא תואמת בקובץ package.json, הפריסה תיכשל ותוצג הודעת שגיאה.
תלויות
במהלך הפריסה, סביבת זמן הריצה מתקינה את יחסי התלות באמצעות הפקודה npm install. סביבת זמן הריצה תומכת גם במנהלי החבילות Yarn (yarn.lock) ו-Pnpm (pnpm-lock.yaml).
מידע נוסף זמין במאמר Specifying Dependencies.
מכיוון שסביבת זמן הריצה מבצעת התקנה חדשה, אין צורך להעלות את התיקייה node_modules.
כדי לתמוך בחבילות Node.js שדורשות תוספים מקוריים, זמן הריצה כולל חבילות מערכת שמאפשרות לכם להשתמש בכלים כמו ImageMagick, FFmpeg ו-Chrome headless. אפשר לעיין ברשימה המלאה של החבילות במאמר חבילות מערכת כלולות. כדי לבקש חבילה, צריך לדווח על בעיה בכלי למעקב אחר בעיות.
סקריפט build של NPM
כברירת מחדל, כשפורסים את האפליקציה ב-App Engine, סביבת זמן הריצה של Node.js מפעילה את npm run build אם מזוהה סקריפט build ב-package.json. אם אתם צריכים שליטה נוספת בשלבי הבנייה לפני הפעלת האפליקציה, אתם יכולים לספק שלב בנייה בהתאמה אישית על ידי הוספת סקריפט gcp-build לקובץ package.json.
כדי למנוע את הרצת הסקריפט npm run build ב-build, צריך:
- מוסיפים סקריפט
gcp-buildעם ערך ריק לקובץpackage.json:"gcp-build":"". פרטים על הגדרתpackage.jsonזמינים במאמר הגדרות של Node.js buildpacks. מוסיפים את משתנה הסביבה של ה-build
GOOGLE_NODE_RUN_SCRIPTSעם ערך ריק לקובץapp.yaml.build_env_variables: GOOGLE_NODE_RUN_SCRIPTS: ''
build_env_variables בקובץ app.yaml.
הפעלת האפליקציה
כברירת מחדל, סביבת זמן הריצה מפעילה את האפליקציה על ידי הרצת node server.js.
אם מציינים סקריפט start בקובץ package.json, סביבת זמן הריצה מפעילה את סקריפט ההתחלה שצוין במקום זאת. לדוגמה:
"scripts": {
"start": "node app.js"
}
כדי שהאפליקציה תקבל בקשות HTTP, סקריפט start צריך להפעיל שרת אינטרנט שמקשיב למארח 0.0.0.0 ולפורט שצוין על ידי PORT
משתנה הסביבה, שאפשר לגשת אליו ב-Node.js בתור process.env.PORT.
כדי להשיג את הביצועים הכי טובים, הסקריפט start צריך להיות קל משקל ולא לכלול שלבי build, כי הוא מופעל בכל פעם שנוצר מופע חדש של האפליקציה.
כדי לשנות את שיטת הפעולה הזאת, אפשר לציין סקריפט בשדה entrypoint ב-app.yaml. במקום להריץ את הפקודה node server.js או סקריפט הפעלה, סביבת זמן הריצה מפעילה את האפליקציה באמצעות הפקודה שצוינה ב-entrypoint.
משתני סביבה
משתני הסביבה הבאים מוגדרים על ידי זמן הריצה:
| משתנה הסביבה | תיאור |
|---|---|
GAE_APPLICATION
|
המזהה של אפליקציית App Engine. המזהה הזה מתחיל בקידומת region code~, למשל e~ לאפליקציות שמוצבות באירופה. |
GAE_DEPLOYMENT_ID |
המזהה של הפריסה הנוכחית. |
GAE_ENV |
סביבת App Engine. ההגדרה היא standard. |
GAE_INSTANCE |
המזהה של המופע שבו השירות שלכם פועל כרגע. |
GAE_MEMORY_MB |
נפח הזיכרון שזמין לתהליך האפליקציה, ב-MB. |
GAE_RUNTIME |
סביבת זמן הריצה שצוינה בקובץ app.yaml. |
GAE_SERVICE |
שם השירות שצוין בקובץ app.yaml. אם לא מצוין שם שירות, ברירת המחדל היא default. |
GAE_VERSION |
תווית הגרסה הנוכחית של השירות. |
GOOGLE_CLOUD_PROJECT |
מזהה הפרויקט ב- Google Cloud שמשויך לאפליקציה. |
PORT |
היציאה שמקבלת בקשות HTTP. |
NODE_ENV (זמין רק בסביבת זמן ריצה של Node.js) |
מגדירים את הערך production כשהשירות נפרס. |
אפשר להגדיר משתני סביבה נוספים בקובץ app.yaml, אבל אי אפשר לשנות את הערכים שלמעלה, למעט NODE_ENV.
פרוטוקול HTTPS ושרתי proxy להעברה
App Engine מפסיק חיבורי HTTPS במאזן העומסים ומעביר בקשות לאפליקציה. באפליקציות מסוימות צריך לקבוע את כתובת ה-IP והפרוטוקול של הבקשה המקורית. כתובת ה-IP של המשתמש זמינה בכותרת הרגילה X-Forwarded-For. באפליקציות שנדרש בהן המידע הזה, צריך להגדיר את מסגרת האינטרנט כך שתיתן אמון ב-proxy.
ב-Express.js, משתמשים בהגדרה trust proxy:
app.set('trust proxy', true);
שימו לב: הגדרת trust proxy ל-true עלולה לחשוף את הנכס req.ip לזיוף כתובות IP.
מערכת קבצים
סביבת זמן הריצה כוללת מערכת קבצים מלאה. מערכת הקבצים היא לקריאה בלבד, למעט המיקום /tmp, שהוא דיסק וירטואלי שמאחסן נתונים בזיכרון ה-RAM של מופע App Engine.
שרת מטא-נתונים
כל מופע של האפליקציה יכול להשתמש בשרת המטא-נתונים של App Engine כדי לשלוח שאילתות לגבי המופע והפרויקט.
אפשר לגשת לשרת המטא-נתונים דרך נקודות הקצה הבאות:
http://metadatahttp://metadata.google.internal
בקשות שנשלחות לשרת המטא-נתונים חייבות לכלול את כותרת הבקשה Metadata-Flavor: Google. הכותרת הזו מציינת שהבקשה נשלחה בכוונה מפורשת לאחזר ערכי מטא-נתונים.
בטבלה הבאה מפורטות נקודות הקצה שאליהן אפשר לשלוח בקשות HTTP למטא-נתונים ספציפיים:
| נקודת קצה של מטא-נתונים | תיאור |
|---|---|
/computeMetadata/v1/project/numeric-project-id |
מספר הפרויקט שהוקצה לפרויקט שלכם. |
/computeMetadata/v1/project/project-id |
מזהה הפרויקט שהוקצה לפרויקט. |
/computeMetadata/v1/instance/region |
האזור שבו המכונה פועלת. |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
כתובת האימייל של חשבון השירות שמוגדר כברירת מחדל ומוקצה לפרויקט. |
/computeMetadata/v1/instance/service-accounts/default/ |
מציגה את כל חשבונות השירות שמוגדרים כברירת מחדל בפרויקט. |
/computeMetadata/v1/instance/service-accounts/default/scopes |
רשימה של כל ההיקפים הנתמכים בחשבונות שירות שמוגדרים כברירת מחדל. |
/computeMetadata/v1/instance/service-accounts/default/token |
מחזירה את אסימון האימות שאפשר להשתמש בו כדי לאמת את האפליקציה שלכם ב-Google Cloud APIs אחרים. |
לדוגמה, כדי לאחזר את מזהה הפרויקט, שולחים בקשה אל http://metadata.google.internal/computeMetadata/v1/project/project-id.