סביבת זמן הריצה של Python היא מקבץ התוכנות שאחראי להתקנת קוד האפליקציה ויחסי התלות, ולאחר מכן להרצת האפליקציה בסביבה הגמישה.
גרסאות Python
ב-Python 3.15 (גרסת טרום-השקה) משתמשים ב-buildpacks. בלוח הזמנים לתמיכה בסביבות זמן ריצה מפורטת הרשימה המלאה של גרסאות Python הנתמכות וגרסאות Ubuntu התואמות.
כדי להשתמש בגרסה נתמכת של Python:
כדי לציין מערכת הפעלה, צריך לכלול את ההגדרות
runtime_configו-operating_systemבקובץapp.yaml.מתקינים את גרסה 420.0.0 ואילך של ה-CLI של
gcloud. כדי לעדכן את כלי ה-CLI, מריצים את הפקודהgcloud components update. כדי לראות את הגרסה שמותקנת, מריצים את הפקודהgcloud version.אפשר גם לציין גרסה של סביבת זמן ריצה על ידי הוספת ההגדרה
runtime_versionבקובץapp.yaml. כברירת מחדל, אם לא מציינים את ההגדרהruntime_version, נעשה שימוש בגרסה העדכנית ביותר של Python.
דוגמאות
כדי לציין את Python 3.15 (גרסת טרום-השקה) ב-Ubuntu 24:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu24" runtime_version: "3.15"כדי לציין את הגרסה העדכנית ביותר של Python שנתמכת ב-Ubuntu 24:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu24"
למידע נוסף, עיינו בדף העזרה של app.yaml.
תמיכה בסביבות זמן ריצה אחרות של Python
אם אתם צריכים להשתמש בגרסת Python שלא נתמכת, אתם יכולים ליצור סביבת זמן ריצה בהתאמה אישית ולבחור קובץ אימג' בסיסי תקין עם גרסת Python שאתם צריכים.
למידע על קובצי אימג' בסיסיים שסופקו על ידי Google או קובצי אימג' בסיסיים של Docker Python, קראו את המאמר יצירת סביבות זמן ריצה בהתאמה אישית.
במדריך להעברת נתונים מוסבר איך להעביר אפליקציות של App Engine לקונטיינרים ב-Cloud Run.
יחסי תלות
סביבת זמן הריצה מחפשת קובץ requirements.txt בספריית קובצי המקור של האפליקציה, ומשתמשת ב-pip כדי להתקין את כל יחסי התלות לפני הפעלת האפליקציה. מידע נוסף על הצהרה על חבילות וניהול שלהן זמין במאמר שימוש בספריות Python.
אם לאפליקציה שלכם נדרשים יחסי תלות פרטיים, אתם צריכים להשתמש בסביבת זמן ריצה בהתאמה אישית שמבוססת על סביבת זמן הריצה של Python כדי להתקין את החבילות המתאימות.
הפעלת האפליקציה
סביבת זמן הריצה מפעילה את האפליקציה באמצעות entrypoint שמוגדר בקובץ app.yaml. נקודת הכניסה צריכה להתחיל תהליך שמגיב לבקשות HTTP ביציאה שמוגדרת על ידי משתנה הסביבה PORT.
רוב אפליקציות האינטרנט משתמשות בשרת WSGI כמו Gunicorn, uWSGI או Waitress.
כדי להשתמש באחד מהשרתים האלה, צריך להוסיף אותם כתלות בקובץ requirements.txt של האפליקציה.
אם אתם משתמשים ב-gunicorn באפליקציית Flask, ודאו שגרסת Python של האפליקציה תואמת ל-gunicorn.
סביבת זמן הריצה מוודאת שכל יחסי התלות מותקנים לפני שנקודת הכניסה נקראת.
Flask==2.0.2
gunicorn==20.1.0
דוגמה לנקודת כניסה באמצעות gunicorn לאפליקציית Flask:
entrypoint: gunicorn -b :$PORT main:app
דוגמה לנקודת כניסה באמצעות gunicorn לאפליקציית Django:
entrypoint: gunicorn -b :$PORT mydjangoapp:wsgi
Gunicorn הוא שרת ה-WSGI המומלץ, אבל אפשר להשתמש בכל שרת WSGI אחר. לדוגמה, הנה נקודת כניסה שמשתמשת ב-uWSGI עם Flask:
entrypoint: uwsgi --http :$PORT --wsgi-file main.py --callable app
באפליקציות שיכולות לטפל בבקשות בלי שרת WSGI, אפשר פשוט להריץ סקריפט Python:
entrypoint: python main.py
ההגדרה המומלצת של Gunicorn
הדוגמאות לנקודות כניסה בסיסיות שמוצגות למעלה נועדו לשמש כנקודות התחלה, ויכול להיות שהן יתאימו לאפליקציות האינטרנט שלכם. עם זאת, ברוב האפליקציות צריך להגדיר את שרת ה-WSGI. במקום לציין את כל ההגדרות בנקודת הכניסה, יוצרים קובץ gunicorn.conf.py בתיקיית השורש של הפרויקט, שבה נמצא הקובץ app.yaml, ומציינים אותו בנקודת הכניסה:
entrypoint: gunicorn -c gunicorn.conf.py -b :$PORT main:app
אפשר לקרוא על כל ערכי ההגדרות של Gunicorn במסמכי התיעוד שלו.
עובדים
Gunicorn משתמש ב-workers כדי לטפל בבקשות. כברירת מחדל, Gunicorn משתמש ב-sync workers. מחלקה זו של וורקרים תואמת לכל אפליקציות האינטרנט, אבל כל וורקר יכול לטפל רק בבקשה אחת בכל פעם. כברירת מחדל, gunicorn משתמש רק באחד מה-workers האלה. במקרים רבים, המצב הזה יכול לגרום לניצול חלקי של המכונות ולהגדיל את זמן האחזור באפליקציות בעומס גבוה.
מומלץ להגדיר את מספר ה-workers לערך שגדול פי 2 עד 4 ממספר ליבות המעבד (CPU) של המכונה, בתוספת 1. אפשר לציין את זה ב-gunicorn.conf.py כך:
import multiprocessing
workers = multiprocessing.cpu_count() * 2 + 1
בנוסף, בחלק מאפליקציות האינטרנט שמוגבלות בעיקר על ידי קלט/פלט, אפשר לשפר את הביצועים באמצעות מחלקה שונה של תהליכי עבודה.
אם מחלקת ה-worker שלכם דורשת יחסי תלות נוספים כמו gevent או tornado, צריך להצהיר על יחסי התלות האלה בקובץ requirements.txt של האפליקציה.
שרתי פרוקסי להעברה ו-HTTPS
App Engine מסיים את חיבור ה-HTTPS במאזן העומסים ומעביר את הבקשה לאפליקציה. ברוב האפליקציות לא צריך לדעת אם הבקשה נשלחה באמצעות HTTPS או לא, אבל באפליקציות שבהן כן צריך את המידע הזה, צריך להגדיר את Gunicorn כך שיסמוך על שרת ה-proxy של App Engine ב-gunicorn.conf.py:
forwarded_allow_ips = '*'
secure_scheme_headers = {'X-FORWARDED-PROTO': 'https'}
עכשיו Gunicorn יוודא שהכותרת wsgi.url_scheme מוגדרת ל-'https', שרוב מסגרות האינטרנט ישתמשו בה כאינדיקציה לכך שהבקשה מאובטחת. אם שרת ה-WSGI או המסגרת לא תומכים בכך, פשוט בודקים את הערך של הכותרת X-Forwarded-Proto באופן ידני.
בחלק מהאפליקציות צריך גם לברר את כתובת ה-IP של המשתמש. האפשרות הזו זמינה בכותרת X-Forwarded-For.
שימו לב שההגדרה secure_scheme_headers ב-gunicorn.conf.py צריכה להיות באותיות רישיות, כמו X-FORWARDED-PROTO, אבל הכותרות שהקוד יכול לקרוא יהיו באותיות רישיות וקטנות, כמו X-Forwarded-Proto.
הארכת זמן הריצה
אפשר להשתמש בסביבת זמן הריצה של Python בסביבה הגמישה כדי ליצור סביבת זמן ריצה בהתאמה אישית. מידע נוסף זמין במאמר התאמה אישית של Python.
משתני סביבה
משתני הסביבה הבאים מוגדרים על ידי סביבת זמן הריצה:
| משתנה סביבה | תיאור |
|---|---|
GAE_INSTANCE |
השם של המכונה הנוכחית. |
GAE_MEMORY_MB |
נפח הזיכרון שזמין לתהליך של האפליקציה. |
GAE_SERVICE |
שם השירות שצוין בקובץ app.yaml של האפליקציה. אם לא צוין שם שירות, הוא מוגדר כ-default. |
GAE_VERSION |
תווית הגרסה של האפליקציה הנוכחית. |
GOOGLE_CLOUD_PROJECT |
מזהה הפרויקט שמשויך לאפליקציה, שמופיע במסוף Google Cloud |
PORT |
היציאה שתקבל בקשות HTTP. |
אפשר להגדיר משתני סביבה נוספים בקובץ app.yaml.
שרת מטא-נתונים
כל מכונה של האפליקציה יכולה להשתמש בשרת המטא-נתונים של Compute Engine כדי לשלוח שאילתות לגבי מידע על המכונה, כולל שם המארח, כתובת ה-IP החיצונית, מזהה המכונה, מטא-נתונים בהתאמה אישית ופרטי חשבון השירות. ב-App Engine אי אפשר להגדיר מטא-נתונים בהתאמה אישית לכל מכונה, אבל אפשר להגדיר מטא-נתונים בהתאמה אישית ברמת הפרויקט ולקרוא אותם מהמכונות של App Engine ו-Compute Engine.
הפונקציה לדוגמה הזו משתמשת בשרת המטא-נתונים כדי לקבל את כתובת ה-IP החיצונית של המכונה: