使用Nginx GCE虚拟机加载Django网站需要更多的时间
我正在使用Django 1.7、Nginx和Google计算引擎虚拟服务器 但当我加载页面时,加载需要更多的时间 甚至我也优化了查询。我已经检查了这个查询,只花了不到一秒钟的时间。但即使是并行处理,整个页面也需要更多的时间 在上图中,第一个位大约需要7秒才能完成。 上图的细节如下所示 你能告诉我如何缩短等待时间吗 nginx或gcloud有什么问题吗 即使在服务器中,如果在渲染之前按时间差打印,也只需一秒钟即可执行。但我不知道为什么要花更多的时间才能完全加载一个页面 在example.com中,它位于/etc/nginx/site启用和站点可用的内部使用Nginx GCE虚拟机加载Django网站需要更多的时间,django,nginx,gcloud,Django,Nginx,Gcloud,我正在使用Django 1.7、Nginx和Google计算引擎虚拟服务器 但当我加载页面时,加载需要更多的时间 甚至我也优化了查询。我已经检查了这个查询,只花了不到一秒钟的时间。但即使是并行处理,整个页面也需要更多的时间 在上图中,第一个位大约需要7秒才能完成。 上图的细节如下所示 你能告诉我如何缩短等待时间吗 nginx或gcloud有什么问题吗 即使在服务器中,如果在渲染之前按时间差打印,也只需一秒钟即可执行。但我不知道为什么要花更多的时间才能完全加载一个页面 在example.com
upstream test {
server 127.0.0.1:8000;
keepalive 500;
}
server {
listen 80;
server_name myservername.com;
client_max_body_size 4G;
error_page 502 =200 @maintenance;
location @maintenance {
root /path/to/static/offline/files;
try_files $uri /index.html =503;
}
location /static/ {
alias /home/sim/5vs/staticfiles/;
}
location /media/ {
alias /home/sim/5vs/myproject/myproject/site_media/media/;
expires 30d;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://test;
break;
}
}
}
在nginx.conf文件中
user root;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
我的django视图文件是
@login_required
def dash_view(request):
t1 = datetime.now()
dashbardTempCont = {}
trLists =""
if 'label_id' in request.session:
if(request.session['label_id']!=""):
arId = request.session['label_id']
alLists = Al.objects.filter(user_id=arId).count()
dashbardTempCont['alCount'] = alLists
trLists = Tr.objects.filter(ar_id_id=arId).filter(~Q(al_id=None)).exclude(deleted_status=1).values_list('irc','ar_name','file')
else:
profileDetails = Profile.objects.get(user_id=request.session['_auth_user_id'])
if(str(profileDetails.user_type)=='A'):
arId = request.session['_auth_user_id']
alLists = Al.objects.filter(user_id=arId).count()
dashbardTempCont['alCount'] = alLists
trLists = Tracks.objects.filter(ar_id_id=arId).filter(~Q(al_id=None)).exclude(deleted_status=1).values_list('isrc','ar_name','file')
elif(str(profileDetails.user_type)=='M'):
userIdArr = []
arDetails = Profile.objects.filter(label_id=request.session['_auth_user_id'])
if(arDetails):
for arDetail in arDetails:
userIdArr.append(arDetail.user_id)
trLists = Tracks.objects.filter(ar_id__in=userIdArr).filter(~Q(al_id=None)).exclude(deleted_status=1).values_list('isrc','ar_name','file')
videoCnt = 0
trackCnt = 0
isrc = []
arName = []
for trackList in trLists:
isrc.append(trackList[0])
arName.append(trackList[1])
name, extension = os.path.splitext(trackList[2])
videoExtensionArr = ['.mp4','.png']
if extension in videoExtensionArr:
videoCnt = videoCnt +1
else:
trackCnt = trackCnt +1
dashbardTempCont['videoCnt'] = videoCnt
dashbardTempCont['trackCnt'] = trackCnt
"""
filter using ar_name for extra isrc protection.
"""
rtDetails = Rev_Rt.objects.filter(isrc__in=isrc).filter(ar_name__in=arName).values_list('store_name','rv');
spotifyDetails = ""
youtubeDetails = ""
rdioDetails = ""
googleDetails = ""
storeDetails = Store.objects.values_list('name')
for storeDetail in storeDetails:
if 'spotify' in storeDetail[0].encode('utf-8').lower():
spotifyDetails = rtDetails.filter(store_name=storeDetail[0].encode('utf-8'))
elif 'youtube' in storeDetail[0].encode('utf-8').lower():
youtubeDetails = rtDetails.filter(store_name=storeDetail[0].encode('utf-8'))
elif 'rdio' in storeDetail[0].encode('utf-8').lower():
rdioDetails = rtDetails.filter(store_name=storeDetail[0].encode('utf-8'))
elif 'google play' in storeDetail[0].encode('utf-8').lower():
googleDetails = rtDetails.filter(store_name=storeDetail[0].encode('utf-8'))
revenueArr = []
spRevenueArr = []
yRevenueArr = []
rdRevenueArr = []
gRevenueArr = []
for rtDetail in rtDetails:
if rtDetail[1]:
revenueArr.append(rtDetail[1])
for spDetail in spotifyDetails:
if spDetail[1]:
spRevenueArr.append(spDetail[1])
for yDetail in yDetails:
if yoDetail[1]:
yRevenueArr.append(yDetail[1])
for rdDetail in rdDetails:
if rdDetail[1]:
rdRevenueArr.append(rdDetail[1])
for gDetail in gDetails:
if gDetail[1]:
gRevenueArr.append(gDetail[1])
dashbardTempCont['totRevenue']=round(sum(revenueArr),2)
dashbardTempCont['sptotRevenue']=round(sum(sRevenueArr),2)
dashbardTempCont['ytotRevenue']=round(sum(yRevenueArr),2)
dashbardTempCont['rdtotRevenue']=round(sum(rdRevenueArr),2)
dashbardTempCont['gtotRevenue']=round(sum(gRevenueArr),2)
t2 = datetime.now()
t1 = datetime.now()
returndata = render_to_response('tr/dash.html',dashbardTempCont,context_instance=RequestContext(request))
t3 = datetime.now()
print (t3-t2).seconds,'seconds'
return returndata
当运行上面的视图文件时,它会在不到2秒的时间内打印完成进度,而将其渲染到模板需要更多的时间
我的示例模板文件示例是
<div class="upload-more-tracks clearfix text-center">
<div class="container">
{% if labelArLists.count > 5 %}
<a href="javascript:void(0);" class="np-track edit-prev prevItems pull-left"><i class="fa fa-angle-left"></i> <strong>Previous</strong></a>
{% endif %}
{% if request.session.label_artist_id %}
<a href="{% url 'track_management:label_view' %}"><span class="uploadingTracksCount">Return to your view</span></a>
{% endif %}
{% if labelArtistLists.count > 5 %}
<a href="javascript:void(0);" class="np-track edit-next nextItems pull-right"><strong>Next</strong> <i class="fa fa-angle-right"></i></a>
{% endif %}
</div>
</div>
<div class="dash-bottom">
{% if userType == "L" and labelArtist.id == "" %}
<p>Choose artist to upload tracks </p>
{% else %}
<ul class="clearfix">
<li>Albums <span>{{ alCount }}</span></li>
<li>Tracks <span>{{ trCnt }}</span></li>
<li>Videos <span>{{ videoCnt }}</span></li>
</ul>
{% endif %}
</div>
<script>
var doughnutData = [
{
value: {{ sptotRevenue }},
color:"#81b900"
},
{
// value : {{ gRevenue }},
value : {{ gRevenue }},
color : "#fc8521"
},
{
value : {{ ytRevenue }},
color : "#e12a27"
},
{
value : {{ rdRevenue }},
color : "#0086cd"
}
];
var myDoughnut = new Chart(document.getElementById("canvas").getContext("2d")).Doughnut(doughnutData);
</script>
{如果LabelAllists.count>5%,则为%1}
{%endif%}
{%if request.session.label_artist_id%}
{%endif%}
{%如果LabelArtistList.count>5%}
{%endif%}
{%if userType==“L”和labelArtist.id==“”%}
选择要上载曲目的艺术家
{%else%}
- 相册{{alCount}
- 磁道{{trCnt}
- 视频{{videoCnt}
{%endif%}
var doughnutData=[
{
值:{{sptotRevenue}},
颜色:“81b900”
},
{
//值:{{grevene}},
值:{{grevene}},
颜色:“fc8521”
},
{
值:{{ytRevenue}},
颜色:“e12a27”
},
{
值:{{rdRevenue}},
颜色:“0086cd”
}
];
var myDoughnut=新图表(document.getElementById(“canvas”).getContext(“2d”)).Doughnut(doughnutData);
。。。
我添加了django工具栏。截图附在下面
您在模板中“处理”了多少对象?如果超过十几个,您可以开始看到明显的延迟(取决于操作)。您提供的模板snippit似乎位于模板中for循环的内部,根据您的查询,您有一个相当可观的DB存在。您的视图需要2秒以上的时间这一事实也表明需要大量的处理 模板处理是Django最慢的部分。如果要处理模板中的大型迭代,那么应该在视图中尽可能多地过滤数据,或者在ORM中(通常更可取)或者在Python中。如果要在模板中丢弃/不显示元素,请确保提前从上下文中删除这些元素,这样模板就不会浪费时间。也考虑分页,人类不能同时吸收那么多的数据。< /P> 或者,您可能正在显示一张包含10首曲目的专辑,在这种情况下,我会找出模板中的哪些特定行存在问题,并相应地解决问题。在战略位置使用一个简单的模板标签打印出某处的时间戳 我看到的另一个问题是,在复杂且影响深远的查询中,基于ORM数据强制到模型的等待时间,但您的问题(主要)似乎与模板相关
我怀疑你的静态文件是罪魁祸首。您最初的评测图显示,静态文件在延迟接收初始HTML页面之后才被检索(这显然是web的工作方式,但我只是根据提供的数据为您的静态文件开脱).您应该在视图末尾返回一个没有任何上下文数据的空白html文件,并查看加载速度。此外,安装Django Debug Toolbar,它会告诉您查询需要多长时间、响应时间、加载DOM所花费的时间等@MarkGalloway我已经按照您所说的进行了测试,完整html文件需要15秒加载,空文件需要5秒加载。我已经添加了Django工具栏。我已经附上了它的屏幕截图。所以10秒的渲染时间被浪费了?您的变量很难读取,可能是在模板中意外地进行了一些查询,这非常缓慢。也许Django Debug工具栏能够告诉您是否有您不希望的任何额外查询。@MarkGalloway如果没有额外查询,则变量在我的计算机中已更改。所以你的结论是我们在模板文件中不做任何操作?所以我不得不忽略模板处理本身,在我的例子中,哪一个是最好的ORM或原始sql。或者我需要在orm中更改查询。我不了解staticfile部分。我已经检查了模板处理也只需要几秒钟。现在请查看我的查看文件returndata的耗时仅需约一秒钟。就静态文件而言,您看到的“延迟”