使用django和gunicorn进行Heroku部署:缺少gunicorn_django文件或dir

时间:2012-08-17 15:19:34

标签: python django heroku gunicorn

This blog建议将以下内容放入我的Procfile

web: python myproject_django/manage.py collectstatic --noinput; bin/gunicorn_django --workers=4 --bind=0.0.0.0:$PORT myproject_django/settings.py

但是在Heroku上运行我的项目失败了。这来自$ Heroku logs

app[web.1]: bash: bin/gunicorn_django: No such file or directory

因此缺少gunicorn_django个文件/目录。那个文件/目录应包含什么,我应该把它放在哪里?

.
├── Procfile
├── myproject_django
│   ├── admin
│   ├── core
│   ├── __init__.py
│   ├── manage.py
│   ├── project_static
│   ├── settings.py
│   ├── templates
│   ├── urls.py
└── requirements.txt

修改

当我将Procfile更改为web: python myproject_django/manage.py run_gunicorn -b 0.0.0.0:$PORT -w 3时,我的项目运行正常(也提供静态文件)。

当我然后推送到heroku,并heroku run python myproject_django/manage.py collectstatic然后heroku open时,我的网站将被提供,静态文件除外。

(请注意,staticfiles目录为空)

.
├── Procfile
├── myproject_django
│   ├── admin
│   ├── core
│   │   ├── admin.py
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── static
│   │   │   ├── css
│   │   │   │   ├── base.css
│   │   │   │   ├── layout.css
│   │   │   └── media
|   |   |       ├── pek.ico
|   │   │       ├── pek.png
|   │   │       ├── pek_symbol.png
│   │   ├── tests.py
│   │   ├── views.py
│   ├── __init__.py
│   ├── manage.py
│   ├── settings.py
│   ├── staticfiles
│   ├── templates
│   │   └── core
│   │       ├── 404.html
│   │       ├── 500.html
│   │       ├── home.html
│   │       └── install.html
│   ├── urls.py
└── requirements.txt

在settings.py

PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'static/media')
STATIC_ROOT = os.path.join(PROJECT_PATH,'staticfiles')
STATICFILES_DIRS = (
    os.path.join(PROJECT_PATH, 'core/static'),
)

Edit2(至Maxime R。)

从第一次编辑中的设置开始,我运行python myproject_django/manage.py collectstatic,然后推送到heroku。 heroku open仍然不提供静态文件。 在DEBUG=True时点击图片会返回404错误:request url: http://myproject_django.herokuapp.com/static/media/pyk1.png

Edit3(至Maxime R.)

heroku日志

2012-08-18T10:18:37+00:00 heroku[web.1]: State changed from up to starting
2012-08-18T10:18:37+00:00 heroku[slugc]: Slug compilation finished
2012-08-18T10:18:38+00:00 heroku[web.1]: Starting process with command `python myproject_django/manage.py run_gunicorn -b 0.0.0.0:47262 -w 3`
2012-08-18T10:18:39+00:00 app[web.1]: /app/myproject_django
2012-08-18T10:18:39+00:00 app[web.1]: STATIC_ROOT: /app/myproject_django/staticfiles
2012-08-18T10:18:39+00:00 app[web.1]: STATICFILES_DIRS: '/app/myproject_django/core/static'
2012-08-18T10:18:39+00:00 app[web.1]: STATIC_ROOT: /app/myproject_django/staticfiles
2012-08-18T10:18:39+00:00 app[web.1]: STATICFILES_DIRS: '/app/myproject_django/core/static'
2012-08-18T10:18:39+00:00 app[web.1]: /app/myproject_django
2012-08-18T10:18:39+00:00 app[web.1]: 2012-08-18 05:18:39 [2] [INFO] Starting gunicorn 0.14.6
2012-08-18T10:18:39+00:00 app[web.1]: 2012-08-18 05:18:39 [2] [INFO] Listening at: http://0.0.0.0:47262 (2)
2012-08-18T10:18:39+00:00 app[web.1]: 2012-08-18 05:18:39 [2] [INFO] Using worker: sync
2012-08-18T10:18:39+00:00 app[web.1]: 2012-08-18 05:18:39 [5] [INFO] Booting worker with pid: 5
2012-08-18T10:18:39+00:00 app[web.1]: 2012-08-18 05:18:39 [6] [INFO] Booting worker with pid: 6
2012-08-18T10:18:39+00:00 app[web.1]: 2012-08-18 05:18:39 [7] [INFO] Booting worker with pid: 7
2012-08-18T10:18:39+00:00 app[web.1]: /app/myproject_django/app/myproject_django
2012-08-18T10:18:39+00:00 app[web.1]: /app/myproject_django
2012-08-18T10:18:39+00:00 app[web.1]: STATICFILES_DIRS: '/app/myproject_django/core/static'
2012-08-18T10:18:39+00:00 app[web.1]: STATIC_ROOT: /app/myproject_django/staticfilesSTATIC_ROOT: /app/myproject_django/staticfiles
2012-08-18T10:18:39+00:00 app[web.1]: STATICFILES_DIRS: '/app/myproject_django/core/static'
2012-08-18T10:18:39+00:00 app[web.1]: 
2012-08-18T10:18:39+00:00 app[web.1]: 
2012-08-18T10:18:39+00:00 app[web.1]: STATICFILES_DIRS: '/app/myproject_django/core/static'
2012-08-18T10:18:39+00:00 app[web.1]: STATIC_ROOT: /app/myproject_django/staticfiles
2012-08-18T10:18:40+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2012-08-18T10:18:40+00:00 heroku[web.1]: State changed from starting to up
2012-08-18T10:18:41+00:00 app[web.1]: 2012-08-18 05:18:41 [7] [INFO] Worker exiting (pid: 7)
2012-08-18T10:18:41+00:00 app[web.1]: 2012-08-18 05:18:41 [2] [INFO] Handling signal: term
2012-08-18T10:18:41+00:00 app[web.1]: 2012-08-18 05:18:41 [6] [INFO] Worker exiting (pid: 6)
2012-08-18T10:18:41+00:00 app[web.1]: 2012-08-18 05:18:41 [5] [INFO] Worker exiting (pid: 5)
2012-08-18T10:18:41+00:00 app[web.1]: 2012-08-18 05:18:41 [2] [INFO] Shutting down: Master
2012-08-18T10:18:42+00:00 heroku[web.1]: Process exited with status 0
2012-08-18T10:18:43+00:00 heroku[router]: GET myproject.herokuapp.com/ dyno=web.1 queue=0 wait=0ms service=36ms status=200 bytes=5474
2012-08-18T10:18:43+00:00 heroku[router]: GET myproject.herokuapp.com/static/media/pek.png dyno=web.1 queue=0 wait=0ms service=16ms status=404 bytes=2613

2 个答案:

答案 0 :(得分:3)

您引用的博客文章可追溯到2011年11月,当/app中安装了virtualenv时。 new style virtualenv提交已将虚拟环境从/app移至/app/.heroku/venv

这解释了您的初始错误,/app/.heroku/venv/bin/gunicorn_django应该存在。

这是不好的做法:

您无法通过在推送后收集静态文件来持久收集静态文件。阅读文档,特别是ephemeral filesystem partcollectstaticopen在两个不同的dynos中运行,第一个中收集的内容将无法用于第二个,从而解释了您在指向的内容中出现的不一致性编辑。

仅当您收集文件在同一[web]进程中启动服务器时才有效,但每次重新启动dyno时它都会重新收集所有静态文件。感觉就像糟糕的设计。

或者:

  • 在推送到heroku之前收集您的静态文件
  • 使用其他解决方案(如S3,即使博客文章的目的是不使用它)

无论如何,通过优雅高效的工作流程提供静态资产并不容易。

恕我直言,最好在Procfile中为每个进程添加一个命令,如果你想链接命令,我建议你开始编写部署脚本。

答案 1 :(得分:1)

确保您在settings.py中安装了gunicorn作为已安装的应用。

并尝试运行:

  

python my_project/manage.py run_gunicorn <options>