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'),
)
从第一次编辑中的设置开始,我运行python myproject_django/manage.py collectstatic
,然后推送到heroku。 heroku open
仍然不提供静态文件。
在DEBUG=True
时点击图片会返回404错误:request url: http://myproject_django.herokuapp.com/static/media/pyk1.png
。
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
答案 0 :(得分:3)
您引用的博客文章可追溯到2011年11月,当/app
中安装了virtualenv时。 new style virtualenv提交已将虚拟环境从/app
移至/app/.heroku/venv
。
这解释了您的初始错误,/app/.heroku/venv/bin/gunicorn_django
应该存在。
这是不好的做法:
您无法通过在推送后收集静态文件来持久收集静态文件。阅读文档,特别是ephemeral filesystem part:collectstatic
和open
在两个不同的dynos中运行,第一个中收集的内容将无法用于第二个,从而解释了您在指向的内容中出现的不一致性编辑。
仅当您收集文件和在同一[web]
进程中启动服务器时才有效,但每次重新启动dyno时它都会重新收集所有静态文件。感觉就像糟糕的设计。
或者:
无论如何,通过优雅高效的工作流程提供静态资产并不容易。
恕我直言,最好在Procfile
中为每个进程添加一个命令,如果你想链接命令,我建议你开始编写部署脚本。
答案 1 :(得分:1)
确保您在settings.py中安装了gunicorn作为已安装的应用。
并尝试运行:
python my_project/manage.py run_gunicorn <options>