Как эффективно обслуживать массовые файлы Sitemap в django

У меня есть сайт, содержащий около 150 тыс. страниц в его файле Sitemap. Я использую генератор индекса sitemap для создания файлов Sitemap, но на самом деле мне нужен способ его кеширования, потому что построение 150 файлов Sitemap из 1000 ссылок на каждом сервере является жестоким на моем сервере. [1]

Я могу кэшировать каждую из этих страниц sitemap с memcached, что я и использую в другом месте на сайте... однако, это так много файлов Sitemap, что он полностью заполнил memcached.... так что это не работа.

Мне кажется, что мне нужно использовать базу данных в качестве кеша для них и генерировать их только тогда, когда есть изменения в них (что в результате индекса sitemap означает только изменение последней пары страниц Sitemap, так как остальные всегда одни и те же.) [2] Но, насколько я могу судить, я могу использовать только один кеш-сервер с django.

Как я могу использовать эти файлы Sitemap для Google, когда Google приходит, чтобы не убивать мою базу данных или memcached?

Любые мысли?

[1] Я ограничил его до 1000 ссылок на страницу сайта, потому что генерации max, 50 000 ссылок просто не было.

[2], например, если у меня есть sitemap.xml? page = 1, page = 2... sitemap.xml? page = 50, мне действительно нужно изменить sitemap.xml? page = 50, пока это не будет полный с 1000 ссылками, тогда я могу это сделать навсегда, и сосредоточиться на странице 51 до тех пор, пока он не будет полностью, кешировать его навсегда и т.д.

EDIT, 2012-05-12: Это продолжает оставаться проблемой, и я, наконец, удалил каркас Sitemap Django после использования его с кешем файлов в течение примерно года. Вместо этого я теперь использую Solr для генерации ссылок, которые мне нужны в действительно простом представлении, и затем я передаю их в шаблон Django. Этот значительно упростил мои файлы Sitemap, заставил их работать отлично, и на данный момент у меня до 2 250 000 ссылок. Если вы хотите это сделать, просто ознакомьтесь с шаблоном карты сайта - все это действительно очевидно. Вы можете увидеть код для этого здесь: https://bitbucket.org/mlissner/search-and-awareness-platform-courtlistener/src/tip/alert/casepage/sitemap.py

Ответы

Ответ 1

У меня была аналогичная проблема, и я решил использовать django для записи файлов sitemap на диск в статическом носителе и обслуживании веб-сервера. Я сделал звонок, чтобы обновить карту сайта каждые пару часов, так как мой контент не менялся чаще, чем это. Но это будет зависеть от вашего контента, как часто вам нужно писать файлы.

Я использовал специальную команду django с заданием cron, но проще работать с cron-заданием.

Вот как я использую curl, и у меня есть apache send/sitemap.xml как статический файл, а не через django:

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

Ответ 2

Хорошо. Я нашел дополнительную информацию об этом и о том, что делают амазонки со своими 6 миллионами URL-адресов.

Amazon просто делает карту для каждого дня и добавляет к ней:

  • новые URL
  • обновленные URL-адреса

Итак, это означает, что в итоге они загружаются с множеством карт сайта, но поисковый бот будет смотреть только на последние, поскольку обновленные даты являются последними. Я был в понимании того, что нужно обновить карту - и не включать URL-адрес более одного раза. Я думаю, что это правда. Но, Amazon обойти это, так как карты сайта больше содержат журнал. Возможно, URL-адрес может появиться на более поздней карте сайта, поскольку он, возможно, обновлен, но Google не будет смотреть на старые карты, поскольку они устарели, если, конечно, он не имеет большого переиндекса. Этот подход имеет большой смысл, поскольку все, что вы делаете, это просто создать новую карту - скажем, каждый день нового и обновленного контента и пинговать его в google, поэтому Google нужно только индексировать эти новые URL-адреса.

Этот лог-подход является синхронизацией с кодом - поскольку все, что вам нужно, это статическая модель хранилища данных, в которой хранятся XML-данные для каждой карты. ваше задание cron может строить карту - ежедневно или еженедельно, а затем хранить необработанную XML-страницу в поле blob или что у вас есть. вы можете затем обслуживать страницы прямо из обработчика, а также с помощью карты индексов.

Я не уверен, что думают другие, но это похоже на очень работоспособный подход и загрузку с одного сервера - по сравнению с перестройкой огромной карты только потому, что некоторые страницы могут быть изменены.

Я также подумал, что может быть возможно хруст карты недель в карты недели и 4 недели карт в месяц - так что вы получите ежемесячные карты, карту на каждую неделю в текущем месяце а затем карту за последние 7 дней. Предполагая, что все даты сохранены, это уменьшит количество карт, убирающих процесс, - думая о сокращении 365 карт за каждый день года до 12.

Вот pdf на картах сайта и подходах, используемых амазоном и CNN.

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

Ответ 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 файл. Это круто, я думаю!:)

Ответ 4

Для тех, кто (по какой-либо причине) предпочел бы сохранять динамические данные своих карт (например, свежесть, ленивость). Попробуйте django-sitemaps. Это потоковая версия стандартных файлов Sitemap. Замена. Гораздо быстрее время отклика и использует waaaaay меньше памяти.