尝试启动 Django 应用程序时 Gunicorn 不起作用

Posted

技术标签:

【中文标题】尝试启动 Django 应用程序时 Gunicorn 不起作用【英文标题】:Gunicorn does not work when try to launch Django application 【发布时间】:2018-03-08 00:55:56 【问题描述】:

我正在关注this 教程,直到这一部分。

start.sh

#!/bin/bash

# Start Gunicorn processes
echo Starting Gunicorn.
exec gunicorn helloworld.wsgi:application \
    --bind 0.0.0.0:8000 \
    --workers 3

我的目录是这样的。

awesome_app
-awesome_app
--__init__.py
--celery.py
--settings.py
--urls.py
--wsgi.py
-awesome_app_to_do_list
--a lot of stuffs here
-manage.py
-start.sh

这是我的 wsgi.py 的内容。

"""
WSGI config for airport 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/1.11/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "awesome_app.settings")

application = get_wsgi_application()

我根据这个调整了启动代码。

#!/bin/bash

# Start Gunicorn processes
echo starting gunicorn
exec gunicorn awesome_app.wsgi:application \
    --bind 0.0.0.0:8080 \
    --workers 3

在我使其可执行并从项目 awesome_app 的根目录而不是从 awesome_app/awesome_app 运行脚本之后。我收到了这个错误,ImportError: No module named 'myproject'。我看过this SO 讨论,但错误仍然存​​在。我该怎么办?

【问题讨论】:

你在哪里导入myproject wsgi 文件中的airport、启动脚本中的awesome_app 和错误消息中的myproject 不匹配。 @Oluwafemi Sule,我不知道。 Python + Gunicorn 教程中到处都在说。 @Alasdair,它应该是 awesome_app 对不起,来自错误的项目。 【参考方案1】:

进入你的项目目录,尝试在命令行中运行它而不是运行脚本,看看它是否有效:

gunicorn --bind 0.0.0.0:8000 myprojectname.wsgi

【讨论】:

我从项目根目录运行gunicorn --bind 0.0.0.0:8080 awesome_app.wsgi。同样的错误:ImportError: No module named 'myproject'.【参考方案2】:

BaconSandwich 的答案是要走的路。但是,如果需要脚本,请尝试将工作目录设置为脚本所在的目录。

#!/bin/bash
cd "$(dirname "$0")"

尝试将此添加到脚本中,看看它是否有效。

【讨论】:

嘿Dorian,它仍然有同样的错误,ImportError: No module named 'myproject'。不过,最好知道更改脚本所在的目录。谢谢!【参考方案3】:

首先The ONBUILD image variants are deprecated, and their usage is discouraged. For more details, see docker-library/official-images#2076.检查:Python Docker Hub

因此,对于更好地了解实际发生的情况的最佳实践方式,dockerfile 将如下所示:

重要提示确保您位于包含您启动的 django 项目和已执行的 start.sh 的主机目录中。

1) 获取FROM 基础镜像FROM python:2 如果要使用python3,请将其更改为3。

2) 在 docker img 中指定WORKDIR 让我们说WORKDIR /usr/scr/project 这将确保在运行 start.sh 时有正确的 gunicorn 路径

3) 复制COPYrequirements.txt到docker镜像COPY requirements.txt ./

4) 运行 RUN pip 以在 docker 镜像 pip install --no-cache-dir -r requirements.txt 中安装您的要求

5) 将COPY所有项目文件复制到docker镜像COPY . .

4) 定义启动命令CMDCMD ./start.sh

DockerFile

# Dockerfile

# Fetching `FROM` a base image `FROM python:2` 
# Change it to 3 if you want to use python3.
FROM python:2

# Specify WORKDIR inside the docker img 
# Lets say WORKDIR /usr/scr/project 
# That will insure a correct path to gunicorn when running the start.sh
WORKDIR /usr/scr/project

# Copying COPY requirements.txt to the docker image COPY requirements.txt ./
COPY requirements.txt ./

#Runing RUN pip to install your requirements inside the docker image pip install --no-cache-dir -r requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Copying COPY all the project files into the docker image COPY . .
COPY . .

# EXPOSE port 8000 to allow communication to/from server
EXPOSE 8000

# Define a starter command CMD CMD ./start.sh.
CMD ["./start.sh"]

已编辑:因为 dockerfile 中缺少 RUN

【讨论】:

【参考方案4】:

解决了这个问题。显然罪魁祸首是 celery.py 设置。在里面,我有这些代码。

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')

很愚蠢,我只是从 Celery + Django 示例中复制粘贴代码。更愚蠢,因为我的 Web 应用程序运行良好,不知道为什么。

所以我将 celery.py 中的代码更改为这些代码并且它正在工作。

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'awesome_app.settings')

app = Celery('awesome_app')

对于遇到相同问题的任何人,请查看 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') 并将 myproject 更改为您的 Django 项目名称。

【讨论】:

以上是关于尝试启动 Django 应用程序时 Gunicorn 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上带有 gunicorn 服务器的 Django 项目不提供静态文件

保存/更新模型时,Django“超过锁定等待超时;尝试重新启动事务”

部署到 Heroku 时 Django 应用程序崩溃 - Worker 无法启动

Heroku:每次测功机重新启动时都会丢失 Django 数据库文件

ModuleNotFoundError - 尝试启动服务时没有名为“main”的模块

安装 Mysql 时启动 DJango 服务器出错