[英]How to serve static content with Nginx and Django Gunicorn when using Traefik
[英]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.