让Nginx处理Django的静态文件

现象描述

前端通过Nginx访问pdf时在不同的浏览器、不同的环境上表现的不完全一样。偶然性特别大,有时候能正常加载pdf文件,有时候提示“未能加载PDF文档”,如图【未能加载pdf文档】所示。最关键的是不走Nginx,通过ip和端口号能正常加载pdf文档,一旦走了Nginx就出现上述所说那种不稳定的现象。


未能加载pdf文档.png

产生原因

在开发和正式环境采用Django自带的from django.views.static import serve处理静态文件加载问题,如下述代码所示。

from django.conf.urls import include, url, patterns
from django.contrib import admin
from django.conf import settings
from django.views.static import serve

urlpatterns = patterns('',
                        # xxxx PDF路径  settings.ALERT_PDF_ROOT  是在settings.py中写的变量(pdf所在路径)
                        url(r'^my-report/(?P<path>.*)$', serve,
                            {'document_root': settings.ALERT_PDF_ROOT}),
                       )

在有Nginx的正式环境中是这样配置的Nginx,如下述代码所示。

location ~*\/my-report/ {
            proxy_connect_timeout 600;
            proxy_send_timeout 600;
            proxy_read_timeout 600;
            proxy_pass http://web.xxx.com:9010; #Django项目启动的端口号
            proxy_set_header X-Real-IP $remote_addr;
        }

原因分析

Django的django.views.static.serve处理静态文件适合在开发环境,而正式部署时,Django不需要做任何事情,让Nginx来处理静态文件即可。

解决方案

先注释掉在Django的urls.py中用django.views.static.serve处理静态文件那段代码,然后将Nginx的配置文件改成如下代码所示。

# xxx是pdf所在路径,举例:
# pdf所在路径为: /home/xxx/report/pdf/
# 那么xxx的值就应该为 /home/xxx/report/pdf/
location /my-report/ {
    alias xxx; 
}

知识扩展-1(未亲测,仅供参考)

若想在开发环境用django.views.static.serve处理静态文件,在正式环境中用Nginx处理静态文件,且在正式环境中不想注释用django.views.static.serve写的处理静态文件的代码的话,那么可以如下操作:

#在urls.py文件中最后加上以下代码----此方法未亲自验证,参考https://my.oschina.net/u/993130/blog/214841
# settings.ALERT_PDF_ROOT 是在settings.py中配置的pdf所在路径
if settings.DEBUG:    
    urlpatterns += patterns('',
                url(r'^my-report/(?P<path>.*)$', 'django.views.static.serve',
                {'document_root': settings.ALERT_PDF_ROOT},name="my-report"),
    )

在开发环境DEBUG = True,自然会走Django处理静态文件这一条路,而在正式环境中DEBUG = False,自然不会让Django处理静态文件
Nginx按处理静态文件来处理,就像上面写的解决方案那样处理静态文件即可。

知识扩展-2 (亲测了alias这种,另一种未亲测,仅供参考)

root目录与alias目录的区别(Nginx路径location配置中,使用root目录与alias目录的区别)

  • alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的
  • root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;

举例说明

比如静态资源文件在服务器/var/www/static/目录下
  1)配置alias目录

location /static/ {
    alias  /var/www/static/;
}

注意:alias指定的目录后面必须要加上"/",即/var/www/static/不能改成/var/www/static
  访问http://IP:PORT/static/index.html时,实际访问的是/var/www/static/index.html
  
  2) 也可改成配置root目录

location /static/ {
    root  /var/www/;
}

注意:location中指定的/static/必须是在root指定的/var/www/目录中真实存在的
  两者配置后的访问效果是一样的。

配置习惯

一般情况下,在nginx配置中的良好习惯是:

  1. 在location / 中配置root目录
  2. 在location /somepath/ 中配置alias虚拟目录

配置默认主页

比如访问 http://IP:PORT/,默认访问服务器/var/www/static/目录下的index.html
  1)配置alias目录方式

location / {
    alias  /var/www/static/;
    index  index.html index.htm;
}

2)配置root目录方式

location / {
    root  /var/www/static/;
    index  index.html index.htm;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容