過去兩天我一直在玩Nginx & Gunicorn/Django。以爲我會在這裏分享我的麻煩,希望有人可能有一個潛在的解決方案將靜態內容從Django/Gunicorn傳遞到Nginx
我有兩個單獨的機器。一方面,我有一個安裝了nginx的公共包裝盒,它用作我的其他內部盒子的反向代理,並安裝了Django和Gunicorn。
當網絡請求來自外部時,Nginx只是充當中間人,並將請求轉發給Django/Gunicorn。 Django/Gunicorn返回對Nginx的響應。然後Nginx將這個響應轉發回Web請求來自的地方。這是一個非常整潔的設置,因爲Nginx可以處理緩慢的客戶端並在DDOS攻擊的情況下受到打擊。你的實際應用服務器是安全的,不受任何損害:)
雖然我的應用程序不提供實際的靜態內容(圖片,視頻等)。我仍然希望將來自Gunicorn/Django的靜態內容傳遞給Nginx。目前,當我訪問Django管理員時,它只是純文本,沒有圖形或圖像。它真的很糟糕。但我注意到,當我直接訪問Gunicorn/Django服務器時,Django管理員的所有圖像都顯示出來了。我花了一段時間才明白這裏發生了什麼,並且我意識到靜態內容沒有被傳遞。
這裏是我當前的Django urls.py配置:
from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'django.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
這會自動查找Django管理文件,並通過Gunicorn它們提供給我。我不知道如何,但它的工作原理。我的調試設置設置爲True,所以我不知道這與它有什麼關係。
我的nginx的conf看起來是這樣的:
worker_processes 1;
events {
worker_connections 1024;
}
http {
sendfile on;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 1000;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript
application/x-javascript
application/atom+xml;
# Configuration containing list of application servers
upstream app_servers {
server 10.101.010.111:8000;
# server 127.0.0.1:8081;
# ..
# .
}
# I just added this in so that it will redirect all requests to HTTPs
server {
listen 80;
server_name *.mydomain.com;
rewrite ^/(.*) https://*.mydomain.com/$1 permanent;
}
# Configuration for Nginx
server {
# Running port
listen 443;
ssl on;
server_name *.mydomain.com;
### SSL log files ###
#access_log logs/ssl-access.log;
#error_log logs/ssl-error.log;
### SSL cert files ###
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
### Add SSL specific settings here ###
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
keepalive_timeout 15;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Settings to serve static files
location ^~ /static/ {
# Example:
# root /full/path/to/application/static/file/dir;
root /app/static/;
}
# Serve a static file (ex. favico)
# outside /static directory
location = /favico.ico {
root /app/favico.ico;
}
# Proxy connections to the application servers
# app_servers
location/{
proxy_pass http://app_servers;
proxy_redirect off;
proxy_set_header Accept-Encoding "";
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_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Front-End-Https on;
}
}
}
我如何可以傳遞的Django/Gunicorn到Nginx的靜態內容?
期待聽到您的建議!我是一個自學的noob,所以任何幫助將非常感激!
感謝您的回答。我相信你的回答是準確的。再一次感謝您爲我降下來! – noahandthewhale