2016-12-05 38 views
1

我試圖在配置nginx作爲反向代理之前使用gunicorn來提供靜態文件,並且我有點困惑。Gunicorn如何收集靜態?

當我運行我的應用程序時,它似乎像gunicorn無法找到應用程序中的靜態文件夾。

我有以下腳本來運行我的Django應用程序。

#!/bin/bash 

# Start with development server 
# echo Start server. 
# python manage.py runserver 0.0.0.0:8000 

# python manage.py collectstatic --noinput # Collect static files 

# # Prepare log files and start outputting logs to stdout 
touch /srv/logs/gunicorn.log 
touch /srv/logs/access.log 
tail -n 0 -f /srv/logs/*.log & 

# # Start Gunicorn processes 
echo Starting Gunicorn. 
exec gunicorn django_project.wsgi:application \ 
    --name ds4dems \ 
    --bind 0.0.0.0:8000 \ 
    --workers 3 \ 
    --log-level=info \ 
    --log-file=/srv/logs/gunicorn.log \ 
    --access-logfile=/srv/logs/access.log \ 
    "[email protected]" 

結果是樣式和圖像不是從main_app靜態文件夾收集的。

文件夾結構如下。

django_project 
---- django_project 
---- main_app 
-------- static 

以下我試圖用開發服務器運行相同的應用程序,並收集靜態數據。然後,我再次與Gunicorn合作,並將樣式和圖像傳送給瀏覽器而不會出錯。

究竟發生了什麼?

這是否與this?是唯一可用的選項來設置nginx讓他看到文件?

+1

我有一張你可能會覺得有用的圖畫:http://djangodeployment.com/2016/11/21/how-django-static-files-work-in-production/。它假設你使用'nginx'或'apache',但即使使用whitenoise,它也可能是有用的,因爲原理是相同的。 –

+0

太好了。我會爲此製作一張海報。 :) – sparaflAsh

回答

2

通過使用額外的中間件庫可以爲gunicorn提供靜態文件:Whitenoise。正如該文檔所示,幾乎所有您需要做的就是將其包含在MIDDLEWARE_CLASSES設置中。

但請注意,仍然最好直接通過nginx提供文件,而不是沿着這條路線。

另請注意,您似乎對收集靜態文件和提供服務之間的區別感到困惑。 「收集」指的是進入所有你個人的靜態目錄和複製/鏈接文件進行服務的過程。這是manage.py collectstatic命令的工作:它與gunicorn或nginx無關,您將始終需要運行該命令。一旦你這樣做了,你將能夠直接或通過whitenoise爲他們服務。

+0

我很困惑。我不得不註釋'python manage.py collectstatic --noinput',因爲它似乎無法找到靜態。爲什麼開發服務器成功並且應用程序不成功? – sparaflAsh

+1

糟糕。我想我只需要設置STATIC_ROOT和STATIC_URL。在settings.py中使用collectstatic應用程序。 – sparaflAsh

0

Gunicorn本身只提供動態文件。您可以使用AWS S3RawGit來爲靜態資產提供服務。

相關問題