Memcached/Johnny Cache Django 1.5 Debian

Ничего нового, просто чтобы не гуглить в очередной раз.

aptitude install memcached
pip install python-memcached
pip install johnny-cache

Конфиг memcached находится в /etc/memcached.conf, оставляю все значения по умолчанию.
В settings.py

INSTALLED_APPS = (
    # ...
    'johnny',
)
MIDDLEWARE_CLASSES = (
    'johnny.middleware.LocalStoreClearMiddleware',
    'johnny.middleware.QueryCacheMiddleware',
    # ...
)
CACHES = {
    'default' : dict(
        BACKEND = 'johnny.backends.memcached.MemcachedCache',
        LOCATION = ['127.0.0.1:11211'],
        JOHNNY_CACHE = True,
    )
}
JOHNNY_MIDDLEWARE_KEY_PREFIX='jc_myproj'

— префикс текущего проекта
Если у вас Django 1.5 и при пустых queryset вываливается ошибка

AttributeError: 'module' object has no attribute 'iter'

ставьте с гитхаба

git clone http://github.com/jmoiron/johnny-cache.git
cd johnny-cache && ./setup.py


Django + Sphinx + Debian

Ставим отсюда

https://github.com/FactorAG/django-sphinx

В settings.py

INSTALLED_APS= (
...
'djangosphinx',
...
)
# Sphinx 2.0.4/2.0.6/2.0.8
SPHINX_API_VERSION = 0x119

models.py

from djangosphinx.models import SphinxSearch
class Product(models.Model):
    brand = models.ForeignKey(Brand, verbose_name=u'Бренд')
    title = models.CharField(_(u'Марка'), max_length=50, blank=True)
    caption = models.CharField(_(u'Серия'), max_length=150, blank=True)
    composition = models.CharField(_(u'Ингредиенты'), max_length=60, blank=True, null=True)
    about = RichTextField(_(u'Описание'), blank=True)
    pub_date = models.DateTimeField(default=datetime.now)
    pet = models.ManyToManyField(Pet, verbose_name=u'Животное')
    updated = models.DateTimeField(auto_now=True)
    search = SphinxSearch(weights={'title': 90, 'caption': 80, 'about': 100, 'composition': 70},
                          mode='SPH_MATCH_ALL', rankmode="SPH_RANK_BM25", sort='SPH_SORT_RELEVANCE',
                          )

views.py

@render_to('core/entry_list.html')
def searcher(request):
    if 'srch' in request.GET and request.GET['srch']:
        txt = request.GET['srch']
        entries = Product.search.query(txt)
        return {'object_list': entries, }
    else:
        return root(request)

django-sphinx умеет создавать конфигурацию для Sphinx

./manage.py generate_sphinx_config <app_name> > config/sphinx.conf

Получившийся файл конфигурации нужно немного дополнить

source core_product
{
    type                = mysql
    sql_host            =
    sql_user            = <DB_user>
    sql_pass            = ******
    sql_db              = <DB>
    sql_port            =
    sql_query_pre       = SET NAMES utf8
    sql_query_post      =
    sql_query           = \
        SELECT id, onmain, brand_id, title, caption, gen_caption, composition, about, ext, pub_date, updated\
        FROM core_product
    sql_query_info      = SELECT * FROM `core_product` WHERE `id` = $id
    # ForeignKey's
    sql_attr_uint       = brand_id
    # DateField's and DateTimeField's
    sql_attr_timestamp   = pub_date
    sql_attr_timestamp   = updated
}
index core_product
{
    source          = core_product
    path            = /home/project/var/sphinx
    docinfo         = extern
    morphology      = stem_enru, Soundex, Metaphone
    charset_type    = utf-8
    min_word_len    = 2
    min_infix_len   = 2
    min_prefix_len  = 0
    enable_star     = 1
    charset_table = 0..9, A..Z->a..z, _, a..z, U+0401->U+0435, U+0451->U+0435, U+410..U+42F->U+430..U+44F, U+430..U+44F
    index_exact_words = 1
    expand_keywords   = 1
    index_sp=1
    html_index_attrs = img=alt,title; a=title;
    html_strip=1
}
indexer {
    mem_limit = 64M
}
searchd {
    listen = 9312
    listen = 9306:mysql41
    log = /home/project/logs/searchd.log
    query_log = /project/logs/query.log
    read_timeout = 5
    client_timeout = 300
    max_children = 30
    pid_file = /home/project/tmp/searchd.pid
    max_matches = 1000
    seamless_rotate = 1
    preopen_indexes = 1
    unlink_old = 1
    mva_updates_pool = 1M
    max_packet_size = 8M
    max_filters = 256
    max_filter_values = 4096
    max_batch_queries = 32
    workers = threads
}

Стваим Sphinx

  • Качаем исходники (есть готовые пакеты) отсюда
    http://sphinxsearch.com/downloads/release/
  • Распаковываем и конфигурируем
    tar xzvf sphinx-2.0.8-release.tar.gz
    sphinx-2.0.8-release
    ./configure --with-mysql
    make
  • Осталось собрать пакет и установить его в ситему (никогда не делайте make install, каждый раз, когда вы так делаете, умирает котенок)
    aptitude install checkinstall
    checkinstall

    теперь вы можете управлять пакетом с помощью пакетного менеджера.

Sphinx установлен, осталось проиндексировать БД и запустить демона.

indexer --config config/sphinx.conf --all

Для дальнейшей индексации можно использовать

indexer --config config/sphinx.conf --all --rotate

Для запуска

searchd -c config/sphinx.conf

Для остановки

searchd --stop -c config/sphinx.conf

Для повышения качества поиска можно использовать словарь словоформ

aptitude install myspell-ru
spelldump /usr/share/hunspell/ru_RU.dic /usr/share/hunspell/ru_RU.aff wordforms_ru_RU.txt
cat wordforms_ru_RU.txt | enca -L ru
iconv -f KOI8-R -t UTF-8 -o wordforms_ru_RU_UTF8.txt wordforms_ru_RU.txt

Затем подключаем его в sphinx.conf в раздел index

wordforms = /path/to/wordforms_ru_RU_UTF8.txt

Источники
http://sphinxsearch.com/docs/manual-2.0.8.html#supported-system

http://osmanov-dev-notes.blogspot.ru/2011/06/how-to-create-sphinx-wordform.html

http://proft.me/2011/01/22/polnotekstovyj-poisk-v-django/

http://habrahabr.ru/post/136261/

http://habrahabr.ru/post/147745/

http://habrahabr.ru/post/132118/

Пример использования функции reverse() при построении sitemap.xml для Django

Иногда, при построении карты сайта удобно пользоваться reverse() из django.core.urlresolvers

from django.contrib.sitemaps import Sitemap
from django.core.urlresolvers import reverse
from views import root, product_detail, products_list
class RootSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.9
    def items(self):
        return [root]
    def location(self, obj):
        return reverse(obj)
class ProductDetailSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.9
    def items(self):
        return Products.objects.all()
    def location(self, obj):
        return reverse(products_list, kwargs={'product_id': obj.pk})
class ProductsListSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.5
    def items(self):
        return Pets.objects.order_by('url_id')
    def location(self, obj):
        return reverse('products_list', args=[obj.url_id])

Установка Django в виртуальное окружение на сервере с CentOS

Подключаем репозиторий EPEL(i686)

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm

Для архитектуры x86_64

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Устанавливаем python-pip

yum install -y python-pip

Обновляем pip

pip-python install --upgrade pip
Downloading/unpacking pip
  Downloading pip-1.3.1.tar.gz (247Kb): 247Kb downloaded
  Running setup.py egg_info for package pip
    warning: no files found matching '*.html' under directory 'docs'
    warning: no previously-included files matching '*.txt' found under directory 'docs/_build'
    no previously-included directories found matching 'docs/_build/_sources'
Installing collected packages: pip
  Found existing installation: pip 0.8
    Uninstalling pip:
      Successfully uninstalled pip
  Running setup.py install for pip
    warning: no files found matching '*.html' under directory 'docs'
    warning: no previously-included files matching '*.txt' found under directory 'docs/_build'
    no previously-included directories found matching 'docs/_build/_sources'
    Installing pip script to /usr/bin
    Installing pip-2.6 script to /usr/bin
Successfully installed pip
Cleaning up...

Читать далее Установка Django в виртуальное окружение на сервере с CentOS

Соединение point-to-point в Debian и CentOS

Пример /etc/network/interfaces в Debian

iface eth0 inet static
        address <IP_ADDR>
        netmask 255.255.255.255
        gateway <GW_IP_ADDR>
        pointopoint <GW_IP_ADDR>

Можно через ifconfig

ifconfig eth0 inet <local_ip> netmask 255.255.255.255 pointopoint <destination_ip>
ip route add default via <destination_ip>

В CentOS чуть сложнее

  1. /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    HWADDR=<MAC address>
    ONBOOT=yes
    BOOTPROTO=static
    SCOPE="peer "
    IPADDR=<IP_ADDR>
    NETMASK=255.255.255.255
  2. /etc/sysconfig/network-scripts/route-eth0
    ADDRESS0=0.0.0.0
    NETMASK0=0.0.0.0
    GATEWAY0=<GW_IP_ADDR>

Команды LVM

Команды LVM

  1. Инициализация
    vgscan
  2. Посмотреть состояние физического тома в LVM
    pvdisplay /dev/sda1
  3. Ативация всех найденных томов
    vgchange -ay
  4. Деактивация группы томов
    vgchange -a n 
  5. Просмотреть состояние группы томов.
    vgdisplay 
  6. Читать далее Команды LVM

openVPN сервер под управлением CentOS

Будем устанавливать и настроивать openvpn сервер на CentOS
Сначала необходимо проверить наличе tun устройства, так как на VPS его может не быть

ls /dev/net/

вывод должен быть такой

[root@vpn 2.0]# ls /dev/net/
tun

Если вы не обнаружили файл устройства tun, обратитесь к своему провайдеру.
В стандартных репозитория CentOS и RHEL пакета openvpn нет. Поэтому сначала подключите репозитрий rpmforge

    1. Устанавливаем openvpn
      yum install openvpn -y

      openvpn CentOS

Читать далее openVPN сервер под управлением CentOS

Репозиторий rpmforge CentOS

В стандартных репозиториях CentOS и RHEL нет многих полезных пакетов, например htop или openvpn, я использую дополнительный репозиторий rpmforge для CentOS. Для подключения rpmforge, необходимо выполнить следующие действия.

yum install wget -y

Для RHEL 5 и CentOS 5 32-bit

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
rpm -ihv rpmforge-release*.rf.i386.rpm

Для RHEL 6 и CentOS 6 32-bit

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
rpm -ihv rpmforge-release*.rf.i686.rpm

Для RHEL 5 и CentOS 5 64-bit

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
rpm -ihv rpmforge-release*.rf.x86_64.rpm

Для RHEL 6 и CentOS 6 64-bit

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
rpm -ihv rpmforge-release*.rf.x86_64.rpm
yum install htop -y