2010-05-11 39 views
15

Tôi có một trang web có khoảng 150 nghìn trang trong sơ đồ trang web của nó. Tôi đang sử dụng trình tạo chỉ mục sơ đồ trang web để tạo các sơ đồ trang web, nhưng thực sự, tôi cần một cách để lưu vào bộ nhớ cache, vì việc xây dựng 150 sơ đồ trang web gồm 1.000 liên kết mỗi là tàn bạo trên máy chủ của tôi. [1]Cách phân phối hiệu quả các sơ đồ trang web lớn trong django

Tôi COULD cache mỗi trang sơ đồ trang web này với memcached, đó là những gì tôi đang sử dụng ở nơi khác trên trang web ... tuy nhiên, đây là rất nhiều sơ đồ trang web mà nó sẽ hoàn toàn điền memcached .... do đó doesn ' t làm việc.

Điều tôi nghĩ tôi cần là cách sử dụng cơ sở dữ liệu làm bộ nhớ cache cho những thứ này và chỉ tạo chúng khi có thay đổi đối với chúng (do kết quả của chỉ mục sơ đồ trang web chỉ thay đổi cặp sơ đồ trang web mới nhất các trang, vì phần còn lại luôn giống nhau.) [2] Nhưng, gần như tôi có thể nói, tôi chỉ có thể sử dụng một bộ đệm phụ trợ với django.

Làm cách nào để tôi có các sơ đồ trang web này sẵn sàng khi Google truy cập 'mà không làm hỏng cơ sở dữ liệu của tôi hoặc được ghi nhớ?

Mọi suy nghĩ?

[1] Tôi đã giới hạn 1.000 liên kết cho mỗi trang sơ đồ trang web vì tạo tối đa 50.000 liên kết, chỉ không xảy ra. Ví dụ:

[2], nếu tôi có sitemap.xml? Page = 1, page = 2 ... sitemap.xml? Page = 50, tôi chỉ thực sự cần thay đổi sitemap.xml? Page = 50 cho đến khi nó có đầy đủ 1.000 liên kết, sau đó tôi có thể sử dụng nó vĩnh viễn và tập trung vào trang 51 cho đến khi nó đầy, lưu vào bộ nhớ cache mãi mãi, v.v.

EDIT, 2012-05-12: Điều này vẫn tiếp tục là vấn đề và cuối cùng tôi đã bỏ khuôn khổ sơ đồ trang web của Django sau khi sử dụng nó với bộ nhớ cache trong khoảng một năm. Thay vào đó, bây giờ tôi đang sử dụng Solr để tạo ra các liên kết tôi cần trong một cái nhìn thực sự đơn giản, và sau đó tôi chuyển chúng sang mẫu Django. Điều này rất nhiều đã đơn giản hóa sơ đồ trang web của tôi, làm cho chúng hoạt động tốt và tôi hiện có khoảng 2.250.000 liên kết. Nếu bạn muốn làm điều đó, chỉ cần kiểm tra các mẫu sơ đồ trang web - đó là tất cả thực sự rõ ràng từ đó. Bạn có thể xem mã cho điều này tại đây: https://bitbucket.org/mlissner/search-and-awareness-platform-courtlistener/src/tip/alert/casepage/sitemap.py

+0

Không, chúng dành cho rô bốt. Xin vui lòng bỏ qua chúng. Chi tiết: sitemaps.org – mlissner

Trả lời

9

Tôi đã gặp sự cố tương tự và quyết định sử dụng django để ghi tệp sơ đồ trang web vào đĩa trong phương tiện tĩnh và yêu cầu máy chủ web phân phối chúng. Tôi đã thực hiện cuộc gọi để tạo lại sơ đồ trang web mỗi vài giờ vì nội dung của tôi không thay đổi thường xuyên hơn thế. Nhưng nó sẽ phụ thuộc vào nội dung của bạn bao lâu bạn cần phải viết các tập tin.

Tôi đã sử dụng lệnh tùy chỉnh django với công việc cron, nhưng việc cuộn tròn với công việc định kỳ dễ dàng hơn.

Đây là cách tôi sử dụng curl, và tôi đã apache gửi /sitemap.xml như một tập tin tĩnh, không thông qua django:

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

Tôi hiện đang làm việc trên một cái gì đó tương tự. Bạn có một ví dụ mã? – mlissner

+1

mlissner - Để xây dựng câu trả lời của dar: 1) Di chuyển URL Django cho sitemap.xml sang /generate/sitemap.xml; 2) /path/to/sitemap.xml phải là đường dẫn hệ thống đầy đủ đến một vị trí trong thư mục phương tiện của bạn (đảm bảo rằng nó có thể ghi được bởi người dùng sẽ chạy công việc cron); 3) Thiết lập một công việc cron kéo từ URL /generate/sitemap.xml và ghi đầu ra đến vị trí đó trong thư mục phương tiện của bạn. – shacker

+0

Tôi đã tiếp tục tinh chỉnh phương pháp này. Vài điều bổ sung cần đề cập đến. 1), date_field được sử dụng với trình tạo sơ đồ trang web của Django PHẢI là một chỉ mục cơ sở dữ liệu, vì nó được sử dụng để sắp xếp các sơ đồ trang web. Đã không nhận ra rằng trong một thời gian dài, và đáng ngạc nhiên không ai đề cập đến nó ở đây. 2), tôi vĩnh viễn cache tất cả các sơ đồ trang web vào đĩa khi chúng đầy (1.000 liên kết trên mũi), và sau đó sử dụng tín hiệu Django để làm mất hiệu lực bộ nhớ cache nếu một mục thay đổi. – mlissner

8

Được rồi - Tôi đã tìm thấy một số thông tin thêm về điều này và những gì đang làm amazon với hơn 6 triệu URL.

Amazon chỉ cần thực hiện một bản đồ cho mỗi ngày và thêm vào đó:

  1. url mới
  2. cập nhật url

Vì vậy, điều này có nghĩa rằng họ kết thúc với vô số trang web bản đồ - nhưng bot tìm kiếm sẽ chỉ xem xét những cái mới nhất - vì ngày cập nhật gần đây.Tôi đã hiểu rằng một người nên làm mới bản đồ - và không bao gồm url nhiều hơn một lần. Tôi nghĩ điều này là đúng. Tuy nhiên, Amazon nhận được xung quanh điều này như các bản đồ trang web có nhiều hơn một bản ghi. Url có thể xuất hiện trong bản đồ trang web sau này - vì nó có thể được cập nhật - nhưng Google sẽ không xem xét các bản đồ cũ hơn vì chúng đã lỗi thời - trừ khi tất nhiên nó có một chỉ mục chính. Cách tiếp cận này rất có ý nghĩa vì tất cả những gì bạn làm chỉ đơn giản là xây dựng một bản đồ mới - nói mỗi ngày nội dung mới và cập nhật và ping nó tại google - do đó google chỉ cần lập chỉ mục các url mới này.

Cách tiếp cận nhật ký này là đồng bộ hóa với mã - vì tất cả những gì bạn cần là một mô hình lưu trữ dữ liệu tĩnh lưu trữ dữ liệu XML cho mỗi bản đồ. công việc cron của bạn có thể xây dựng một bản đồ - hàng ngày hoặc hàng tuần và sau đó lưu trữ trang XML thô trong một lĩnh vực blob hoặc những gì có bạn. sau đó bạn có thể phục vụ các trang trực tiếp từ một trình xử lý và cũng là bản đồ chỉ mục.

Tôi không chắc những gì người khác nghĩ nhưng điều này nghe như một cách tiếp cận rất khả thi và tải một máy chủ - so với xây dựng lại bản đồ khổng lồ chỉ vì một vài trang có thể đã thay đổi.

Tôi cũng có thể xem xét bản đồ tuần một tuần thành bản đồ tuần và 4 tuần bản đồ thành một tháng - vì vậy bạn kết thúc với bản đồ hàng tháng, bản đồ cho từng tuần trong hiện tại tháng và sau đó là một bản đồ trong 7 ngày qua. Giả sử rằng tất cả các ngày được duy trì điều này sẽ làm giảm số lượng bản đồ dọn dẹp quy trình - suy nghĩ về việc giảm 365 bản đồ cho mỗi ngày trong năm xuống còn 12.

Đây là một bản đồ trên trang web và phương pháp tiếp cận được sử dụng bởi amazon và CNN.

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

+0

Thật thú vị. Cảm ơn bạn đã chia sẻ tài liệu. – Tony

3

Tôi đang sử dụng django-staticgenerator ứng dụng cho bộ nhớ đệm sitemap.xml để hệ thống tập tin và cập nhật tập tin đó khi dữ liệu được cập nhật.

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() 

Trong cấu hình nginx tôi chuyển hướng sitemap.xml vào thư mục bộ nhớ cache và django dụ cho dự phòng:

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; 
    }  
} 

Với phương thức này, sitemap.xml sẽ luôn được cập nhật và các máy khách (như google) nhận được file xml luôn tĩnh. Đó là mát mẻ tôi nghĩ! :)

0

Đối với những người (vì bất kỳ lý do gì) muốn giữ sơ đồ trang web của họ được tạo động (ví dụ như độ tươi, lười biếng). Hãy thử django-sitemaps. Đây là phiên bản phát trực tuyến của sơ đồ trang web chuẩn. Thay thế thả. Thời gian đáp ứng nhanh hơn nhiều và sử dụng ít bộ nhớ hơn.

Các vấn đề liên quan