2010-03-16 180 views
32

我使用的是Apache + mod_wsgi for django。
並且所有css/js/images通過nginx服務。
對於一些奇怪的原因,當others/friends/colleagues嘗試訪問該網站,jquery/cssnot getting loaded他們,因此該頁面看起來混亂起來。django:通過nginx提供靜態文件

我的HTML文件中使用這樣的代碼 -

<link rel="stylesheet" type="text/css" href="http://x.x.x.x:8000/css/custom.css"/> 
<script type="text/javascript" src="http://1x.x.x.x:8000/js/custom.js"></script> 

sites-available我的nginx的配置是這樣的 -

server { 
     listen 8000; 
     server_name localhost; 

     access_log /var/log/nginx/aa8000.access.log;  
     error_log /var/log/nginx/aa8000.error.log;  

      location/{ 
       index index.html index.htm;  
      }  

     location /static/ {  
      autoindex on;  
      root /opt/aa/webroot/;  
     }  
    } 

有已相應css & js目錄的目錄/opt/aa/webroot/static/

奇怪的是,當我訪問它們時頁面顯示正常。
我已經清除了我的緩存/ etc,但從各種瀏覽器加載的頁面都很好。

此外,我沒有看到404在nginx日誌文件中的任何錯誤。

任何指針都會很棒。

回答

13
  1. server_name必須link/script的URL匹配的主機名。無論是宣佈你的配置,默認爲這個接口:端口對(listen 8000 default
  2. Nginx的必須在您的主機的IP綁定的接口進行監聽(似乎確定你的情況)
3

魚翅&亞歷山大 - 謝謝爲那些幫助的提示。
這是我如何解決它爲任何人停留在同一條船上 -

settings.py -

>MEDIA_ROOT = ''  
MEDIA_URL = 'http://x.x.x.x:8000/static/'  

在我的HTML -

<script type="text/javascript" src="{{MEDIA_URL}}js/jquery-1.3.2.min.js"></script> 

在我的看法.py -

return render_to_response('templates/login-register.html', {}, 
          context_instance=RequestContext(request));  

nginx的站點可用的配置文件裏面 -

listen x.x.x.x:8000;  
server_name x.x.x.x.; 

重啓動nginx的
而重新啓動Apache的

+1

除非你在你的nginx配置文件中還有「位置/靜態」等Django將服務於靜態文件。很好的測試和開發,但不是一個好主意的生產。 – ostergaard 2013-04-10 11:05:13

63

我認爲使用root在位置塊是不正確。我使用alias,它工作正常,即使沒有重新配置Django。

# django settings.py 
MEDIA_URL = '/static/' 

# nginx server config 
server { 
    ... 
    location /static {  
     autoindex on;  
     alias /opt/aa/webroot/;  
    } 
} 

希望這可以讓事情變得更簡單。

+8

的確,'alias'是服務整個目錄的合適方法。 – xyzman 2012-04-25 12:27:35

+5

同樣適用於我,因爲/ static和/ static /是不同的位置,而在第二個變體中,我總是從nginx獲得權限錯誤。 – Dracontis 2012-08-17 12:13:13

+1

對於閱讀此內容的任何人。 Nginx的文檔清楚地表明:「當位置匹配指令值的最後部分時,最好使用root指令代替」http://nginx.org/en/docs/http/ngx_http_core_module.html#alias另請參見此答案:http://serverfault.com/a/278359 – PF4Public 2015-11-22 23:17:43

5

MEDIA_URL不得用於像js等靜態內容。Django提供了一個可以使用的單獨的STATIC_URL設置選項。

所以這是可以改變的

<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.3.2.min.js"></script> 

此外,它的更標準使用staticfile應用templatetag這樣的:

{% load static from staticfiles %} 
<script type="text/javascript" src="{% static 'js/jquery-1.3.2.min.js' %}"></script> 

Docs Here

3

我也掙扎與此有關。但是,下面的技巧爲我工作:

server { 
    listen 8000; 
    server_name localhost; 

    access_log /var/log/nginx/aa8000.access.log;  
    error_log /var/log/nginx/aa8000.error.log;  

     location/{ 
      index index.html index.htm;  
     }  

    location ^/static/ {  
     autoindex on;  
     root /opt/aa/webroot/;  
    }  
} 

我只是靜態標記的正則表達式與^和nginx的啓動提供靜態文件。 Django方面不需要修改。