2016-11-13 123 views
0

我不知道nginx怎麼服務於靜態文件的Django + Nginx的+ Gunicorn - 404靜態文件時,調試是假

的/ etc/nginx的/現場可用/默認:

upstream example.com { 
    server unix:/home/www/example/env/run/gunicorn.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name example.com; 
    client_max_body_size 4G; 

    access_log /home/www/example/logs/nginx-access.log; 
    error_log //home/www/example/logs/nginx-error.log; 

    location /static/ { 
     alias /home/www/example/codeab/static/; 
    } 

    location /uploads/ { 
     alias /home/www/example/codeab/uploads/; 
    } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock; 
    } 
    # Error pages 
    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /home/www/example/templates/; 
    } 
    error_page 404 /401.html; 
    location = /401.html { 
     root /home/www/example/codeab/templates/; 
     internal; 
    } 
} 

Django的設置的.py

STATIC_URL = '/static/' 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static_content/'), 
) 
STATIC_ROOT = os.path.join(BASE_DIR,'static/') 

而且,我做了DEBUG之前collectstatic =假

看來,nginx的是不考慮上面的配置文件,因爲404頁面沒有顯示我的自定義401.html頁面。

編輯配置後,我把它鏈接到由

sudo ln -s /etc/site-available/default /etc/site-enabled/default 
service nginx reload 
sudo service nginx restart 

啓用站點請幫幫忙,或者讓我知道如果我錯過任何東西。

+0

歡迎來到Stack Overflow!感謝您發佈這樣的問題的詳細描述,這有助於很多。在我們深入到問題的要點之前,有幾件事情。如果NGINX沒有看到配置文件,它是如何爲你的靜態文件返回404的?你在最後說的鏈接是正確的,但是如果它使用include/etc/site-enabled/*;或者include/etc/site-enabled/*,你需要檢查'nginx.conf' .conf;'如果它是'* .conf',則需要將'default'重命名爲'default.conf'。另外,你的'site-enabled'和'site-available'位於'/ etc /' –

+0

這有點奇怪,這不是標準安裝。在您的自定義4xx模板的情況下:如果NGINX正在提供這個,它需要是一個靜態的HTML文件。它沒有任何模板標籤,因爲它沒有被Django處理。我的建議是使用Django的內部錯誤模板。最後,關於你的靜態文件,配置是正確的。我唯一要改變的是'location ^〜/ static/{'這樣NGINX就知道它必須做一個正則表達式匹配而不是直接字符串比較。 –

+0

嗨Keenan,謝謝你的快速反應。我檢查了我的nginx.conf,它是'include/etc/site-enabled/*;'所以文件名是正確的,即'默認' – anuj249

回答

0

在nginx的服務器塊只要改變你的配置從

location /static/ { 
     alias /home/www/example/codeab/static/; 
    } 

location /static/ { 
     alias /home/www/example/codeab/static_content/; 
    } 

原因,python manage.py collectstatic已執行 靜態文件都被置於static_content文件夾內的命令後。

+0

試過了,仍然沒有工作。在執行collectstatic之後,static_content中的所有文件都被放置到靜態文件夾中。這就是爲什麼你投了票。 – anuj249

+0

所以你找到了解決方案 – pitaside

1

我不知道確切的解決方案,但它開始改變我的gunicorn從xxx.xxx.xx.xx:80結合工作,xxx.xx.xx.xx:8000 和編輯配置爲 -

location/{ 
     include proxy_params; 
     #proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock; 
     proxy_pass http://xxx.xxx.xx.xx:8000; 
    } 

我評論襪子文件的proxy_pass,並添加了新的生產線,你可以看到上面。

0

Nginx在location /static/下提供nginx配置文件中定義的dir的靜態文件,並在定義的dir中找不到定義的靜態資源時,重定向到nginx config中定義的自定義404 html頁面。

Django的顯示,當它沒有找到任何的Django urls.py文件指定網址的自定義404 html頁面,只要你在settings.py設置Debug = False也點'TEMPLATES'-'DIRS'設置到包含您的自定義404迪爾html文件,如Django documentation中所述。

因此,實際上nginx和Django顯示相同的404頁面的方式是不同的,彼此獨立。