Apache+mod_wsgi部署Django REST Framework时wsgi.py执行失败
Django+mod_wsgi部署问题排查
问题背景
通过Apache搭配mod_wsgi部署Django REST Framework,已完成mod_wsgi与Apache配置、settings.py静态文件设置及虚拟主机创建,但访问出现异常:
- 执行
curl 127.0.0.1:8001/django返回500内部服务器错误 - 执行
curl 127.0.0.1:8001提示客户端权限拒绝
使用虚拟环境且已安装所有依赖包,推测问题出在wsgi.py执行环节,但无法定位具体原因。
虚拟主机配置
<VirtualHost 127.0.0.1:8001 _default_:8001> ServerAlias * DocumentRoot /opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject ServerAdmin yaz@gmail.com # Set the path to your Django projec WSGIDaemonProcess myproject python-path=/opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject:/opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject:/opt/bitnami/projects/chatbotQZ/sources/env/lib/python3.7/site-packages WSGIProcessGroup myproject WSGIScriptAlias /django /opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject/wsgi.py # Configure access to static files Alias /static/ /opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/static <Directory /opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/static> Require all granted </Directory> <Directory /opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject> <Files wsgi.py> Require all granted </Files> <Files "favicon.ico"> Require all granted </Files> </Directory> ErrorLog /opt/bitnami/projects/chatbotQZ/sources/logs/drfapp_error.log CustomLog /opt/bitnami/projects/chatbotQZ/sources/logs/drfapp_access.log combined </VirtualHost>
wsgi.py内容
""" WSGI config for myproject project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') application = get_wsgi_application()
settings.py关键内容
""" Django settings for myproject project. Generated by 'django-admin startproject' using Django 3.2.18. """ import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = 'django-insecure-=z(3%l&3lrwvz16411c!-kjqaeb#@644o4$cd&go!w0ymi6(30' DEBUG = True ALLOWED_HOSTS = ['chatbotwQz.localhost'] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'base', ] AUTH_USER_MODEL = 'base.user_auth' WSGI_APPLICATION = 'myproject.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'chatbot', 'USER': 'root', 'PASSWORD': '', 'HOST': '127.0.0.1', 'PORT': '3306', } } STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, "static/")
错误日志
[Thu Jul 06 11:42:31.220822 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] mod_wsgi (pid=4299): Failed to exec Python script file '/opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject/wsgi.py'. [Thu Jul 06 11:42:31.220857 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] mod_wsgi (pid=4299): Exception occurred processing WSGI script '/opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject/wsgi.py'. [Thu Jul 06 11:42:31.220879 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] Traceback (most recent call last): [Thu Jul 06 11:42:31.220894 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] File "/opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject/wsgi.py", line 12, in <module> [Thu Jul 06 11:42:31.220936 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] from django.core.wsgi import get_wsgi_application [Thu Jul 06 11:42:31.220946 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] File "/opt/bitnami/projects/chatbotQZ/sources/env/lib/python3.7/site-packages/django/__init__.py", line 1, in <module> [Thu Jul 06 11:42:31.220977 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] from django.utils.version import get_version [Thu Jul 06 11:42:31.220986 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] File "/opt/bitnami/projects/chatbotQZ/sources/env/lib/python3.7/site-packages/django/utils/version.py", line 7, in <module> [Thu Jul 06 11:42:31.221024 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] from django.utils.regex_helper import _lazy_re_compile [Thu Jul 06 11:42:31.221033 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] File "/opt/bitnami/projects/chatbotQZ/sources/env/lib/python3.7/site-packages/django/utils/regex_helper.py", line 10, in <module> [Thu Jul 06 11:42:31.221092 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] from django.utils.functional import SimpleLazyObject [Thu Jul 06 11:42:31.221101 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] File "/opt/bitnami/projects/chatbotQZ/sources/env/lib/python3.7/site-packages/django/utils/functional.py", line 362, in <module> [Thu Jul 06 11:42:31.221165 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] class SimpleLazyObject(LazyObject): [Thu Jul 06 11:42:31.221178 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] TypeError: Error when calling the metaclass bases [Thu Jul 06 11:42:31.221183 2023] [wsgi:error] [pid 4299] [remote 127.0.0.1:35000] 'property' object is not callable
curl访问结果
- 执行
curl 127.0.0.1:8001/django返回:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>500 Internal Server Error</title> </head><body> <h1>Internal Server Error</h1> <p>The server encountered an internal error or misconfiguration and was unable to complete your request.</p> <p>Please contact the server administrator at yaz@gmail.com to inform them of the time this error occurred, and the actions you performed just before this error.</p> <p>More information about this error may be available in the server error log.</p> </body></html>
- 执行
curl 127.0.0.1:8001返回客户端权限拒绝。
解决方案
1. 修复mod_wsgi与Python版本不兼容问题
错误日志中'property' object is not callable是典型的mod_wsgi编译版本与虚拟环境Python版本不匹配导致的。Bitnami环境自带的mod_wsgi可能基于系统Python编译,和虚拟环境的Python3.7不兼容。
解决步骤:
- 卸载系统自带的mod_wsgi
- 激活虚拟环境并安装适配版本的mod_wsgi:
source /opt/bitnami/projects/chatbotQZ/sources/env/bin/activate pip install mod_wsgi
- 运行
mod_wsgi-express module-config获取模块配置代码,将其添加到Apache主配置文件中 - 重启Apache服务
2. 修正虚拟主机路径配置
WSGIDaemonProcess的python-path重复添加了内层项目目录,改为添加项目根目录(包含myproject和base的上级目录):
WSGIDaemonProcess myproject python-path=/opt/bitnami/projects/chatbotQZ/sources/team_city/myproject:/opt/bitnami/projects/chatbotQZ/sources/env/lib/python3.7/site-packages
3. 处理根路径权限问题
访问127.0.0.1:8001提示权限拒绝,可通过两种方式解决:
- 给
DocumentRoot目录添加全局访问权限:
<Directory /opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject> Require all granted </Directory>
- 或者将
WSGIScriptAlias映射到根路径,让根访问直接指向Django应用:
WSGIScriptAlias / /opt/bitnami/projects/chatbotQZ/sources/team_city/myproject/myproject/wsgi.py
4. 更新ALLOWED_HOSTS
当前配置仅允许chatbotwQz.localhost访问,添加127.0.0.1:
ALLOWED_HOSTS = ['chatbotwQz.localhost', '127.0.0.1']
5. 验证静态文件收集
确保已执行静态文件收集命令,将应用静态文件统一归集到STATIC_ROOT目录:
source /opt/bitnami/projects/chatbotQZ/sources/env/bin/activate python manage.py collectstatic
内容的提问来源于stack exchange,提问作者the_yaz2000
相关产品推荐
相关产品推荐

