2014-06-23 35 views
1

過去兩天我一直在玩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,所以任何幫助將非常感激!

回答

0

如果您告訴nginx識別URI/static /,它將提供該目錄下的所有文件。在你的mysite.conf中:

location /static/ { 
     alias /path/to/your/static/; 
} 

編輯:我會試着解釋它爲什麼會起作用。最初,Django正在管理您的所有網址。當它收到一個特定URL的請求時,它會生成適當的響應。但是,當訪問類似圖像的東西時,初始響應包含類似<img>標記的東西,其中包含源。客戶端然後發回請求到這個源URL並要求圖像。這裏最重要的部分是圖像最初沒有與頁面一起提供。另一個關鍵是nginx首先看到所有的請求,並且只在必要時傳遞給Django。如果你告訴nginx識別/ static /的請求,你告訴它攔截並回答對這個URI的所有請求。因此,它將回答對靜態文件的請求,甚至不會傳遞給Gunicorn或Django。我也是新手,所以這可能不是完全準確的,但這是我解釋的最佳選擇!

希望這會有所幫助。

+0

感謝您的回答。我相信你的回答是準確的。再一次感謝您爲我降下來! – noahandthewhale