Runtime Python adalah stack software yang bertanggung jawab untuk menginstal kode aplikasi dan dependensi Anda, lalu menjalankan aplikasi tersebut di lingkungan fleksibel.
Versi
3.8
dan yang lebih baru dibuat menggunakan buildpack, yang mengharuskan Anda memilih sistem operasi di fileapp.yaml
. Misalnya, untuk menggunakan Python 3.12, Anda harus menentukan Ubuntu 22 sebagai sistem operasi.Versi
3.7
dan yang lebih lama dibangun menggunakan Docker.
Untuk daftar lengkap versi Python yang didukung, dan versi Ubuntu yang sesuai, lihat Jadwal dukungan runtime.
Versi runtime baru
Untuk runtime Python versi 3.8 dan yang lebih baru, Anda harus menyertakan setelan runtime_config
dan operating_system
dalam file app.yaml
guna menentukan sistem operasi.
Untuk menggunakan runtime baru, Anda harus menginstal CLI gcloud
versi 420.0.0 atau yang lebih baru. Anda dapat memperbarui alat CLI dengan menjalankan perintah gcloud components update
.
Untuk melihat versi yang diinstal, jalankan perintah gcloud version
.
Opsional: Anda dapat menentukan versi runtime dengan menyertakan setelan runtime_version
dalam file app.yaml
. Secara default, versi Python terbaru digunakan jika setelan runtime_version
tidak ditentukan.
Contoh
Untuk menentukan Python 3.12 di Ubuntu 22:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu22" runtime_version: "3.12"
Untuk menentukan versi Python terbaru yang didukung di Ubuntu 22:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu22"
Lihat halaman referensi app.yaml
untuk informasi selengkapnya.
Versi runtime sebelumnya
Untuk Python versi 3.7 dan yang lebih lama, tentukan versi menggunakan setelan runtime_config
dan python_version
di file app.yaml
aplikasi Anda.
Contoh
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3.7
Untuk Python versi 3.7 dan yang lebih lama, penafsir default-nya adalah Python 2.7.12 jika runtime_config
atau python_version
dihilangkan. Misalnya, Anda dapat menggunakan runtime default dengan menetapkan runtime: python
dalam file app.yaml
:
runtime: python
env: flex
Lihat halaman referensi app.yaml
untuk informasi selengkapnya.
Penafsir yang di-deploy untuk setiap setelan versi ditampilkan dalam tabel berikut:
Setelan python_version |
Penafsir yang di-deploy | ID Runtime | Contoh app.yaml |
---|---|---|---|
2 (default) |
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 atau 3.6 |
3.6.10 | python36 |
runtime_config: python_version: 3 |
3.7 |
3.7.9 | python37 |
runtime_config: python_version: 3.7 |
Dukungan runtime Python lain
Jika versi Python yang diinginkan tidak tercantum, ada beberapa opsi:
- Lingkungan fleksibel App Engine: Buat runtime kustom dan pilih image dasar yang valid dengan versi Python yang Anda butuhkan.
- Lingkungan standar App Engine: Python 3.7, 3.8, 3.9, 3.10, dan 3.11 didukung.
- Cloud Functions: Python 3.7, 3.8, 3.9, dan 3.10 didukung.
- Cloud Run: Tempatkan aplikasi Anda ke dalam container berdasarkan image container untuk versi Python yang diperlukan (lihat Panduan Memulai Python). Karena image Python 3.10 sudah tersedia, Anda dapat men-deploy versi itu sekarang.
Untuk lingkungan fleksibel App Engine atau Cloud Run, lihat Membangun runtime kustom untuk image dasar yang disediakan Google atau Image dasar Python Docker untuk image Python yang saat ini tersedia, termasuk informasi image Python 2.
Untuk menyelidiki lebih lanjut menempatkan aplikasi App Engine ke dalam container untuk Cloud Run, lihat codelab dan konten video yang membahas containerization dengan Docker atau tanpa Docker. Perlu diperhatikan bahwa konten ini sekarang hanya mencakup lingkungan standar App Engine hingga migrasi Cloud Run.
Dependensi
Runtime mencari file requirements.txt
dalam direktori sumber aplikasi Anda dan menggunakan pip
untuk menginstal dependensi apa pun sebelum memulai aplikasi Anda. Untuk informasi selengkapnya tentang mendeklarasikan dan mengelola paket, lihat Menggunakan Library Python.
Jika aplikasi memerlukan dependensi pribadi, Anda harus menggunakan runtime kustom berdasarkan runtime Python untuk menginstal paket yang sesuai.
Menggunakan library C dengan Python
Untuk mengaktifkan penggunaan paket Python yang memerlukan ekstensi C, header untuk versi Python saat ini dan paket Ubuntu berikut sudah diinstal sebelumnya di sistem:
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
Paket-paket ini memungkinkan penginstalan library Python yang paling populer. Jika aplikasi memerlukan dependensi tingkat sistem operasi tambahan, Anda harus menggunakan runtime kustom berdasarkan runtime ini untuk menginstal paket yang sesuai.
Proses mulai aplikasi
Runtime memulai aplikasi Anda menggunakan entrypoint
yang ditentukan dalam file app.yaml
. Titik entri akan memulai proses yang merespons permintaan HTTP di port yang ditentukan oleh variabel lingkungan PORT
.
Sebagian besar aplikasi web menggunakan server WSGI seperti Gunicorn, uWSGI, atau Waitress.
Sebelum dapat menggunakan salah satu server ini, Anda harus menambahkannya sebagai dependensi dalam requirements.txt
aplikasi Anda.
Jika Anda menggunakan gunicorn
untuk aplikasi Flask, pastikan versi Python aplikasi Anda kompatibel dengan gunicorn
.
Runtime memastikan bahwa semua dependensi diinstal sebelum titik entri Anda dipanggil.
Flask==2.0.2
gunicorn==20.1.0
Contoh titik entri yang menggunakan gunicorn untuk aplikasi Flask:
entrypoint: gunicorn -b :$PORT main:app
Contoh titik entri yang menggunakan gunicorn untuk aplikasi Django:
entrypoint: gunicorn -b :$PORT mydjangoapp:wsgi
Gunicorn adalah server WSGI yang direkomendasikan, tetapi Anda dapat menggunakan server WSGI lainnya. Misalnya, berikut adalah titik entri yang menggunakan uWSGI dengan Flask:
entrypoint: uwsgi --http :$PORT --wsgi-file main.py --callable app
Untuk aplikasi yang dapat menangani permintaan tanpa server WSGI, Anda cukup mengeksekusi skrip Python:
entrypoint: python main.py
Konfigurasi Gunicorn yang direkomendasikan
Contoh titik entri dasar yang ditampilkan di atas dimaksudkan sebagai titik awal dan mungkin sesuai dengan aplikasi web Anda. Namun, sebagian besar aplikasi perlu mengonfigurasi lebih lanjut server WSGI. Alih-alih menetapkan semua setelan pada titik entri, buatlah file gunicorn.conf.py
dalam direktori root project, tempat file app.yaml
Anda berada, lalu tentukan di titik entri:
entrypoint: gunicorn -c gunicorn.conf.py -b :$PORT main:app
Anda dapat membaca semua nilai konfigurasi Gunicorn dalam dokumentasinya.
Worker
Gunicorn menggunakan worker untuk menangani permintaan. Secara default, Gunicorn menggunakan worker sinkronisasi. Class worker ini kompatibel dengan semua aplikasi web, tetapi setiap worker hanya dapat menangani satu permintaan dalam satu waktu. Secara default, gunicorn hanya menggunakan salah satu worker tersebut. Hal ini sering kali dapat menyebabkan instance Anda kurang dimanfaatkan dan meningkatkan latensi dalam aplikasi saat bebannya tinggi.
Sebaiknya tetapkan jumlah worker 2-4 kali jumlah core CPU untuk instance Anda ditambah satu. Anda dapat menentukan ini di gunicorn.conf.py
sebagai:
import multiprocessing
workers = multiprocessing.cpu_count() * 2 + 1
Selain itu, beberapa aplikasi web yang sebagian besar terikat I/O dapat ditingkatkan performanya menggunakan class worker yang berbeda.
Jika class worker Anda memerlukan dependensi tambahan seperti gevent atau tornado, dependensi tersebut harus dideklarasikan dalam requirements.txt
aplikasi Anda.
HTTPS dan proxy penerusan
App Engine menghentikan koneksi HTTPS di load balancer dan meneruskan permintaan ke aplikasi Anda. Sebagian besar aplikasi tidak perlu mengetahui apakah permintaan dikirim melalui HTTPS atau tidak, tetapi aplikasi yang memerlukan informasi ini harus mengonfigurasi Gunicorn untuk memercayai proxy App Engine di gunicorn.conf.py
:
forwarded_allow_ips = '*'
secure_scheme_headers = {'X-FORWARDED-PROTO': 'https'}
Gunicorn sekarang akan memastikan bahwa wsgi.url_scheme
menjadi 'https'
, yang akan digunakan oleh sebagian besar framework web sebagai indikasi permintaan aman. Jika server atau framework WSGI Anda tidak mendukungnya, cukup periksa nilai header X-Forwarded-Proto
secara manual.
Beberapa aplikasi juga perlu memastikan alamat IP pengguna. Ini tersedia di header X-Forwarded-For
.
Perhatikan bahwa setelan secure_scheme_headers
di gunicorn.conf.py
harus berupa huruf besar, seperti X-FORWARDED-PROTO
, tetapi header yang dapat dibaca kode akan menggunakan huruf besar dan kecil, seperti X-Forwarded-Proto
.
Memperpanjang runtime
Runtime Python lingkungan fleksibel dapat digunakan untuk membuat runtime kustom. Lihat Menyesuaikan Python untuk informasi selengkapnya.
Variabel lingkungan
Variabel lingkungan berikut ditetapkan oleh lingkungan runtime:
Variabel Lingkungan | Deskripsi |
---|---|
GAE_INSTANCE |
Nama instance saat ini. |
GAE_MEMORY_MB |
Jumlah memori yang tersedia untuk proses aplikasi. |
GAE_SERVICE |
Nama layanan yang ditentukan dalam file app.yaml aplikasi Anda, atau jika tidak ada nama layanan yang ditentukan, nama akan ditetapkan ke default . |
GAE_VERSION |
Label versi aplikasi saat ini. |
GOOGLE_CLOUD_PROJECT |
Project ID yang terkait dengan aplikasi Anda, yang terlihat di konsol Google Cloud |
PORT |
Port yang akan menerima permintaan HTTP. |
Anda dapat menetapkan variabel lingkungan tambahan di file app.yaml
.
Server metadata
Setiap instance aplikasi Anda dapat menggunakan server metadata Compute Engine untuk mengkueri informasi tentang instance, termasuk nama host, alamat IP eksternal, ID instance, metadata kustom, dan informasi akun layanan. App Engine tidak mengizinkan Anda menetapkan metadata kustom untuk setiap instance, tetapi Anda dapat menetapkan metadata kustom tingkat project dan membacanya dari instance App Engine dan Compute Engine.
Fungsi contoh ini menggunakan server metadata untuk mendapatkan alamat IP eksternal instance: