Docker部署Django应用运行Gunicorn出现ModuleNotFoundError错误
问题排查与解决方案
1. Gunicorn 找不到project_name模块问题
根因分析
- 实际Django项目内层配置模块名和启动参数不匹配:你的
wsgi.py文件明确标注项目名为creativ_ceutical,配置加载路径为creativ_ceutical.settings,但启动Gunicorn时用的是教程模板的占位名project_name.wsgi,属于模板字段未替换完全。 - 路径检索配置缺失:你cd到
/opt/app/project_name(manage.py所在目录)启动服务时,未显式将当前目录加入Python模块检索路径,也可能导致模块识别失败。
修复步骤
- 先确认
/opt/app/project_name/下和app_name同级的内层配置目录的实际名称,如果名称为creativ_ceutical,将start-server.sh中的Gunicorn启动命令修改为:
(cd project_name; gunicorn creativ_ceutical.wsgi --user www-data --bind 0.0.0.0:8010 --workers 3 --pythonpath .) &
其中--pythonpath .作用是显式将当前目录加入Python检索路径,规避路径识别异常。
- 同步检查
manage.py中的配置,确保os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xxx.settings')中的xxx和内层配置目录名、wsgi文件里的配置完全对齐。
2. Nginx 绑定80端口失败问题
根因分析
- 你的
nginx.default默认配置监听的是80端口,要么是容器内80端口已被占用,要么是Dockerfile中声明暴露的端口是8020,和Nginx监听端口不匹配,端口映射也没有对应配置。
修复步骤
- 修改
nginx.default配置,将监听端口改为8020,同时配置反向代理转发到Gunicorn的8010端口,参考配置片段:
server { listen 8020; server_name _; location / { proxy_pass http://127.0.0.1:8010; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 静态资源路由可自行补充,路径指向/opt/app/project_name/static即可 }
- 启动容器时对应配置端口映射,示例命令:
docker run -p 8020:8020 你的镜像名称,将宿主机8020端口和容器8020端口绑定。
验证排查技巧
可以先进入容器手动执行命令定位问题:
# 启动临时容器并进入bash交互 docker run -it --rm 你的镜像名称 bash # 切换到manage.py所在目录 cd /opt/app/project_name # 先验证Django本身可正常启动 python manage.py runserver 0.0.0.0:8010 # 确认无问题后再验证Gunicorn启动逻辑 gunicorn 你的内层配置目录名.wsgi --bind 0.0.0.0:8010 --workers 1
上述命令都能正常执行的情况下,再校验启动脚本、Nginx配置即可。
内容的提问来源于stack exchange,提问作者Lewis
相关产品推荐
相关产品推荐

