2010-05-11 49 views
15

我有一个站点地图上有大约150K页的站点。我正在使用站点地图索引生成器来制作站点地图,但实际上,我需要一种缓存方式,因为在我的服务器上构建150个站点地图,每个站点地图都是很残酷的[1]。如何在django中高效地服务大量的站点地图

我可以缓存每个这些网站地图页面与memcached,这就是我在网站上的其他地方......但是,这是如此之多的站点地图,它会完全填满memcached ....因此,工作。

我认为我需要的是一种使用数据库作为这些缓存的方式,并且只有在它们发生变化时才会生成它们(这是因为站点地图索引意味着只更改最新的几个站点地图页面,因为其余部分总是相同的。)[2]但是,就我所知,我只能用django使用一个高速缓存后端。

如何在Google来到“a-crawlin”时准备好这些站点地图,而不会杀死我的数据库或memcached?

有什么想法?

[1]我已将它限制为每个站点地图页面1,000个链接,因为生成最多50,000个链接,但没有发生。

[2]例如,如果我有sitemap.xml?page = 1,page = 2 ... sitemap.xml?page = 50,我只需要更改sitemap.xml?page = 50,直到它充满1,000链接,那么我可以它几乎永远,集中51页上,直到它的全部,它缓存永远等

编辑,2012-05-12:这仍然是一个问题,并且在将它与文件缓存一起使用约一年后,我终于放弃了Django的站点地图框架。相反,我现在使用Solr在一个非常简单的视图中生成我需要的链接,然后将它们传递给Django模板。这大大简化了我的站点地图,使他们表现得很好,我现在达到约2,250,000个链接。如果你想这样做,只需查看网站地图模板 - 这一切都非常明显。你可以在这里看到这里的代码:https://bitbucket.org/mlissner/search-and-awareness-platform-courtlistener/src/tip/alert/casepage/sitemap.py

+0

不,它们适用于机器人。请不要忽视它们。详细信息:sitemaps.org – mlissner 2010-05-11 02:28:12

回答

9

我有一个类似的问题,并决定使用django将静态媒体中的站点地图文件写入磁盘,并让Web服务器为它们提供服务。由于我的内容并没有经常变化,因此我每两个小时就打电话重新创建一次站点地图。但是这取决于你的内容多久你需要写这些文件。

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

下面是我如何使用curl和我的Apache发送/sitemap.xml作为一个静态文件,而不是通过Django的:

curl -o /path/sitemap.xml http://example.com/generate/sitemap.xml 
+1

我正在处理类似的事情。你有代码示例吗? – mlissner 2010-05-11 02:53:20

+1

mlissner - 详细说明dar的答案:1)将sitemap.xml的Django URL移动到/generate/sitemap.xml; 2)/path/to/sitemap.xml应该是您的媒体目录中的一个位置的完整系统路径(确保它可以由正在运行cron作业的用户写入); 3)设置一个从/generate/sitemap.xml URL中取出的cron作业,并将输出写入媒体目录中的该位置。 – shacker 2011-10-10 21:58:57

+0

我一直在继续完善这个方法。还有一些提到的东西。 1),Django站点地图生成器使用的date_field必须是数据库索引,因为它用于对站点地图进行排序。没有意识到,很长一段时间,令人惊讶的是没有人在这里提到它。 2)时,我会永久性地将所有站点地图缓存到磁盘(磁盘上有1,000条链接),然后在项目更改时使用Django信号来使缓存无效。 – mlissner 2012-02-16 06:00:17

8

好了 - 我发现一些更多的信息就这个问题和哪些亚马逊正在做与他们的600万左右的URLS。

亚马逊简单地做一个地图的每一天,并添加到它:

  1. 新网址
  2. 更新网址

因此,这意味着他们最终使用站点地图的负荷 - 但搜索机器人只会看最新的 - 因为更新的日期是最近的。我的理解是,应该刷新一张地图 - 而不是多次包含一个网址。我认为这是真的。但是,亚马逊解决了这个问题,因为网站地图更像是日志。一个网址可能会出现在后面的网站地图中 - 因为它可能会更新 - 但Google不会查看较旧的地图,因为它们已过时 - 除非它做了重大索引。这种方法很有意义,因为您只需构建一张新地图 - 比如每天更新和更新内容并在谷歌中查找 - 因此谷歌只需索引这些新的地址。

此日志方法是代码的同步 - 因为您需要的只是一个静态数据存储模型,该模型存储每个映射的XML数据。您的cron作业可以每天或每周创建一张地图,然后将原始XML页面存储在blob字段中,或者存储在您自己的地方。然后您可以直接从处理程序以及索引图提供页面。

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

我也认为有可能将一周的地图缩短为星期地图,将4周的地图缩短为一个月 - 这样您最终可以获得月度地图,当前每周的地图月,然后是过去7天的地图。假设日期都被维持,这将减少贴图数量收拾过程 - 即时通讯思想在减少365个地图一年的每一天下来到12

这里的条件是在站点地图和一个pdf亚马逊和CNN使用的方法。

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

+0

这很有趣。感谢分享文件。 – Tony 2013-05-12 10:40:15

3

我使用django-staticgenerator应用程序缓存的sitemap.xml当数据更新到文件系统并更新文件。

settings.py:

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

models.py:

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文件。我觉得这很酷! :)

0

对于那些谁(无论何种原因)宁愿保持其动态生成的站点地图(例如新鲜,懒惰)。尝试django-sitemaps。这是标准站点地图的流媒体版本。直接替换。响应时间更快,并且使用更少的内存。

相关问题