Django New Relic uWSGI

  • Устанавливаем New Relic
    pip install newrelic
  • Лицензионный ключ берем из личного кабинета, генерируем конфигурацию
    newrelic-admin generate-config LICENSE-KEY newrelic.ini
  • В конфигурации правим название приложения
    # The appplication name. Set this to be the name of your
    # application as you would like it to show up in New Relic UI.
    # The UI will then auto-map instances of your application into a
    # entry on your home dashboard page.
    app_name = app.name
  • Модифицируем project/wsgi.py
    import os
    import newrelic.agent
    newrelic.agent.initialize('/path/to/newrelic.ini')
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    application = newrelic.agent.wsgi_application()(application)
  • Правим конфигурацию uwsgi.ini
    #module = django.core.handlers.wsgi:WSGIHandler()
    module = project.wsgi
    eval = import newrelic.agent, wsgi; application = newrelic.agent.wsgi_application()(wsgi.application)

ascii codec can't encode characters in position "" Django Supervisor

В конфиг supervisor добавляем

environment=LANG="ru_RU.utf8", LC_ALL="ru_RU.UTF-8", LC_LANG="ru_RU.UTF-8"

При обновлении MySQL миниатюры изображений, отрисованные с помощью Pillow и easy_thumbnails для Django, могут перестать работать, рецепт такой же, добавить локаль в конфиг supervisor и перезапустить его.

Django Ajax

Нашел чудесную библиотеку django-ajax, берет на себя всю рутину, связанную с ajax во вьюшках Django.
Вьюшка теперь может выглядеть так:

from django_ajax.decorators import ajax
from models import Product
from cart.cart import Cart
@ajax
def ajax_add_to_cart(request):
    if 'product_id' in request.GET and request.GET['product_id']:
        product_id = request.GET['product_id']
        product = Product.objects.get(id=product_id)
        cart = Cart(request)
        cart.add(product, product.price, quantity=1)
        items_in_cart = cart.itemCount()
        return {'items_in_cart': items_in_cart}

Ответом будет JSON такого вида

{"status": 200, "statusText": "OK", "content": {"items_in_cart": 5}}

Шаблон может выглядеть так:

<a class="in-cart" href="{% url 'add_to_cart' item.id 1 %}">в корзину</a>
<script type="text/javascript">
    $(function() {
                var lnk = $("a.in-cart");
                $(lnk).click(function() {
                    $.get($(lnk).attr('href')).done(function( json ) {
                        $("#items_in_cart").text(json.content.items_in_cart)
                    });
                    return false
                });
            });
</script>

logrotate зависает в STAT D

По неизвестной причине logrotate перестал удалять старые архивы журналов, в результате образовалась директория размером в 160M и logrotate просто зависал в STAT D (ожидание системы ввода/вывода), отъедая весь процессор и большую часть оперативной памяти.
Удалил директорию через rm -r, удалялось часа 4.
logrotate продолжал виснуть, но теперь уже в STAT R, спотыкаясь на ротации btmp. Помогла очистка/var/lib/logrotate/status

rm /var/lib/logrotate/status && touch /var/lib/logrotate/status

Причина такого поведения, к сожалению, так и неизвестна, конфиги в /etc/logrotate.d/ верные.

Автостарт pptp туннеля Debian

В

/etc/init.d/

добавляем скрипт

#! /bin/sh
### BEGIN INIT INFO
# Provides:          pptp tunnel
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      1 0 6
# Short-Description: start pptp session
### END INIT INFO
case "$1" in
    start)
        pon <peer_name> &
        echo "PPTP Started"
        ;;
    stop)
        poff <peer_name_
        ip ro del <some_route_del>
        ip ro del <some_route_del>
        echo "PPTP Stopped"
        ;;
    *)
        echo "Usage: /etc/init.d/pptp-<peer_name> {start|stop}"
        exit 1
        ;;
esac
exit 0
insserv -v /etc/init.d/pptp-<peer_name>

Пример использования функции 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])

Репозиторий 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

Как изменить размер логического тома LVM

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

    1. Имеем: логический том, смонтированный на / размером 11G, хотим уменьшить размер на 5G, а оставшееся место смонтировать на /home
    2. Загружаемся с установочного диска в Rescue mode на финальном этапе загрузки отказываемся от chroot в нашу систему, выбираем опцию Skip
    3. Убедимся что система видит наш логический том
      vgdisplay
    4. Активируем lvm том
      vgchange -ay

Читать далее Как изменить размер логического тома LVM

umask Debian Squeeze

Необходимо сделать, чтобы все новые папки создавались с правами 750, а файлы — 640. Для этого будем

 vim /etc/profile

Добавляем

umask 027


Далее

 vim /etc/pam.d/sshd 

Добавляем

session optional pam_umask.so umask=0027


Читать далее umask Debian Squeeze