代码之家  ›  专栏  ›  技术社区  ›  mlissner

如何有效地为Django的大型站点地图提供服务

  •  16
  • mlissner  · 技术社区  · 14 年前

    我有一个网站,它的网站地图上有大约15万页。我正在使用站点地图索引生成器制作站点地图,但实际上,我需要一种缓存方法,因为在我的服务器上构建150个包含1000个链接的站点地图是很残酷的。

    我可以用memcached缓存每一个站点地图页面,这就是我在站点上其他地方使用的内容……但是,这是如此多的站点地图,以至于它会完全填满memcached……所以这不起作用。

    我认为我需要的是一种将数据库用作这些缓存的方法,并且仅在对它们进行更改时生成它们(由于站点地图索引的结果,这意味着只更改最新的两个站点地图页面,因为其余页面总是相同的)。[2]但是,据我所知,我只能在Django中使用一个缓存后端。

    我怎么能准备好这些网站地图,当谷歌来了-一个-爬行'没有杀死我的数据库或memcached?

    有什么想法吗?

    [1]我将每个站点地图页面的链接数限制为1000个,因为最多只能生成50000个链接,但这并没有发生。

    [2]例如,如果我有sitemap.xml?page=1,page=2…sitemap.xml?page=50,我只需要更改sitemap.xml?page=50,直到它满了1000个链接,然后我就可以永远访问它了,并关注第51页,直到它满了为止,永远缓存它,等等。

    编辑,2012-05-12: 这仍然是一个问题,我最终放弃了Django的站点地图框架,在将其与文件缓存一起使用了大约一年之后。相反,我现在使用solr在一个非常简单的视图中生成我需要的链接,然后将它们传递到django模板。这个 大大地 简化了我的站点地图,使它们运行得很好,到目前为止,我已经有大约2250000个链接了。如果你想这样做,只需查看站点地图模板-从那里一切都很明显。您可以在此处看到此代码: https://bitbucket.org/mlissner/search-and-awareness-platform-courtlistener/src/tip/alert/casepage/sitemap.py

    4 回复  |  直到 6 年前
        1
  •  9
  •   dar    14 年前

    我遇到了类似的问题,决定使用django在静态媒体中将站点地图文件写入磁盘,并让Web服务器为其提供服务。我打电话每隔几个小时重新生成一次站点地图,因为我的内容变化并不比这更频繁。但这将取决于你的内容,你需要多久写一次这些文件。

    我对cron作业使用了django自定义命令,但对cron作业使用curl更容易。

    下面是我如何使用curl,我将apache send/sitemap.xml作为静态文件,而不是通过django:

    curl -o /path/sitemap.xml http://example.com/generate/sitemap.xml
    
        2
  •  9
  •   Greg Sadetsky    6 年前

    好吧-我发现了更多关于这个的信息,以及亚马逊在他们600万左右的网址上做了什么。

    亚马逊只需为每天制作一张地图并添加:

    1. 新网址
    2. 更新网址

    这意味着他们最终会得到大量的站点地图——但是搜索机器人只会查看最新的地图——因为更新的日期是最近的。我理解一个人应该刷新一个地图-并且不能多次包含一个URL。我认为这是真的。但是,亚马逊绕过了这一点,因为网站地图更像是一个日志。一个URL可能会出现在一个更新后的站点地图中,但谷歌不会在旧地图过时的情况下查看旧地图,除非它确实做了一个主要的重新索引。这种方法很有意义,因为你所做的只是构建一个新的地图——比如每天更新新内容,并在谷歌上ping它——因此谷歌只需要索引这些新的网址。

    这种日志方法与代码是同步的,因为您所需要的只是一个静态数据存储模型,它存储每个映射的XML数据。您的cron作业可以每天或每周构建一个映射,然后将原始XML页面存储在blob字段或您拥有的内容中。然后,您可以直接从一个处理程序和索引映射服务页面。

    我不知道其他人怎么想,但这听起来像是一个非常可行的方法和一个加载一个服务器-相比之下,重建巨大的地图只是因为几个页面可能已经改变。

    我还考虑过,可能会将一周的地图压缩成一周的地图,将4周的地图压缩成一个月的地图——所以你最终得到的是每月的地图,当月每周的地图,以及过去7天的地图。假设所有的日期都保持不变,这将减少地图的数量,整理整个过程-我认为每年每天减少365张地图,减少到12张。

    这里是一个PDF的网站地图和亚马逊和CNN使用的方法。

    http://www.wwwconference.org/www2009/proceedings/pdf/p991.pdf

        3
  •  3
  •   Murat Çorlu beardofprey    12 年前

    我在用 django-staticgenerator 用于将sitemap.xml缓存到文件系统并在数据更新时更新该文件的应用程序。

    设置:

    STATIC_GENERATOR_URLS = (
        r'^/sitemap',
    )
    WEB_ROOT = os.path.join(SITE_ROOT, 'cache')
    

    模型:

    from staticgenerator import quick_publish, quick_delete
    from django.dispatch import receiver
    from django.db.models.signals import post_save, post_delete
    from django.contrib.sitemaps import ping_google
    
    @receiver(post_delete)
    @receiver(post_save)
    def delete_cache(sender, **kwargs):
        # Check if a Page model changed
        if sender == Page:
            quick_delete('/sitemap.xml')
            # You may republish sitemap file now
            # quick_publish('/', '/sitemap.xml')
            ping_google()
    

    在nginx配置中,我将sitemap.xml重定向到缓存文件夹和django实例以进行回退:

    location /sitemap.xml {
        root /var/www/django_project/cache;
    
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    
        if (-f $request_filename/index.html) {
            rewrite (.*) $1/index.html break;
        }
        # If file doesn't exist redirect to django
        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:8000;
            break;
        }    
    }
    

    使用此方法,Sitemap.xml将始终更新,客户机(如Google)始终静态获取XML文件。我觉得很酷!:)

        4
  •  0
  •   s29    11 年前

    对于那些(出于任何原因)希望保持其站点地图动态生成的人(例如新鲜度、懒散度)。尝试 django-sitemaps . 这是标准站点地图的流式版本。替换掉。更快的响应时间和更少的内存。