带有 nginx 和 unicorn 的 Django 静态文件

Posted

技术标签:

【中文标题】带有 nginx 和 unicorn 的 Django 静态文件【英文标题】:Django static files with nginx and unicorn 【发布时间】:2014-05-25 00:49:18 【问题描述】:

我正在尝试将我的 django 应用程序部署到我的 VPS。所以我遵循了几个教程,唯一的问题是我无法显示我的静态文件。因此,您可以在下面找到我在 VPS 上的文件结构。

虚拟环境:/opt/myapps/ Django 项目:/opt/myapps/uniprogress/ 静态文件:/opt/myapps/uniprogress/static/

nginx 配置:/etc/nginx/sites-available/uniprogress

server 
    server_name 188.xxx.xxx.93;

    access_log off;

    location /static/ 
        alias /opt/myapps/uniprogress/static/;
    

    location / 
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    

最后在我的 django settings.py 中:

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

# Template Dirs

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

# Static files (CSS, javascript, Images)
# https://docs.djangoproject.com/en/1.6/howto/static-files/

STATIC_ROOT = '/opt/myapps/uniprogress/static/'
STATIC_URL = '/static/'

我也使用了:python manage.py collectstatic,但我的静态文件仍然不会显示。

更新 我使用的教程可以在Digital Ocean找到。

我仔细检查了文件是否存在于服务器上。

我还可以访问静态文件,例如:http://188.xxx.xxx.93/static/css/bootstrap.css。

但是在我的源代码http://188.xxx.xxx.93:8001/ 中,它使用端口链接静态文件。

这意味着:<link href="/static/css/bootstrap.css" rel="stylesheet">

所以它尝试在http://188.xxx.xxx.93:8001/static/bootstrap.css 找到 bootstrap.css,但该文件不存在(必须删除帖子才能使其正常工作)。

【问题讨论】:

【参考方案1】:

要提供静态文件,请在 nginx 级别执行,如

server 
server_name 188.xxx.xxx.93;

access_log off;

location ~ ^/(static)/  
  #  root:- you static files path
  #  alias /opt/myapps/uniprogress/static/;
     root /opt/myapps/uniprogress/static/;


location / 
    proxy_pass http://127.0.0.1:8001;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Real-IP $remote_addr;
    add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';


现在所有静态文件都将从您的 nginx 提供服务。

【讨论】:

还是什么都没有。我更新了我的问题。如果你可以看看。似乎 nginx 工作正常,但 django 设置有问题。(指向静态的链接确实有端口,所以没有显示)。 我将我的 IP 改为我的域(在 gunicorn 中)并且它有效!谢谢!【参考方案2】:

您的 STATIC_ROOT 正在收集静态文件:

/opt/myapps/uniprogress/opt/myapps/uniprogress/static/

这与您的服务器配置不匹配,它指向:

opt/myapps/uniprogress/static/

STATIC_ROOT 只是一个文件夹,将所有静态文件(图像、css、所有内容)保存在一个位置以供部署,因此请将其设置为“/collected_static/”之类的内容并修复服务器配置。

【讨论】:

嗯,我阅读了很多关于部署的教程,似乎它必须像我写的那样。试过你说的,还是不行。 进行更改后您是否再次进行了collectstatic?【参考方案3】:

检查这些东西

1 静态older是否可以被nginx访问,我是说文件夹权限。

2 或者这样做

替换这个:

STATIC_ROOT = '/opt/myapps/uniprogress/static/'

有了这个

STATIC_ROOT = ''

并在设置中添加它

STATICFILES_DIRS = (
     '/opt/myapps/uniprogress/static/',
)

希望这行得通。

【讨论】:

我尝试添加STATICFILES_DIRS,但仍然没有结果。你能解释一下你在第一个中的意思吗? 我的意思是静态文件夹的访问权限。检查是755还是别的什么。 嗯,它是drwxr-xr-x 7 root root 4096 Apr 11 02:34 static。所以我认为是 755。 能否请您尝试使用 777 权限并重新启动 nginx。如果它没有检查 nginx error.log 文件并将错误粘贴到此处。 我做到了,我没有收到任何错误(有一些错误,但我在几个小时前配置了其他东西)。

以上是关于带有 nginx 和 unicorn 的 Django 静态文件的主要内容,如果未能解决你的问题,请参考以下文章

Unicorn 和 nginx (13: Permission denied)

调试 502 Bad Gateway 错误 - Ubuntu、Nginx、Unicorn

如何在生产中使用 Nginx 和 Unicorn 配置 ActionCable?

Nginx 无法使用 Unicorn 找到 unix 套接字文件

aws、django、unicorn 和 s3 - 那我需要 nginx 吗?

nginx + Unicorn + rails 的 IP 地址错误