2013-02-11 151 views
2

我一直在试图调试这几个小时,我不知道还有什么要检查。我的问题是,Nginx不服务Django静态文件。访问静态文件导致错误403 ForbiddenNginx的/ Django的:访问静态文件的结果403禁止

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 *没有任何影响。

回答

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; 
} 
+0

嗨,你能解释一下这些配置究竟发生了什么? – 2016-02-11 23:16:18

2

使用此

btw。 IfIsEvil

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/; 
    } 
} 
+0

谢谢,你指出我正确的方向。我稍微定制了你的答案。我会将它作为单独的答案发布给其他人,以查看与我的原始文件相比有哪些变化。再次感谢! – finspin 2013-02-11 12:38:40

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/; 
    } 
}