2010-05-11 42 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。這是標準站點地圖的流媒體版本。直接替換。響應時間更快,並且使用更少的內存。

相關問題