Il runtime Python

Il runtime Python è lo stack software responsabile installando il codice e le dipendenze dell'applicazione per poi eseguirle dell'applicazione nell'ambiente flessibile.

Versioni Python

Python 3.12 utilizza buildpacks. Per l'elenco completo delle Versioni Python e Ubuntu corrispondente la versione più recente, consulta la pianificazione del supporto del runtime.

Per utilizzare un modello supportato Versione Python, devi:

  • Includi le impostazioni runtime_config e operating_system nel tuo app.yaml file in specificare un sistema operativo.

  • Installa l'interfaccia a riga di comando di gcloud versione 420.0.0 o successiva. Puoi aggiornare l'interfaccia a riga di comando eseguendo gcloud components update . Per visualizzare la versione installata, esegui il comando gcloud version.

  • Facoltativamente, puoi specificare una versione del runtime includendo l'elemento runtime_version nel tuo file app.yaml. Per impostazione predefinita, viene utilizzata l'ultima versione Python 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"
    

Consulta la app.yaml pagina di riferimento per ulteriori informazioni.

Versioni precedenti del runtime

Per Python 3.7 e versioni precedenti, specifica una versione utilizzando la classe Impostazioni di 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 le versioni Python 3.7 e precedenti, l'interprete predefinito è Python 2.7.12 se runtime_config o python_version omessi. Ad esempio, puoi utilizzare il runtime predefinito specificando runtime: python nel file app.yaml:

runtime: python
env: flex

Consulta la app.yaml pagina di riferimento per ulteriori informazioni.

Gli interpreti di cui viene eseguito il deployment per ogni impostazione della versione sono mostrati 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 per altri runtime Python

Se devi utilizzare una versione Python non supportata, puoi creare una runtime personalizzato e seleziona un'immagine di base valida con la versione Python necessaria.

Per le immagini di base fornite da Google Immagini di base di Docker Python, consulta la sezione Creazione di runtime personalizzati.

Per esaminare ulteriormente la containerizzazione delle app di App Engine in Cloud Run, consulta guida alla migrazione.

Dipendenze

Il runtime cerca un requirements.txt nella directory di origine dell'applicazione e utilizza pip per installare eventuali dipendenze prima di avviare l'applicazione. Per ulteriori informazioni informazioni sulla dichiarazione e la gestione dei pacchetti, consulta Utilizzo delle librerie Python.

Se la tua app richiede dipendenze private, devi usare un runtime personalizzato basato sul modello 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 per la versione Python corrente e quanto segue I 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 tuo app.yaml. Il punto di accesso deve avviare un processo che risponda alle richieste HTTP sulla porta definita 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 il file La versione Python è 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

Gli esempi di punti di ingresso di base sopra riportati sono da intendersi come punti di partenza e potrebbe funzionare per le tue applicazioni web. La maggior parte delle applicazioni, tuttavia, dovrà configurare ulteriormente il server WSGI. Anziché specificare tutte le impostazioni del nel punto di ingresso, crea un file gunicorn.conf.py nella directory root del progetto posizione del 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 visualizzare miglioramento delle prestazioni utilizzando una classe di 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 richiesta alla tua applicazione. La maggior parte delle applicazioni non ha bisogno di sapere se è stata inviata tramite HTTPS o meno, ma le applicazioni che ne hanno bisogno le informazioni devono configurare Gunicorn in modo che si fidi del proxy di App Engine gunicorn.conf.py:

forwarded_allow_ips = '*'
secure_scheme_headers = {'X-FORWARDED-PROTO': 'https'}

Gunicorn ora garantirà che da wsgi.url_scheme a 'https', che la maggior parte dei per indicare se la richiesta è sicura. Se il tuo server WSGI o non lo supporta, verifica semplicemente il valore X-Forwarded-Proto intestazione manualmente.

Alcune applicazioni devono anche verificare l'indirizzo IP dell'utente. Questo è disponibile nell'intestazione X-Forwarded-For.

Tieni presente che l'impostazione secure_scheme_headers in gunicorn.conf.py deve essere in maiuscolo, ad esempio X-FORWARDED-PROTO, ma le intestazioni lette dal codice saranno utilizzate in lettere maiuscole e minuscole, ad esempio X-Forwarded-Proto.

Estensione del runtime

Il runtime Python nell'ambiente flessibile può essere utilizzato per creare un runtime personalizzato. Vedi Personalizzazione di Python per ulteriori informazioni.

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 campo app.yaml dell'applicazione o, se non viene specificato alcun nome di servizio, viene impostato su default.
GAE_VERSION L'etichetta della versione dell'applicazione corrente.
GOOGLE_CLOUD_PROJECT L'ID progetto associato alla tua applicazione, visibile in la 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 dell'applicazione può utilizzare Server di metadati di Compute Engine per eseguire query sulle informazioni sul istanza, inclusi nome host, indirizzo IP esterno, ID istanza, metadati e dati 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 dal tuo di App Engine e Compute Engine.

Questa funzione di esempio utilizza il server di metadati per ottenere l'indirizzo IP esterno dell'istanza:

METADATA_NETWORK_INTERFACE_URL = (
    "http://metadata/computeMetadata/v1/instance/network-interfaces/0/"
    "access-configs/0/external-ip"
)


def get_external_ip():
    """Gets the instance's external IP address from the Compute Engine metadata
    server.

    If the metadata server is unavailable, it assumes that the application is running locally.

    Returns:
        The instance's external IP address, or the string 'localhost' if the IP address
        is not available.
    """
    try:
        r = requests.get(
            METADATA_NETWORK_INTERFACE_URL,
            headers={"Metadata-Flavor": "Google"},
            timeout=2,
        )
        return r.text
    except requests.RequestException:
        logging.info("Metadata server could not be reached, assuming local.")
        return "localhost"