-
Устанавливаем New Relic
1pip install newrelic -
Лицензионный ключ берем из личного кабинета, генерируем конфигурацию
1newrelic-admin generate-config LICENSE-KEY newrelic.ini -
В конфигурации правим название приложения
12345# 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
1234567import osimport newrelic.agentnewrelic.agent.initialize('/path/to/newrelic.ini')os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")from django.core.wsgi import get_wsgi_applicationapplication = get_wsgi_application()application = newrelic.agent.wsgi_application()(application)
-
Правим конфигурацию uwsgi.ini
123#module = django.core.handlers.wsgi:WSGIHandler()module = project.wsgieval = import newrelic.agent, wsgi; application = newrelic.agent.wsgi_application()(wsgi.application)
Рубрика: Tips & Tricks
ascii codec can’t encode characters in position «» Django Supervisor
В конфиг supervisor добавляем
1 |
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.
Вьюшка теперь может выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 такого вида
1 |
{"status": 200, "statusText": "OK", "content": {"items_in_cart": 5}} |
Шаблон может выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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> |
Rsync via ssh
Добавляем в крон
1 |
rsync --delete -crpz -e "ssh -i /path/to/private_key -p <ssh_port>" user@example.com:/path/to/dir/ /path/to/dir |
logrotate зависает в STAT D
По неизвестной причине logrotate перестал удалять старые архивы журналов, в результате образовалась директория размером в 160M и logrotate просто зависал в STAT D (ожидание системы ввода/вывода), отъедая весь процессор и большую часть оперативной памяти.
Удалил директорию через rm -r, удалялось часа 4.
logrotate продолжал виснуть, но теперь уже в STAT R, спотыкаясь на ротации btmp. Помогла очистка/var/lib/logrotate/status
1 |
rm /var/lib/logrotate/status && touch /var/lib/logrotate/status |
Причина такого поведения, к сожалению, так и неизвестна, конфиги в /etc/logrotate.d/ верные.
Автостарт pptp туннеля Debian
В
1 |
/etc/init.d/ |
добавляем скрипт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#! /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 |
1 |
insserv -v /etc/init.d/pptp-<peer_name> |
Пример использования функции reverse() при построении sitemap.xml для Django
Иногда, при построении карты сайта удобно пользоваться reverse() из django.core.urlresolvers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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, необходимо выполнить следующие действия.
1 |
yum install wget -y |
Для RHEL 5 и CentOS 5 32-bit
1 2 |
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
1 2 |
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
1 2 |
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
1 2 |
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 |
1 |
yum install htop -y |
Как изменить размер логического тома LVM
В моем случае используется операционная система CentOS, хотя все действия будут справедливы для любого дистрибутива.
Сделайте резервную копию всех данных на подопытном томе!
- Имеем: логический том, смонтированный на / размером 11G, хотим уменьшить размер на 5G, а оставшееся место смонтировать на /home
- Загружаемся с установочного диска в Rescue mode на финальном этапе загрузки отказываемся от chroot в нашу систему, выбираем опцию Skip
- Убедимся что система видит наш логический том
1vgdisplay - Активируем lvm том
1vgchange -ay
umask Debian Squeeze
Необходимо сделать, чтобы все новые папки создавались с правами 750, а файлы — 640. Для этого будем
1 |
vim /etc/profile |
Добавляем
1 |
umask 027 |
Далее
1 |
vim /etc/pam.d/sshd |
Добавляем
1 |
session optional pam_umask.so umask=0027 |