Записи в категории «заметки»

Web-разработка на Python. Ресурсы

Рускоязычное сообщество Python-разработчиков расширется с каждым годом. В прошедшем году немало успеха принес проект Ивана — Конференция «Exception». Достаточно много информации регулярно «подливают» авторы блогов о Python и веб-разработке. Хотелось бы еще обратить внимание на сообщества, где можно задать вопросы и найти себе партнеров для работы в сфере python и web. Итак ссылки:

  • Форумы по веб-разработке на python.com.ua — python.com.ua/forum .
  • Форум на softwaremaniac.org по Django .
  • Форумы на pydev.ru по веб — pydev.ru/forum.
  • Гугл-группа по Django — django-russian .
  • Гугл-группа по многим другим фреймворкам и библиотекам — webpython-ru .

 Еще ссылки на блоги и более специфичные сайты по разработке на Python можно найти на pydev.ru/links.

Настройка правильных access логов для веб-сервера nginx

Мы начинаем готовить решения на базе веб-сервера nginx на своих серверах. В связи с чем будут появляться некоторые заметки по его работе и настройке. Итак, первая будет про логирование.

А что не так с логами? Получилось так, что по-умолчанию nginx пишет логи немного по-своему. И программы для сбора статистики вроде webalizer или awstats ругаются на неправильный формат логов.

Было log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

Стало log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; #"$http_x_forwarded_for"

После поправки конфига все заработало отлично. Статистика благополучно собирается.

Exception #1 done!

Конференция по Python в Киеве Exception #1 прошла успешно!

Было приятно познакомиться с некоторыми нашими клиентами в реале :-)

Презентация к моему докладу в виде pdf

Фото можно посмотреть в моем альбоме. Пока офциальная версия фоток не выложена.

Для интересующихся пишу ссылки по материалам моего доклада.

Frameworks:

ORM про который много говорилось SQLAlchemy

Мои персональные контакты: dobrych [at] gmail.com отзываюсь как на email так и на чат (google talk).

Про конференцию еще написал Алексей в своем блоге. Обсуждение на deveopers.org.ua

Два треда на PythAgora-uaМатериалы с Exception #01 и Exception #01 прошёл.

Punbb + MySQL 4.1 лечим глюки

Недавно при переносе веб-сайта python.com.ua столкнулись с проблемой поддержки кодировок в php-форуме Punbb. Все давно знают что MySQL c ветки 4.1 поддерживает работу с текстовыми данными в разных кодировках, но почти всем php-шникам почему-то напряжно вставить три строчки кода лишние, чтоб небыло проблем с кодировкой.
Итак, в Punbb всё лечится установкой волшебной записи SET NAMES КОДИРОВКА. В Punbb это нужно сделать в дистрибутиве форума в файле
include/common.php
добавить нужно строчку с нужной кодировкой (в нашем случае это cp1251):
// set connection charset
$result = $db->query('SET NAMES CP1251;', __FILE__, __LINE__, $db->error());
Про кодировки в MySQL напишем отдельно и подробно позже.

поддержка кодировок в MySQL 4.1 на примере Punbb

Недавно при переносе веб-сайта python.com.ua столкнулись с проблемой поддержки кодировок в php-форуме Punbb. Все давно знают что MySQL c ветки 4.1 поддерживает работу с текстовыми данными в разных кодировках, но пости всем php-шникам почему-то напряжно вставить три строчки кода лишние, чтоб небыло проблем с кодировкой.
Данная заметка будет полезна не только при работе с utf-8, но вообще о конвертации текстовых SQL-данных.
Итак, как работать с кодировками:
  1. создать базу в нужной кодировке;
  2. если данные уже есть и просто переносятся на новую базу, то нужно узнать в какой кодировке данные в файле дампа (под unix в этом поможет утилита file и в файле дампа дописать строку SET NAMES КОДИРОВКА, где КОДИРОВКА, то в какой кодировке сохранен у вас файл дампа;
  3. потом в дистрибутиве форума нужно найти файл include/common.php и прописать там кодировку, в которой данные должны отображаться у вас на сайте, эта кодировка может быть отлична от той, в которой хранятся данные в базе;
  4. после этого нужно всё проверить, должно работать; не забывайте про сам html, который генерируется там должна быть кодировка соответствующая пункту 3.
Теперь немного конкретики на примере тогоже форума...
В нашем случае дамп базы был в кодировке win-1251. Определили мы просто:
file forum_dump.sql
База данных была в кодировке UTF-8, т.к. там уже стояла до этого mediawiki и она нативно поддерживает юникод. Мы решили хранить данные для форума тоже в юникоде, поэтому записали команду выбора кодировки в сам файл дампа самой первой:
SET NAMES CP1251;
Внимание! Пишется именно кодировка в которой сам дамп базы
    теги:

Новый движок для блога на Rails — Mephisto

Сегодня нашел в сети движок для блога, написанный на Ruby on Rails, под названием Mephisto. На досуге обещаю посмотреть и написать обзор. В принципе ничего пока особо нового в нем нет, интересно как он по производительности и ресурсам требователен. Есть возможность конвертации с Typo и Wordpress.

Синхронизация django-powered сайта на нескольких серверах (зеркало/mirror).

Кому будет интересно, предлагаю простой способ синхронизации сайтов на djnago на нескольких серверах (зеркало/mirror). Данный способ будет рабочим только для сайтов, где нет постоянного потока обновлений. В основном это сайты компаний, архивы с документацией и т.д. Нюанс в том, что обновление может быть на главном сервере (мастере) а на всех остальных просто рабочая копия. Т.е. это не репликация, а просто зеркало. Такой вариант может быть особо удобен для сайтов с документацией, блогов или фотогалерей (без коментирования или голосования). Суть в том, что django может работать с несколькими базами данных в том числе и с SQLite, которая хранит все в файле базы. Для синхронизации просто поднимаем rsync-сервер. Если код сайта обновляется и есть какой-то CVS, то можно разделить мух и котлеты. Код обновлять через CVS, а медиа-файлы и базу через rsync.

typo blog - как готовить

Недавно вышла свежая версия блога на базе ruby on rails - typo. В новой версии много вкусностей, но хочу отметить важную для хостера особенность - инсталляцию движка. Теперь у typo тесная связь с менеджером пакетов ruby gem. Было приятно просто набрать в командной строке:
gem install typo
И о чудо :-) все поставилось и заработало. Но это только часть приятного, второй сюрприз - это удобная инсталляция именно для самого юзера. Набираем в командной строке:
typo install /my/home/www
И получаем рабочую копию блого-движка typo в своей пользовательской директории. После чего можно перенастроить дефолтные настройки:
typo config /my/home/www
И запустить встроенный http-сервер командой:
typo start /my/home/www
Подробнее про новый релиз можно прочитать у scottstuff.net Про команды typo можно прочитать подробнее в другом посте того же scottstuff.net

Django для разработчиков, обновление до trunk

Сообщаю, что раз в сутки у нас происходит обновление ветки trunk для Django web framework. Данная опция была включена в связи с недавним слиянием ветки RemovingTheMagic с trunk и планированием новых релизов. Многим, кто пользуется этим framework, будет полезно работать уже с новой версией, т.к. там произошли большие изменения в модели и именовании классов/методов/переменных. Стабильная версия (0.91) работает по умолчанию, для включения версии trunk надо добавить в PythonPath на сервере строку /usr/local/www/soft/django-dev/django На эту тему есть записи на форуме Django от SoftwareMoniac.

Обновление Python до 2.5 снапшота

На девелоперском сервере обновился Python до версии 2.5.a0 (20060326) Django отрапортовал что работает :) Правда пришлось переустановить (но с setuptools очень быстро) . Для портов тоже пришлось маленький трюк сделать, а то все питоновые порты просили 2.4.2 ставить. Полечилось просто:
echo "PYTHON_VERSION=python2.5" >> /etc/make.conf

Ruby on Rails на хостинге

Мы начали поддержку Ruby on Rails на нашем хостинге. В скором будующем думаю ещё появяться пару тестовых сайтов с новомодными фичами, которые принято иногда называть Web2.0 :) На данный момент ещё оптимизируется работа ruby и python на сервере через mod_fastcgi + apache2. Если будет время написать о производительности постараюсь выложить результат сюда.

Настройка SASL И TLS в Postfix на хостинговом почтовом сервере

Прежде всего хочу отметить очень хороший сайт по настройке postifx. Подобрать себе нужное HOW-TO там можно без проблем. В моём случае пришлось пользоваться несколькими документами по настройке сабжа и немного погуглить. Цель была построить почтовый рилей + POP3/IMAP сервер для клиентов с повышеной безопасностью. А для почтового сервиса это практически означает криптование всего что только можно криптануть :). Не буду писать про настройку связки с базой и прочей приевшейся документации, а просто обращу Ваше внимание на несколько моментов. Также я не буду писать полное HOW-TO для ленивых :) Итак, что мы будем криптовать:
  • пароли в базе;
  • всю авторизацию клиентов (как SMTP так и POP3/IMAP);
  • обмен данными клиент-сервер и сервер-сервер;
Первым делом настроим сам postfix на предмет работы с SSL. Прежде всего он должен был скомпилирован с поддержкой SSL. Для каждой платформы проверять надо по разному. Потом надо сгенерировать ключ, как это сделать тоже много статей и описаний. По быстрому так:

# mkdir /postfix/configs_dir/ssl

# cd /postfix/configs_dir/ssl

# openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

Следующим шагом будет настройка postfix (добавляем в main.cf):

smtp_use_tls = yes smtpd_use_tls = yes smtp_tls_note_starttls_offer = yes smtpd_tls_key_file = /postfix/configs_dir/ssl/smtpd.pem smtpd_tls_cert_file = /postfix/configs_dir/ssl/smtpd.pem smtpd_tls_CAfile = /postfix/configs_dir/ssl/smtpd.pem smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom После этого получаем криптование при отправки и приёме почты на рилее. Потом ещё добавляем авторизацию через SASL для клиентов, чтоб могли с любого места пользоваться своим рилеем. Подразумевается что SASL тоже стоит в системе и postfix умеет с ним работать. Так как в нашем случае в качестве POP3/IMAP сервера выбран Courier-IMAP, то и авторизовать SMTP нам надо через него. Следовательно используем Courier-authlib, с которой умеет работать SASL. В postfix это выглядит так:

broken_sasl_auth_clients = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_auth_enable = yes В SASL, (lib/sasl2/smtpd.conf)

pwcheck_method: authdaemond log_level: 7 mech_list: PLAIN LOGIN authdaemond_path:/var/run/authdaemond/socket Получаем такую цепочку:

postfix <-> sasl <-> courier-authlib <-> sql-backend

Теперь о граблях... точнее об одной. В postfix есть такая опция smtpd_sasl_local_domain, она мешает ему авторизовать клиента. Глубоко не копал, просто погуглил и нашёл что такая бага есть, а всё остально заработало гладко.

Настройка SPF для почтового домена

Давно собирался настроить для хостингового домена нашего SPF - запись. Вот дошли руки повозиться с DNS. После того как спросил Google как это сделать, прошло 20 минут и всё готово. С технологией я был уже знаком, поэтому особо читать не пришлось долго, а просто надо было создать корректную SPF - запись. Был приятно удивлён визардом на официальном сайте SPF, который мне помог довольно быстро создать запись. После чего я её уже поправил руками и внёс в DNS. На этом же сайте есть документация и форум по этому всему делу. Ещё есть хорошие примеры по настройке в статье Howto define an SPF Record. Если хотите чтоб спамерам было немного труднее жить, сделайте это для своего домена!

Python для системного программирования

Последнее время рассуждаю на тему оптимального языка для системного программирования под unix. Т.е. то что традиционно делается мною на perl (day to day system tasks). Меня perl во многом устраивает, но сомнения по его производительности и "приятности работы" с ним немного терзают. Зато вот всё больше меня привлекает Python. Честно говоря начал его серьёзно воспринимать после того как увидил несколько работающих софтин на нём. Тот же yum, который использует redhat или взять Google, который тоже много где его в вебе использует. А Nokia вообще его портировала на свои телефоны. На данный момент мне интересна работа с XML и интеграция с системой. Попробую ближайшее время Python + XML в привязке к нашему хостингу. Посмотрим что из этого получится, напишу позже отчёт.

Кеширование динамики

Вопрос вообще достаточно насущный, особенно для сайтов с высокой посещаемостью. Для меня одно главное преимущество (для кого-то недостаток) MovableType перед Wordpress это возможность экспорта в статику контента (html). Сейчас поставил wp-cache плагин - тестирую.

Самое главное что меня поражает, почему разработчики не могут сделать нормальную обработку If-Modified-Since HTTP-заголовка во многих динамических програмных продуктах. Ведь это значительно снизит и траффик и нагрузку на сервер. Я вполне понимаю что объективным такое значение может быть довольно относительно, но можно поставить небольшое время экспайринга... Вообщем я пока ищу ответ на этот вопрос и заодно пытаюсь разобраться как научить Wordpress понимать такие элементарные вещи.