簡體   English   中英

將靜態內容從Django / Gunicorn傳遞到Nginx

[英]Passing Static Content from Django/Gunicorn to Nginx

在過去的兩天里,我一直在與Nginx和Gunicorn / Django合作。 以為我會在這里分享我的麻煩,希望有人可能有一個潛在的解決方案

我有兩台單獨的機器。 一方面,我有一個安裝了nginx的面向公眾的盒子,它充當了我安裝了Django和Gunicorn的其他內部盒子的反向代理。

當Web請求來自外部時,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?

期待聽到您的建議! 我是一個自學成才的菜鳥,因此我們將不勝感激!

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

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

編輯:我將嘗試解釋為什么這可行。 最初,Django是管理您所有的URL。 收到對特定URL的請求時,它將生成適當的響應。 但是,當訪問諸如圖像之類的東西時,初始響應包含諸如<img>標記之類的東西,其中包括源。 然后,客戶端將請求發送回該源URL,並請求圖像。 這里的重要部分是該圖像最初不會隨頁面一起提供。 另一個關鍵是nginx首先查看所有請求,並且僅在必須時才傳遞給Django。 如果您告訴nginx識別對/ static /的請求,則告訴它攔截並回答對此URI的所有請求。 因此,它會回答對靜態文件的請求,甚至不會傳遞給Gunicorn或Django。 我也是這個新手,所以這可能並不完全准確,但這是我最好的解釋!

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM