2013-02-11 236 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/; 
    } 
}