- Устанавливаем 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)
Рубрика: Tips & Tricks
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>
Rsync via ssh
Настраиваем ssh по ключу
Добавляем в крон
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
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, хотя все действия будут справедливы для любого дистрибутива.
Сделайте резервную копию всех данных на подопытном томе!
-
- Имеем: логический том, смонтированный на / размером 11G, хотим уменьшить размер на 5G, а оставшееся место смонтировать на /home
- Загружаемся с установочного диска в Rescue mode на финальном этапе загрузки отказываемся от chroot в нашу систему, выбираем опцию Skip
- Убедимся что система видит наш логический том
vgdisplay
- Активируем lvm том
vgchange -ay
- Имеем: логический том, смонтированный на / размером 11G, хотим уменьшить размер на 5G, а оставшееся место смонтировать на /home
umask Debian Squeeze
Необходимо сделать, чтобы все новые папки создавались с правами 750, а файлы — 640. Для этого будем
vim /etc/profile
Добавляем
umask 027
vim /etc/pam.d/sshd
Добавляем
session optional pam_umask.so umask=0027