2014-06-23 34 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