GAE部署Django遇502错误:缺失libBLT.2.5.so.8.6库求助
Django部署GAE出现502 Bad Gateway错误的解决方案求助
环境信息
- Django 4.0.4
- Python 3.8.9
错误现象
部署到Google App Engine(GAE)标准环境后出现「502 Bad Gateway」错误,服务器日志抛出如下异常:
Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker worker.init_process() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/workers/base.py", line 134, in init_process self.load_wsgi() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi self.wsgi = self.app.wsgi() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 58, in load return self.load_wsgiapp() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp return util.import_app(self.app_uri) File "/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/util.py", line 359, in import_app mod = importlib.import_module(module) File "/opt/python3.8/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 843, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/workspace/SakeMarksV1/wsgi.py", line 16, in <module> application = get_wsgi_application() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application django.setup(set_prefix=False) File "/layers/google.python.pip/pip/lib/python3.8/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/layers/google.python.pip/pip/lib/python3.8/site-packages/django/apps/registry.py", line 116, in populate app_config.import_models() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/django/apps/config.py", line 304, in import_models self.models_module = import_module(models_module_name) File "/opt/python3.8/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 843, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/workspace/website/models.py", line 1, in <module> import turtledemo.nim File "/opt/python3.8/lib/python3.8/turtledemo/nim.py", line 13, in <module> import turtle File "/opt/python3.8/lib/python3.8/turtle.py", line 107, in <module> import tkinter as TK File "/opt/python3.8/lib/python3.8/tkinter/__init__.py", line 36, in <module> import _tkinter # If this fails your Python may not be configured for Tk ImportError: libBLT.2.5.so.8.6: cannot open shared object file: No such file or directory
错误根源定位
经排查,错误是由于/workspace/website/models.py中导入了turtledemo.nim模块,该模块依赖turtle库,而turtle又依赖tkinter。GAE标准环境实例没有预装libBLT.2.5.so.8.6共享库,导致tkinter无法加载,最终引发502错误。
相关配置文件
app.yaml
runtime: python38 instance_class: F1 env: standard entrypoint: gunicorn -b :$PORT <PROJECT_NAME>.wsgi:application includes: - secret.yaml handlers: - url: /static static_dir: static/ - url: /.* script: auto secure: always automatic_scaling: max_instances: 2
settings/base.py
from pathlib import Path import os from dotenv import load_dotenv load_dotenv() BASE_DIR = Path(__file__).resolve().parent.parent.parent AUTH_USER_MODEL = 'website.User' INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'website', 'widget_tweaks', 'social_django', 'corsheaders', 'django_cleanup', 'stdimage', 'storages', ] MIDDLEWARE = [ 'django.middleware.gzip.GZipMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware', ] CORS_ORIGIN_ALLOW_ALL = True ROOT_URLCONF = '<PROJECT_NAME>.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'social_django.context_processors.backends', 'social_django.context_processors.login_redirect', ], }, }, ] WSGI_APPLICATION = '<PROJECT_NAME>.wsgi.application' AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] AUTHENTICATION_BACKENDS = ( 'social_core.backends.open_id.OpenIdAuth', 'social_core.backends.google.GoogleOAuth2', 'social_core.backends.facebook.FacebookOAuth2', 'django.contrib.auth.backends.ModelBackend', ) EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo' USE_I18N = True USE_TZ = True PROJECT_NAME = os.path.basename(BASE_DIR) STATIC_URL = 'static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] STATIC_ROOT = f'var/www/{PROJECT_NAME}/static' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' LOGIN_REDIRECT_URL = 'index' LOGOUT_REDIRECT_URL = 'index' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
settings/production.py
from .base import * SECRET_KEY = os.getenv('SECRET_KEY') DEBUG = False ALLOWED_HOSTS = ['<CUSTOM_DOMAIN>'] # データベース import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '/cloudsql/' + os.getenv('DB_CONNECTION_NAME'), 'USER': os.getenv('DB_USER'), 'PASSWORD': os.getenv('DB_PASSWORD'), 'NAME': os.getenv('DB_NAME'), } } # ストレージ from google.oauth2 import service_account GS_CREDENTIALS = service_account.Credentials.from_service_account_file( os.path.join(BASE_DIR, '<PROJECT_NAME>/settings/<CREDENTIAL_FILE>.json') ) DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage' STATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage' GS_BUCKET_NAME = os.getenv('GS_BUCKET_NAME') GS_PROJECT_ID = '<PROJECT_NAME>' # ソーシャルログイン SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = os.getenv('SOCIAL_AUTH_GOOGLE_OAUTH2_KEY') SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = os.getenv('SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET') SOCIAL_AUTH_FACEBOOK_KEY = os.getenv('SOCIAL_AUTH_FACEBOOK_KEY') SOCIAL_AUTH_FACEBOOK_SECRET = os.getenv('SOCIAL_AUTH_FACEBOOK_SECRET')
解决方案
方法1:移除不必要的导入(优先推荐)
直接删除/workspace/website/models.py第一行的import turtledemo.nim语句。该模块是Python自带的turtle演示代码,与Django应用业务逻辑无关,属于误导入或测试代码残留,移除后重新部署即可恢复正常。
方法2:若必须使用turtle/tkinter(不推荐)
GAE标准环境不支持图形界面相关依赖,若确实需要使用turtle或tkinter,需切换到GAE灵活环境,并通过自定义Docker镜像安装依赖:
- 创建
Dockerfile:
FROM python:3.8-slim RUN apt-get update && apt-get install -y --no-install-recommends tk-dev blt WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["gunicorn", "-b", ":$PORT", "<PROJECT_NAME>.wsgi:application"]
- 修改
app.yaml使用灵活环境:
runtime: custom env: flex entrypoint: gunicorn -b :$PORT <PROJECT_NAME>.wsgi:application # 其他配置保留或按需调整
此方式会增加部署复杂度和实例成本,仅适用于特殊场景。
内容的提问来源于stack exchange,提问作者Shintaro Takahashi
相关产品推荐
相关产品推荐

