2

我已经尝试调试了几个小时,但我不确定还要检查什么。我的问题是 Nginx 不提供 Django 静态文件。访问静态文件会导致错误403 Forbidden

来自nginx 错误日志的确切错误是:

2013/02/11 05:42:13 [error] 22526#0: *29 open() "/home/mydomain/public_html/test2/src/bootstrap.css" failed (13: Permission denied), client: XXX.XXX.XX.XX, server: mydomain.com, request: "GET /src/bootstrap.css HTTP/1.1", host: "www.mydomain.com"

这是我的nginx 配置文件

server {
    listen   XX.XX.X.XXX:80;
    server_name mydomain.com;
    root /home/mydomain/public_html/test2/app;
    # serve directly - analogous for static/staticfiles
    location /media/ {
        # if asset versioning is used
        if ($query_string) {
            expires max;
        }
    }
    location /admin/media/ {
        # this changes depending on your python version
        root /home/mydomain/public_html/test2/lib/python2.7/site-packages/django/contrib;
    } 
    location /src/ { 
        autoindex    on;   
        root /home/mydomain/public_html/test2;
    }     
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off; 
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8000/;
    }
    # what to serve if upstream is not available or crashes
    error_page 500 502 503 504 /media/50x.html;
}

静态文件存储在/home/mydomain/public_html/test2/src.

我试过了chown mydomain.mydomain -R *chmod 755 /home/mydomain -R *没有任何效果。

4

3 回答 3

2

用这个

顺便提一句。如果是邪恶的

server {
    listen 80;
    server_name mydomain.com;

    #access_log /var/log/nginx/x_access.log;
    #error_log /var/log/nginx/x_error.log;

    location /static {
        alias /path/to/your/static;
    }

    location /media {
        alias /path/to/your/media;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off; 
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8000/;
    }
}
于 2013-02-11T12:22:19.140 回答
2

这是我最初问题的有效解决方案:

server {
    listen   XX.XX.X.XXX:80;
    server_name mydomain.com;
    root /home/mydomain/public_html/test2/app;

    location /admin/media/ {
        # this changes depending on your python version
        root /home/mydomain/public_html/test2/lib/python2.7/site-packages/django/contrib;
    }
    location /src {
        root /home/mydomain/public_html/test2;
    }
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8000/;
    } 
    # what to serve if upstream is not available or crashes
    error_page 500 502 503 504 /media/50x.html;
}
于 2013-02-11T12:41:16.067 回答
0

另一种方法是使用 try_files。这样做的好处是 Nginx 将首先寻找一个真实的文件来提供服务,如果找不到它,它会将执行传递给您的 django 应用程序。例如,这非常适合提供动态 sitemap.xml,因为您不需要在 nginx.conf 中对文件进行特殊处理。

# Set default expires headers (used for static assets)
expires 30d;

server {
  listen 80;
  server_name mydomain.com;

  root /some/path/assets/;
  try_files $uri @django;

  location @django {
    expires -1d;
    proxy_set_header  Host $host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect    off;
    proxy_pass        http://unix:/some/path/server.sock;
  }

  location /static/admin/ {
    alias /some/path/lib/python2.7/site-packages/django/contrib/admin/static/admin/;
  }
}
于 2013-02-11T14:49:30.920 回答