为啥 nginx 不会用 django 和 gunicorn 显示静态内容?
Posted
技术标签:
【中文标题】为啥 nginx 不会用 django 和 gunicorn 显示静态内容?【英文标题】:Why won't nginx show static content with django and gunicorn?为什么 nginx 不会用 django 和 gunicorn 显示静态内容? 【发布时间】:2019-07-12 07:24:40 【问题描述】:我正在尝试在带有 python 3.5.3 和 django 2.1.7 的树莓派 3(raspian 9)上使用 gunicorn 19.19.0 和 nginx 1.10.3 运行 django 管理应用程序。 Nginx 似乎工作正常,并且 nginx 和 gunicorn 错误日志为空。但是,该应用不会显示任何静态内容。
我检查了 nginx.conf 文件。
我运行了 collectstatic 并检查了所有文件是否都在那里。
我可以将浏览器指向 192.168.1.20/static,它会显示正确的目录。
我还可以浏览所有文件。
我尝试使用 '/' 跟随 nginx.conf 文件中的路径
管理应用程序的所有功能都可以正常工作。只是没有静态内容。
我已经用谷歌搜索并阅读/尝试了我能找到的每个论坛修复程序。
我还运行了 python 开发服务器(python manage.py runserver)。在该配置中,静态内容显示得很好。
nginx.conf 文件
events
http
server
listen 80;
server_name localhost;
location /static
autoindex on;
alias /home/pi/DigitalClock/dcvenv/static;
location /
error_log /home/pi/DigitalClock/dcvenv/nginx_err.log;
access_log /home/pi/DigitalClock/dcvenv/nginx_acc.log;
proxy_pass http://127.0.0.1:8000;
gunicorn 启动命令
gunicorn dcweb.wsgi:application --bind localhost:8000
django 项目设置文件
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static/')
ngnix_acc.log 的最后一个条目(*_err.log 为空)
192.168.1.10 - - [18/Feb/2019:12:45:43 -0800] "POST /admin/login/?next=/admin/ HTTP/1.1" 302 0 "http://192.168.1.20/admin/login/?next=/admin/" "Mozilla/ 5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(Khtml,如 Gecko)Chrome/71.0.3578.98 Safari/537.36" 192.168.1.10 - - [18/Feb/2019:12:45:43 -0800] "GET /admin/ HTTP/1.1" 200 4944 "http://192.168.1.20/admin/login/?next=/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit /537.36(KHTML,如 Gecko)Chrome/71.0.3578.98 Safari/537.36" 192.168.1.10 - - [18/Feb/2019:12:45:59 -0800] "GET /admin/auth/group/HTTP/1.1" 200 3500 "http://192.168.1.20/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64 ; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" 192.168.1.10 - - [18/Feb/2019:12:45:59 -0800] "GET /admin/jsi18n/HTTP/1.1" 200 3185 "http://192.168.1.20/admin/auth/group/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64 ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
【问题讨论】:
您的访问日志仅针对位置 / 定义。此日志中没有静态条目也就不足为奇了。 html生成是否包含静态链接? 是的,生成的 html 包含如下链接: 在你的 nginx 配置文件中,为静态文件添加一个/
为:location /static/ alias /home/pi/DigitalClock/dcvenv/static/ ;
,同时尝试删除自动索引。
谢谢。我试过了。没有运气。
【参考方案1】:
将此代码放在你的settings.py中,然后你就有collectstatic
,还测试DEBUG = True
是否有
ROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # specify static root
添加到你的 url 项目中
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
更新为您的项目尝试这种方式。:
urlpatterns = patterns('',
....urls......
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
在你的 settings.py 中
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
REPOSITORY_ROOT = os.path.dirname(BASE_DIR)
# Static files (CSS, javascript, Images)
# https://docs.djangoproject.com/en/1.6/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(REPOSITORY_ROOT, 'static/')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(REPOSITORY_ROOT, 'media/')
【讨论】:
我假设您的意思是“PROJECT_ROOT”。尝试了您的建议;使用这些条目更改了 setttings.py,重新运行 python manage.py collectstatic,重新启动 nginx/gunicorn,刷新浏览器。同样的问题。唯一不同的是现在我也可以浏览 192.168.1.02/staticfiles。 项目 urls.py 现在看起来像; urlpatterns = [ path('admin/', admin.site.urls), path("", include('dchome.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings .STATIC_URL, document_root=settings.STATIC_ROOT) 我重新启动 nginx/gunicorn 并将浏览器指向 192.168.1.20/admin。在 /admin/ name 'static is not defined 得到 NameError 是的,项目 settings.py 中的 debug=true 抱歉忘记了您对 urls.py 的建议导入。将浏览器指向 192.168.1.20/admin,现在得到:“在 /admin/ 处配置不当,不允许使用空静态前缀。 我尝试了您的最新建议。现在应用程序可以运行,但没有静态内容。以上是关于为啥 nginx 不会用 django 和 gunicorn 显示静态内容?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在使用 Nginx 和 Gunicorn 的 Django 应用程序上得到 502 Bad Gateway?
为啥建议使用不同的服务来托管 django 的静态文件(如 nginx 或 apache)?
使用 Guns 自动生成 SpringBoot + LayUI 的后台管理系统