Il runtime Python è lo stack software responsabile dell'installazione del codice e delle dipendenze dell'applicazione e dell'esecuzione dell'applicazione nell'ambiente flessibile.
La versione
3.8
e successive sono create utilizzando i buildpack, che richiedono la scelta di un sistema operativo nel fileapp.yaml
. Ad esempio, per utilizzare Python 3.12, devi specificare Ubuntu 22 come sistema operativo.La versione
3.7
e precedenti sono create utilizzando Docker.
Per l'elenco completo delle versioni Python supportate e la versione Ubuntu corrispondente, consulta la pianificazione del supporto di runtime.
Nuove versioni del runtime
Per il runtime Python versione 3.8 e successive, devi includere le impostazioni runtime_config
e operating_system
nel file app.yaml
per specificare un sistema operativo.
Per utilizzare i nuovi runtime, devi installare l'interfaccia a riga di comando di gcloud
420.0.0 o versioni successive. Puoi aggiornare gli strumenti dell'interfaccia a riga di comando eseguendo il
comando gcloud components update
.
Per visualizzare la versione installata, esegui il
comando gcloud version
.
(Facoltativo) Puoi specificare una versione del runtime includendo l'impostazione runtime_version
nel file app.yaml
. Per impostazione predefinita, viene utilizzata l'ultima versione Python se
l'impostazione runtime_version
non è specificata.
Esempi
Per specificare Python 3.12 su Ubuntu 22:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu22" runtime_version: "3.12"
Per specificare l'ultima versione di Python supportata su Ubuntu 22:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu22"
Per ulteriori informazioni, consulta la pagina di riferimento app.yaml
.
Versioni precedenti del runtime
Per Python 3.7 e versioni precedenti, devi specificare una versione utilizzando le impostazioni runtime_config
e python_version
nel file app.yaml
dell'applicazione.
Esempio
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3.7
Per Python 3.7 e versioni precedenti, l'interprete predefinito è Python 2.7.12 se runtime_config
o python_version
sono omessi. Ad esempio, puoi utilizzare il runtime predefinito specificando runtime: python
nel file app.yaml
:
runtime: python
env: flex
Per ulteriori informazioni, consulta la pagina di riferimento app.yaml
.
Gli interpreti di cui viene eseguito il deployment per ogni impostazione della versione sono mostrati nella tabella seguente:
python_version impostazione |
Interprete di cui è stato eseguito il deployment | ID runtime | Esempio di app.yaml |
---|---|---|---|
2 (valore predefinito) |
2.7.12 | python2 |
runtime_config: python_version: 2 |
3.4 |
3.4.8 | python34 |
runtime_config: python_version: 3.4 |
3.5 |
3.5.9 | python35 |
runtime_config: python_version: 3.5 |
3 o 3.6 |
3.6.10 | python36 |
runtime_config: python_version: 3 |
3.7 |
3.7.9 | python37 |
runtime_config: python_version: 3.7 |
Supporto di altri runtime Python
Se la versione Python desiderata non è elencata, ci sono diverse opzioni:
- Ambiente flessibile di App Engine: crea un runtime personalizzato e seleziona un'immagine di base valida con la versione Python necessaria.
- Ambiente standard di App Engine: sono supportati Python 3.7, 3.8, 3.9, 3.10 e 3.11.
- Cloud Functions: sono supportati Python 3.7, 3.8, 3.9 e 3.10.
- Cloud Run: containerizza la tua app in base a un'immagine container per la versione Python di cui hai bisogno (consulta la guida rapida di Python). Poiché le immagini Python 3.10 sono già disponibili, puoi eseguire il deployment di quella versione oggi stesso.
Per l'ambiente flessibile di App Engine o Cloud Run, consulta Creazione di runtime personalizzati per le immagini di base fornite da Google o Immagini di base Docker Python per le immagini Python attualmente disponibili, incluse informazioni sulle immagini Python 2.
Per ulteriori informazioni sulla containerizzazione delle app di App Engine per Cloud Run, consulta il codelab e i contenuti video relativi alla containerizzazione con Docker o senza Docker. Tieni presente che al momento questi contenuti riguardano solo l'ambiente standard di App Engine a Cloud Run.
Dipendenze
Il runtime cerca un file requirements.txt
nella directory di origine dell'applicazione e utilizza pip
per installare le dipendenze prima di avviare l'applicazione. Per ulteriori informazioni sulla dichiarazione e la gestione dei pacchetti, consulta Utilizzo delle librerie Python.
Se la tua app richiede dipendenze private, devi utilizzare un runtime personalizzato basato sul runtime Python per installare i pacchetti appropriati.
Utilizzo delle librerie C con Python
Per abilitare l'utilizzo di pacchetti Python che richiedono estensioni C, le intestazioni della versione Python corrente e i seguenti pacchetti Ubuntu sono preinstallati sul sistema:
build-essential
ca-certificates
curl
gfortran
git
libatlas-dev
libblas-dev
libcurl4-openssl-dev
libffi-dev
libfreetype6-dev
libjpeg-dev
liblapack-dev
libmemcached-dev
libmysqlclient-dev
libpng12-dev
libpq-dev
libquadmath0
libsasl2-2
libsasl2-dev
libsasl2-modules
libsqlite3-dev
libssl-dev
libxml2-dev
libxslt1-dev
libz-dev
mercurial
netbase
pkg-config
sasl2-bin
swig
wget
zlib1g-dev
Questi pacchetti consentono l'installazione delle librerie Python più popolari. Se la tua applicazione richiede ulteriori dipendenze a livello di sistema operativo, dovrai utilizzare un runtime personalizzato basato su questo runtime per installare i pacchetti appropriati.
Avvio dell'applicazione
Il runtime avvia l'applicazione utilizzando il entrypoint
definito nel file app.yaml
. Il punto di ingresso
deve avviare un processo che risponde alle richieste HTTP sulla porta definita dalla
variabile di ambiente PORT
.
La maggior parte delle applicazioni web utilizza un server WSGI, ad esempio Gunicorn, uWSGI o waitress.
Prima di poter utilizzare uno di questi server, devi aggiungerli come dipendenza nell'elemento requirements.txt
dell'applicazione.
Se utilizzi gunicorn
per la tua applicazione Flask, assicurati che la versione Python dell'applicazione sia compatibile con gunicorn
.
Il runtime garantisce che tutte le dipendenze siano installate prima della chiamata del punto di ingresso.
Flask==2.0.2
gunicorn==20.1.0
Un punto di ingresso di esempio in cui viene utilizzato gunicorn per un'applicazione Flask:
entrypoint: gunicorn -b :$PORT main:app
Un punto di ingresso di esempio che utilizza gunicorn per un'applicazione Django:
entrypoint: gunicorn -b :$PORT mydjangoapp:wsgi
Gunicorn è il server WSGI consigliato, ma è assolutamente possibile utilizzare qualsiasi altro server WSGI. Ad esempio, ecco un punto di ingresso che utilizza uWSGI con Flask:
entrypoint: uwsgi --http :$PORT --wsgi-file main.py --callable app
Per le applicazioni che possono gestire le richieste senza un server WSGI, è sufficiente eseguire uno script Python:
entrypoint: python main.py
Configurazione Gunicorn consigliata
Gli esempi di punti di ingresso di base mostrati sopra sono pensati come punti di partenza
e potrebbero funzionare per le tue applicazioni web. La maggior parte delle applicazioni, tuttavia, dovrà configurare ulteriormente il server WSGI. Anziché specificare tutte le impostazioni nel punto di ingresso, crea un file gunicorn.conf.py
nella directory principale del progetto in cui si trova il file app.yaml
e specificalo nel punto di ingresso:
entrypoint: gunicorn -c gunicorn.conf.py -b :$PORT main:app
Puoi trovare informazioni su tutti i valori di configurazione di Gunicorn nella relativa documentazione.
Worker
Gunicorn utilizza i worker per gestire le richieste. Per impostazione predefinita, Gunicorn utilizza i lavoratori di sincronizzazione. Questa classe worker è compatibile con tutte le applicazioni web, ma ogni worker può gestire una sola richiesta alla volta. Per impostazione predefinita, gunicorn utilizza solo uno di questi worker. Questo spesso può causare un sottoutilizzo delle istanze e un aumento della latenza nelle applicazioni soggette a carico elevato.
Ti consigliamo di impostare il numero di worker su 2-4 volte il numero di core della CPU per l'istanza più uno. Puoi specificare in gunicorn.conf.py
come:
import multiprocessing
workers = multiprocessing.cpu_count() * 2 + 1
Inoltre, alcune applicazioni web che sono principalmente legate all'I/O possono ottenere un miglioramento delle prestazioni utilizzando una classe worker diversa.
Se la tua classe worker richiede dipendenze aggiuntive, come gevent o tornado, queste dipendenze dovranno essere dichiarate nel valore requirements.txt
dell'applicazione.
Proxy HTTPS e di forwarding
App Engine termina la connessione HTTPS al bilanciatore del carico e inoltra la richiesta all'applicazione. La maggior parte delle applicazioni non ha bisogno di sapere se la richiesta è stata inviata tramite HTTPS o meno, ma quelle che hanno bisogno di queste informazioni devono configurare Gunicorn in modo che consideri attendibile il proxy App Engine nel proprio gunicorn.conf.py
:
forwarded_allow_ips = '*'
secure_scheme_headers = {'X-FORWARDED-PROTO': 'https'}
Gunicorn ora garantirà che il valore da wsgi.url_scheme
a 'https'
, che la maggior parte
dei framework web utilizzerà per indicare che la richiesta è sicura. Se il tuo framework o server WSGI non supporta questa funzionalità, controlla manualmente il valore dell'intestazione X-Forwarded-Proto
.
Alcune applicazioni devono anche verificare l'indirizzo IP dell'utente. Questa opzione è disponibile nell'intestazione X-Forwarded-For
.
Tieni presente che l'impostazione secure_scheme_headers
in gunicorn.conf.py
dovrebbe essere in maiuscolo, ad esempio X-FORWARDED-PROTO
, ma le intestazioni che il tuo codice può leggere saranno in caratteri misti, ad esempio X-Forwarded-Proto
.
Estensione del runtime
Il runtime Python nell'ambiente flessibile può essere utilizzato per creare un runtime personalizzato. Per ulteriori informazioni, consulta Personalizzazione di Python.
Variabili di ambiente
L'ambiente di runtime imposta le seguenti variabili di ambiente:
Variabile di ambiente | Descrizione |
---|---|
GAE_INSTANCE |
Il nome dell'istanza attuale. |
GAE_MEMORY_MB |
La quantità di memoria disponibile per il processo di richiesta. |
GAE_SERVICE |
Il nome del servizio specificato nel file app.yaml dell'applicazione oppure, se non viene specificato alcun nome di servizio, è impostato su default . |
GAE_VERSION |
L'etichetta della versione dell'applicazione corrente. |
GOOGLE_CLOUD_PROJECT |
L'ID progetto associato alla tua applicazione, visibile nella console Google Cloud |
PORT |
La porta che riceverà le richieste HTTP. |
Puoi impostare altre variabili di ambiente nel file app.yaml
.
Server metadati
Ogni istanza della tua applicazione può utilizzare il server di metadati di Compute Engine per eseguire query sulle informazioni sull'istanza, tra cui nome host, indirizzo IP esterno, ID istanza, metadati personalizzati e informazioni dell'account di servizio. App Engine non consente di impostare metadati personalizzati per ogni istanza, ma puoi impostare metadati personalizzati a livello di progetto e leggerli dalle tue istanze di App Engine e Compute Engine.
Questa funzione di esempio utilizza il server di metadati per ottenere l'indirizzo IP esterno dell'istanza: