将静态内容从Django / Gunicorn传递给Nginx

时间:2014-06-23 20:08:57

标签: django nginx reverse-proxy gunicorn

我一直在玩Nginx& Gunicorn / Django过去两天。以为我在这里分享我的烦恼,希望有人可能有一个潜在的解决方案

我有两台独立的机器。在一个,我有一个安装了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?

期待听到您的建议!我是一个自学成才的菜鸟,所以任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:0)

如果告诉nginx识别URI / static /,它将为该目录下的所有文件提供服务。在你的mysite.conf中:

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

编辑:我将尝试解释为什么这样做。最初,Django正在管理您的所有URL。当它收到特定URL的请求时,会生成相应的响应。但是,当访问类似图像的内容时,初始响应包含类似<img>标记的内容,其中包含一个源代码。然后,客户端向此源URL发回请求并请求该图像。这里的重要部分是图像最初不与页面一起提供。另一个关键是nginx首先查看所有请求,并且只在必要时才传递给Django。如果你告诉nginx识别对/ static /的请求,你告诉它拦截并回答对这个URI的所有请求。因此,它将回答静态文件的请求,甚至没有传递给Gunicorn或Django。我也是新手,所以这可能不完全准确,但这是我最好的解释!

希望这有帮助。