סביבת זמן הריצה של Python היא מקבץ התוכנות שאחראי על התקנת הקוד של שירות האינטרנט ועל יחסי התלות שלו, ועל הפעלת השירות של App Engine.
זמן הריצה של Python ב-App Engine בסביבה הרגילה מוצהר בקובץ app.yaml:
runtime: pythonVERSION
VERSION הוא מספר הגרסה של Python MAJOR ו-MINOR. לדוגמה, כדי להשתמש בגרסה העדכנית ביותר של Python, Python 3.15 (גרסת טרום-השקה), מציינים את 315.
בלוח הזמנים לתמיכה בסביבות זמן ריצה מפורטות גרסאות Python נתמכות אחרות וגרסת Ubuntu שתואמת לגרסת Python שלכם.
גרסאות Python 3
גרסת Python העדכנית ביותר שנתמכת היא 3.15 (גרסת טרום-השקה). סביבת זמן הריצה של Python משתמשת בגרסה היציבה האחרונה שצוינה בקובץ app.yaml.
App Engine מעדכן באופן אוטומטי לגרסאות תיקון חדשות, אבל לא מעדכן באופן אוטומטי את הגרסה המשנית.
לדוגמה, יכול להיות שהאפליקציה שלכם תופעל ב-Python 3.7.0 ותעודכן באופן אוטומטי ל-Python 3.7.1, אבל היא לא תעודכן באופן אוטומטי לגרסה המשנית הבאה, Python 3.8.0.
אפליקציות Python פועלות ב-App Engine בקונטיינר שמאובטח על ידי gVisor, בהפצה עדכנית של Ubuntu Linux.
יחסי תלות
במהלך הפריסה, App Engine משתמש במנהל החבילות של Python, pip, כדי להתקין את יחסי התלות שמוגדרים בקובץ המטא-נתונים requirements.txt שנמצא בתיקיית השורש של הפרויקט. אין צורך להעלות יחסי תלות כי App Engine מבצע התקנה חדשה.
כרגע אין תמיכה במפרט של יחסי תלות באמצעות התקן Pipfile/Pipfile.lock, והקבצים האלה לא יכולים להיות בפרויקט.
הפעלת האפליקציה
סביבת זמן הריצה מפעילה את האפליקציה באמצעות הפקודה שציינתם בשדה entrypoint בקובץ app.yaml. אם הגדרתם נקודת כניסה לשרת אינטרנט של Gunicorn בקובץ app.yaml, אתם צריכים להוסיף גם את gunicorn לקובץ requirements.txt.
נקודת הכניסה צריכה להפעיל שרת אינטרנט שמאזין ליציאה שצוינה במשתנה הסביבה PORT. לדוגמה:
entrypoint: gunicorn -b :$PORT main:app
מסגרת האינטרנט שבה האפליקציה משתמשת אחראית לניתוב הבקשות ל-handlers המתאימים באפליקציה.
אם האפליקציה עומדת בדרישות הבאות, App Engine יפעיל אותה עם שרת האינטרנט gunicorn, אם לא תציינו את השדה entrypoint:
תיקיית השורש של האפליקציה מכילה קובץ
main.pyעם אובייקט תואם-WSGI שנקראapp.האפליקציה שלך לא מכילה קובצי
PipfileאוPipfile.lock.
אם לא תציינו נקודת כניסה לסביבת זמן הריצה של Python 3, App Engine יגדיר ויפעיל את שרת האינטרנט Gunicorn שמוגדר כברירת מחדל באמצעות מחלקת ה-worker gthread עם 4 שרשורים לכל worker. במכונות F1 ו-B1, מחלקת ה-worker של gthread משתמשת ב-4 workers, ובמכונות F2, B2 ומכונות גדולות יותר, היא משתמשת ב-8 workers. אם מציינים entrypoint בהתאמה אישית בלי להגדיר את --workers (-w), ברירת המחדל של Gunicorn היא וורקר sync אחד.
שיטות מומלצות לנקודות כניסה
מוודאים שמודול Python שנדרש כדי להריץ את נקודת הכניסה שצוינה ב-
app.yamlנמצא בקובץrequirements.txt. מוסיפים אתgunicornלקובץrequirements.txtרק אם נקודת קצה (endpoint) שלgunicornצוינה במפורש בקובץapp.yaml.כדי להשיג את הביצועים הטובים ביותר, נקודת הכניסה צריכה להיות קלה, כי היא פועלת בכל פעם שנוצר מופע חדש של האפליקציה.
אתם יכולים להשתמש בשדה entrypoint כדי לשפר את הביצועים של האפליקציה. לדוגמה, אם אתם משתמשים ב-
gunicornכשרת אינטרנט, אתם יכולים להשתמש בדגל--workersבשדה entrypoint כדי להגדיר את מספר ה-workers שמשרתים את האפליקציה.מספר ה-workers שאתם מציינים צריך להתאים לסוג המכונה של אפליקציית App Engine:
סוג המכונה עובדים F1 4 F2 8 F4 8 F4_1G 8 B1 4 B2 8 B4 8 B4_1G 8 B8 8 ההנחיות האלה הן נקודת התחלה לבחירת מספר ה-workers. יכול להיות שתצטרכו להשתמש במספר שונה של תהליכי worker, בהתאם למאפייני הביצועים של האפליקציה. בדוגמה הבאה מוצג פריסת App Engine שמשתמשת בשני קבוצות עובדים של
gunicornלהצגת אפליקציות:entrypoint: gunicorn -b :$PORT -w 2 main:appמומלץ להגדיר את שרת האינטרנט כך שיאזין לבקשות HTTP ויגיב להן ביציאה שצוינה על ידי משתנה הסביבה
$PORT. אם משתמשים ביציאת ברירת המחדל8080, App Engine לא יכול להשתמש בשכבת ה-NGINX שלו כדי לדחוס תגובות HTTP. שימו לב שאם אתם משתמשים ביציאה8080, אזהרות לגבי יציאה8080ו-NGINX יופיעו בקובצי היומן של האפליקציה.
מערכי Framework אחרים לאינטרנט
בנוסף ל-Django ול-Flask, אתם יכולים להשתמש ב-App Engine עם סביבות פיתוח אחרות לאינטרנט, כמו uwsgi ו-Tornado. בדוגמה הבאה מוסבר איך משתמשים ב-uwsgi עם App Engine:
משתני סביבה
משתני הסביבה הבאים מוגדרים על ידי סביבת זמן הריצה:
| משתנה הסביבה | תיאור |
|---|---|
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
App Engine מסיים את חיבורי ה-HTTPS במאזן העומסים ומעביר את הבקשות לאפליקציה. באפליקציות מסוימות צריך לזהות את כתובת ה-IP ואת הפרוטוקול של הבקשה המקורית. כתובת ה-IP של המשתמש זמינה בכותרת הרגילה X-Forwarded-For. באפליקציות שדורשות את המידע הזה, צריך להגדיר את מסגרת האינטרנט כך שתיתן אמון בשרת ה-proxy.
מערכת קבצים
סביבת זמן הריצה כוללת מערכת קבצים מלאה. מערכת הקבצים היא לקריאה בלבד, חוץ מהמיקום /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 API אחרים. |
לדוגמה, כדי לאחזר את מזהה הפרויקט, שולחים בקשה אל http://metadata.google.internal/computeMetadata/v1/project/project-id.