Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Nginx GCE虚拟机加载Django网站需要更多的时间_Django_Nginx_Gcloud - Fatal编程技术网

使用Nginx GCE虚拟机加载Django网站需要更多的时间

使用Nginx GCE虚拟机加载Django网站需要更多的时间,django,nginx,gcloud,Django,Nginx,Gcloud,我正在使用Django 1.7、Nginx和Google计算引擎虚拟服务器 但当我加载页面时,加载需要更多的时间 甚至我也优化了查询。我已经检查了这个查询,只花了不到一秒钟的时间。但即使是并行处理,整个页面也需要更多的时间 在上图中,第一个位大约需要7秒才能完成。 上图的细节如下所示 你能告诉我如何缩短等待时间吗 nginx或gcloud有什么问题吗 即使在服务器中,如果在渲染之前按时间差打印,也只需一秒钟即可执行。但我不知道为什么要花更多的时间才能完全加载一个页面 在example.com

我正在使用Django 1.7、Nginx和Google计算引擎虚拟服务器

但当我加载页面时,加载需要更多的时间

甚至我也优化了查询。我已经检查了这个查询,只花了不到一秒钟的时间。但即使是并行处理,整个页面也需要更多的时间

在上图中,第一个位大约需要7秒才能完成。 上图的细节如下所示

你能告诉我如何缩短等待时间吗

nginx或gcloud有什么问题吗

即使在服务器中,如果在渲染之前按时间差打印,也只需一秒钟即可执行。但我不知道为什么要花更多的时间才能完全加载一个页面

在example.com中,它位于/etc/nginx/site启用和站点可用的内部

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的耗时仅需约一秒钟。就静态文件而言,您看到的“延迟”