Как эффективно обслуживать массивные карты сайта в Django - PullRequest
16 голосов
/ 11 мая 2010

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

Я МОГУ КЭШИТЬ каждую из этих страниц карты сайта с помощью memcached, что я и использую в других местах сайта ... однако, это так много файлов сайта, что он полностью заполняет memcached .... так что это не работа.

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

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

Есть мысли?

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

[2] Например, если у меня есть sitemap.xml? Page = 1, page = 2 ... sitemap.xml? Page = 50, мне действительно нужно только изменить sitemap.xml? Page = 50, пока он не станет заполненный 1000 ссылками, тогда я могу делать это почти вечно и сосредоточиться на странице 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

Ответы [ 4 ]

9 голосов
/ 13 мая 2010

Хорошо - я нашел больше информации об этом и о том, что Amazon делает с их 6 миллионами или около того URL.

Амазонка просто делает карту на каждый день и добавляет к ней:

  1. новые URL
  2. обновленные URL-адреса

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

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

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

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

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

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

9 голосов
/ 11 мая 2010

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

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

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

curl -o /path/sitemap.xml http://example.com/generate/sitemap.xml
3 голосов
/ 25 апреля 2012

Я использую 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 голосов
/ 07 февраля 2013

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

...