Записи с меткой «disorder.ru»

ЭВМ/ Оптимизировал-оптимизировал

10.07.2011

На днях вдруг решил пооптимизировать свой сайт. Началось все с Google Webmaster Tools. Там есть специальный раздел — Site Performance, который давно мне мозолил глаза, сообщая, что среднее время загрузки Непорядка составляет около 5 секунд, а 74% аналогичных сайтов имеют лучше результаты. И в конце приписочка, мол, установите Page Speed, расширение для Chrome и Firefox, и улучшите свои результаты. Долго я не обращал на это внимание, но в конце концов усовестился. Ведь и верно, 5 секунд для простого бложика — это ж стыдоба. Кроме всего прочего время отклика сайта влияет на его Page Rank, что в свою очередь отражается на количестве посетителей из поисковиков.

В общем, поставил я этот Page Speed, прогнал. Он выдал пару критичных замечаний, несколько некритичных и с десяток мелких. Основная претензия была к большому количеству мелких иконок, которые следовало объединить в CSS спрайты. Про CSS спрайты я до сего момента ничего не слышал, пришлось бегло изучить вопрос. CSS спрайты представляют собой картинки, объединенные в один графический файл. Каждая маленькая картинка затем «вырезается» из большой средствами CSS. Таким образом, вместо 10 запросов к веб-серверу делается один. Забавно, но, помнится, раньше было все наоборот, крупные картинки для ускорения загрузки резали на части и потом совмещали их на странице.

К счастью, существует немало онлайн-сервисов, облегчающих создание спрайтов. Я воспользовался вот этим. В целом, все оказалось несложно, даже с моими скудными знаниями в HTML/CSS. Правда, в паре мест слегка поехала верстка, но это поправимо.

Затем я добавил в конфиг nginx мантру про кэширование статики браузером:

location ~* \.(js|css|jpg|jpeg|gif|png)$ {
    expires 2w;
}

И установил плагин WP Super Cache, чтобы не запускать каждый раз мощные PHP коды для рендеринга статичных по своей сути страниц. На этом основная оптимизация закончилась. После этого я сделал еще несколько мелких исправлений, в частности уменьшил количество постов на одной странице.

Попутно с Page Speed я замерял время загрузки сайта с помощью этого сервиса. Он в удобной графической форме отображает все стадии загрузки страницы. В итоге время загрузки было уменьшено с 3 секунд до 0.8.

,

Administrivia: вернулись комментарии через LJ OpenID

18.05.2011

Одно время OpenID provider в ЖЖ не работал, пришлось его выпилить из формы комментариев. Сейчас все нормально, так что вернул его на место.

,

День рождения

10.03.2011


Сегодня ровно год с момента запуска нынешней версии «Непорядка». В честь праздничка я хочу вам показать непорядок 2008 года разлива.

ЭВМ/ WordPress 3.1

05.03.2011

Обновился до 3.1. Понравилась новая «быстрая» панель сверху для администрирования.

Не понравилось, что сломали обратную совместимость постоянных ссылок на метки. Раньше было /archives/tag, сейчас просто /tag. Хотя в настройках можно поправить. Остальных новшеств пока не заметил.

,

Особенности национального поиска

09.02.2011

Только почти год спустя после запуска этого бложика Яндекс наконец-то стал выдавать его в результатах своего поиска. До января переходов не было совсем, прямо игнор какой-то. Даже не знаю, с чем это связано.

,

Administrivia

29.12.2010

Теперь можно оставлять комментарии, пользуясь своим аккаунтом Facebook или Twitter. Как всегда, не обошлось без доработки плагинов напильником.

, , , ,

ЭВМ/ OpenID consumer для WordPress

22.12.2010

Надеюсь, вы уже успели насладиться ими. Расскажу, как непросто было их сделать.

Как вы, наверное, заметили, комментарии тут сделаны на базе аутентификации через OpenID aka OpenID consumer. Эта функциональность входит все в тот же плагин OpenID, о котором я уже писал, нужно только поставить соответствующие галочки в настройках. Однако после этого начинается самое интересное.

Во-первых, стандартная форма для комментариев, предлагаемая этим плагином, страшна, как смертный грех. Кроме того, она предполагает вбивание вручную полностью OpenID идентификаторов, которые у некоторых провайдеров могут быть довольно длинными. Для решения этой проблемы служит другой плагин: Comments with OpenID. У него есть красивые иконки для большинства известных OpenID провайдеров, нажимая на которые, можно получить заготовку идентификатора, в которую остается только вбить имя пользователя. Плагин пришлось форкнуть и поправить из-за LiveJournal. Эти орлы сломали у себя OpenID, хотели запретить OpenID аутентификацию только для переименованных аккаунтов, а в результате поломали для всех. Поэтому я удалил их иконку, пока не починят. Еще я заменил шаблон OpenID идентификатора для Google, чтобы получалась красивая ссылка на профиль.

Далее возникли проблемы с получением имени пользователя. Как известно, протокол OpenID помимо непосредственно аутентификации содержит различные расширения, позволяющие, в частности, запросить имя пользователя, его email, домашнюю страницу и т.д. И если с аутентификацией у всех провайдеров все более или менее хорошо, то дополнительные атрибуты все отдают по-разному.

Например, Google не отдает свойство namePerson, а отдает два отдельных поля namePerson/first и namePerson/last. А mail.ru так вообще нарушает спецификацию и не передает необходимый параметр openid.ns.sreg. По этому поводу я, кстати, написал им в техподдержку; на результат, правда, особо не надеюсь. В общем, все эти мелочи я поправил опять-таки в своем форке плагина openid. Самые приличные комиты послал автору, надеюсь, включит в очередную версию, а остальной трэш типа заплатки для mail.ru поместил в отдельную ветку wip (work in progress).

Кроме того, я добавил в плагин возможность требовать обязательного наличия OpenID. Нужно поставить новую галочку в настройках «Require OpenID authentication».

Ну и вставил немного русского перевода. Русский перевод хорошо бы сделать полностью и отослать автору, там работы-то на пару часов.

В общем, как это обычно бывает, объединение якобы открытых систем на базе якобы открытых протоколов оказалось делом хлопотным.

, , ,

В пятницу вечером

17.12.2010

Появились они.

Освежил дизайн

13.12.2010

Немного поменял дизайн сайта, надеюсь, стало лучше. Кто читает через RSS, можете зайти, поглядеть.

PR упал

03.12.2010

Попытался слегка соптимизировать сайт для поисковиков, в частности запретил индексацию тегов и категорий, чтобы не дублировать контент. В результате PageRank упал с 3 до 2.

, ,

ЭВМ/ Administrivia

15.11.2010

Обновил WordPress до последней версии 3.0.1. Все прошло гладко, хотя на всякий случай сделал дамп MySQL базы и скопировал директорию wordpress; но не понадобилось. Каких-то сильных отличий пока не заметил, разве что цвет фона в управляющей консоли стал белый вместо серого. Но переходить на новые версии завсегда полезно, чтобы вовремя получать заплатки для дырок в безопасности, коих, я уверен, в WordPress предостаточно.

ЭВМ/ непорядок v6

12.05.2010

Рад сообщить, что «непорядок» теперь доступен по IPv6. Те, кто используют IPv6, увидят маленький синий значок «v6» рядом с названием сайта.

К сожалению Linode не предоставляет собственной IPv6 связности, но дает подробные инструкции, как получить оную через туннель от Hurricane Electric, он же Tunnel Broker. Ширина полосы в бесплатном туннеле конечно регулируется, но на времени отклика это никак не сказывается. Одна из точек присутствия Hurricane Electric находится в Лондоне, там же расположен ДЦ Linode, где у меня VPS. Поэтому вход в туннель оказывается очень близко:

li153-251:~# ip link show 6in4
11: 6in4@NONE:
 mtu 1280 qdisc noqueue state UNKNOWN
    link/sit 0.0.0.0 peer 216.66.80.26
li153-251:~# traceroute 216.66.80.26
traceroute to 216.66.80.26 (216.66.80.26), 30 hops max, 40 byte packets
 1  109.74.192.2 (109.74.192.2)  0.437 ms  0.462 ms  0.526 ms
 2  te3-1-border76-01.lon2.telecity.net (217.20.44.217)  0.744 ms * *
 3  217.20.44.194 (217.20.44.194)  0.687 ms * *
 4  10gigabitethernet1-1.core1.lon1.he.net (195.66.224.21)  8.024 ms  7.974 ms  7.829 ms
 5  tserv5.lon1.ipv6.he.net (216.66.80.26)  0.938 ms  0.779 ms  0.812 ms
li153-251:~# ping -c3 216.66.80.26
PING 216.66.80.26 (216.66.80.26) 56(84) bytes of data.
64 bytes from 216.66.80.26: icmp_seq=1 ttl=60 time=1.02 ms
64 bytes from 216.66.80.26: icmp_seq=2 ttl=60 time=3.39 ms
64 bytes from 216.66.80.26: icmp_seq=3 ttl=60 time=2.98 ms

--- 216.66.80.26 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 1.021/2.466/3.398/1.036 ms

Непосредственная связность с внешним миром тоже очень хорошая, наличие туннеля совсем незаметно:

li153-251:~# ping6 -c3 ipv6.google.com
PING ipv6.google.com(2a00:1450:8006::68) 56 data bytes
64 bytes from 2a00:1450:8006::68: icmp_seq=1 ttl=57 time=8.25 ms
64 bytes from 2a00:1450:8006::68: icmp_seq=2 ttl=57 time=8.35 ms
64 bytes from 2a00:1450:8006::68: icmp_seq=3 ttl=57 time=8.75 ms

--- ipv6.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 8.259/8.458/8.758/0.240 ms

Для того, чтобы nginx начал обрабатывать IPv6 запросы, пришлось обновить его до версии 0.7.65. В стандартном репозитории Debian Lenny есть только версия 0.6.32, поэтому пришлось подключить репозиторий Backports и ставить из него.

Еще один интересный момент связан с конфигурацией. nginx по умолчанию открывает порт только для IPv4 соединений, это задает директива listen в файле /etc/nginx/sites-available/default:

listen 80 default;

Чтобы принимать IPv6 соединения, нужно добавить еще одну директиву listen для IPv6:

listen [::] default;

Специальный адрес [::] является так называемым wildcard и означает «все IPv6 адреса». Однако с такой конфигурацией nginx не запускается и выдает ошибку:

[emerg]: bind() to [::]:80 failed (98: Address already in use)

Дело в том, что в IPv6 существует такое понятие как IPv4-mapped адрес. Суть его в том, что пространство IPv4 адресов отображается в пространство IPv6 адресов с помощью специального префикса ::ffff. Сделано это, видимо, для облегчения процесса перехода на новый протокол. Покойный itojun говорил, что это возможность является потенциальной дырой в безопасности, поэтому, например, в OpenBSD она отключена. В других системах, более терпимых к дырам, наличие этой возможности контролируется специальным параметром для сокетов IPV6_V6ONLY. И в Linux по умолчанию IPv4-mapped адреса включены. Это приводит к тому, что вызов bind(2) с IPv6 wildcard в качестве адреса пытается помимо IPv6 адресов захватить и IPv4 адреса, которые уже заняты предыдущей директивой listen. Чтобы решить проблему, необходимо отключить IPv4-mapped адреса с помощью параметра ipv6only в конфиге nginx:

listen [::] default ipv6only=on;
, , , , ,

ЭВМ/ IT-хозяйство: веб-хостинг

31.03.2010

Осталось рассказать, какой софт я развернул на своей VPS. Как я уже говорил, Linode делает свои виртуалки на базе Xen, причем в режиме паравиртуализации. А это, в свою очередь, означает, что выбор ОС сильно ограничен: или Linux, или какой-то другой Linux. Нет, конечно есть вполне рабочий порт NetBSD на Xen, есть порт FreeBSD, были даже попытки запустить OpenBSD на этой архитектуре. Но, во-первых, я не слышал, чтобы кто-то делал веб-хостинг на NetBSD, а FreeBSD на мой взгляд ничем не лучше Linux.

Вообще я не очень люблю Linux, но и какой-то патологической ненависти к нему не испытываю. Поэтому к идее развернуть свое хозяйство на этой ОС отношусь спокойно. Кроме того, все последние годы деньги мне платили именно за работу с Linux. Так что опыт кое-какой имеется. Сам я слабо разбираюсь в тонкостях современных дистрибутивов Linux и в том, как устроен веб-хостинг. Но многие коллеги на нынешней работе имеют в этой области хороший опыт, поэтому я все делал, основываясь на их рекомендациях.

После выбора тарифного плана на Linode необходимо решить, какую операционную систему развернуть. Из всего списка я остановился на (точнее мне посоветовали) Debian 5.0 Lenny. Забегая наперед скажу, что система мне понравилась: удобный менеджер пакетов, сами пакеты сделаны хорошо, избавляют от большого количества рутиной работы по первичной настройке. Через несколько секунд новая виртуальная машина готова к работе. Зайти на нее можно либо через AJAX консоль, либо по ssh. Консоль также доступна через ssh-интерфейс (что-то вроде serial console по сети), они ее называют красивым именем Lish — Linode Shell, хотя на самом деле это обычная Xen console. Итак, залогинившись можно приступать к настройке.

В качестве веб-платформы я решил (опять-таки послушав умных людей) использовать связку nginxPHP-FPM + MySQL. nginx — потому что монстр Apache мне не нужен, PHP-FPM — толковая реализация FastCGI для PHP, которая кушает мало памяти (а память на моем VPS сильно ограничена), а MySQL — он и в Африке MySQL, не PostgreSQL же ставить в самом деле.

С nginx и MySQL никаких проблем не возникло, оба пакета нашлись в стандартном репозитории Debian. А вот с PHP-FPM не все просто. PHP-FPM — суть сторонний патч для PHP, и только совсем недавно было принято решение включить его в следующую версию PHP. А до сих все прикладывали его вручную, а самые продвинутые делали собственный пакет. Оба этих варианта мне не годились, потому что у меня совсем нет времени делать и поддерживать наколенные поделки, свои или чужие. Легкое гугление показало, что есть добрые люди, которые не только собрали нужный мне пакет, но и создали для него репозиторий и готовы пакет поддерживать. Но на практике оказалось, что их пакеты уже остали от обновлений Debian Security, поэтому эту затею пришлось оставить.

Дальнейшее гугление привело меня на сайт Dotdeb. И там наконец обнаружился добротный пакет PHP-FPM, но только для PHP 5.3, тогда как в Lenny по умолчанию идет 5.2. Но так как мне было все равно, какую версию PHP ставить, я его и взял. Впоследствии правда оказалось, что есть небольшие проблемы этой версии с некоторыми плагинами для WordPress, но в остальном все отлично.

Теперь осталось только выбрать движок для блога. Так как я этой темой никогда особо не интересовался, то взял самый популярный — WordPress. И, надо сказать, не жалею. Интерфейс приятный, удобный, работает быстро. За пол дня подточил стандартную тему — и новый непорядок готов!

, , , , , , , , , , ,

ЭВМ/ StatCounter plugin 1.4

26.03.2010

В течение пары дней вышли подряд две новые версии WordPress плагина для интеграции с сервисом StatCounter.com. StatCounter — это типа нашего SpyLog, позволяет вести статистику посещений сайта. Сервис бесплатный, но есть дополнительные услуги за деньги. Сначала вышла версия 1.3, и тут же 1.4. Из видимых изменений — статистика теперь отображается прямо в консоли WP:

, ,

ЭВМ/ IT-хозяйство: VPS

26.03.2010

Еще в студенчестве я завел собственное небольшое IT-хозяйство. Делал это скорее из любопытства, нежели из каких-то практических соображений. Зарегистрировал несколько доменов, себе и друзьям; тогда еще регистрацией занимался РосНИИРОС, а оплата происходила банковским переводом. Поднял DNS сервер, настроил sendmail на прием почты для этих доменов, сделал виртуальные хосты в Apache. Так как в то время я был администратором в студенческой локальной сети, то все это хозяйство было развернуто на студенческих серверах, понятное дело бесплатно. Но так как ресурсов оно кушало мало, то никто не был против.

И так продолжалось очень долго, даже когда я выпустился и передал бразды правления серверами, все мои привилегии остались, в том числе и sudo. Но с каждым годом росла тревога, что в один прекрасный момент придут совсем незнакомые люди, скажут: «А это кто такой?» и выкинут все мое хозяйство. И будут правы кстати. Поэтому нужно было куда-то переехать, не дожидаяся дня X, чтобы потом в спешке не собирать манатки.

С почтой вроде разобрались. Остались DNS и веб-хостинг. Очень не хотелось платить денег, ведь столько лет все было бесплатно. С DNS еще можно было что-то придумать, есть сервисы типа DNS Park, которые могут хостить DNS бесплатно. Но там есть неприятные ограничения, и остается проблема, где взять secondary. А вот с бесплатным хостингом точно ничего не выйдет, если нужна хоть какая-то стабильность работы.

В результате мой выбор остановился на VPS. Это хороший компромис между гибкостью и ценой. Dedicated слишком дорог, а виртуальный хостинг слишком убог. К тому же виртуальный хостинг за $5 — это одни слезы, более-менее приличный стоит под $20, а за эти деньги буржуи уже предлагают небольшую виртуалочку, которая по своим вычислительным мощностям ничем не уступает.

Среди огромного числа хостеров я по совету друзей выбрал зарубежный Linode. Они дают VPS на основе Xen, а это хорошая технология. На работе я как-то тестировал различные технологии виртуализации, оказалось, что лучше Xen только VMWare ESX. Минимальная виртуалка имеет 360 Мбайт ОЗУ и стоит $20 в месяц. Именно такую я и взял.

Небольшое отступление. Некоторые используют термин VPS для обозначения различного рода контейнеров, таких как OpenVZ. Для полных виртуальных машин типа Xen они используют термин VDS — Virtual Dedicated Server. Я термин VDS не использую, так как и так ясно, о чем речь.

Раньше Linode предлагала размещение виртуалок только в США, теперь у них появился датацентр в Лондоне, что не может не радовать. Пинг до лондонского ДЦ из моего дома составляет 75 мс, что вполне терпимо. А в остальном VPS как VPS. Удобная панель, я за пару кликов развернул Debian, все настроил. Поддержка DNS входит в стоимость, при этом используются DNS серверы самой Linode, т.е. дают и primary, и secondary. В общем я всем пока доволен, мое IT-хозяйство на новом месте чувствует себя замечательно.

, , , , ,

ЭВМ/ IT-хозяйство: почта

25.03.2010

Файл /etc/mail/aliases на студенческом почтовом сервере технического ВУЗа может многое рассказать о выпускниках. Возьмем к примеру такую строчку:

crazzydoc:		anton.ivanov@megainvestconsult.com

Что она нам может сказать? Возможно, некий Антон Иванов, в студенчестве называвший себя в сети не иначе как CrazzyDoc, сейчас занимает хорошую должность в зарубежной компании, приходит в офис к девяти и носит деловой костюм.

Или такая строка:

deadshaft:		me@prostovmesto.ru

Включаем фантазию и видим бывшего чемпиона по «Кваке», а ныне активного участника социальных сетей и владельца собственного блога.

В моем институте, в бывшем моем общежитии тоже есть почтовый сервер и там есть такой файл. И долгое время, даже после того, как я выпустился, про меня в нем ничего не было. Я пользовался своим студенческим почтовым адресом и даже немного гордился им. Он был в домене третьего уровня, и в этом был свой шарм. Он принимался там, где не работали бесплатные адреса типа @mail.ru. Кстати, за адрес нужно было тогда заплатить единовременно что-то около 150 рублей. Доходило до смешного, как-то раз на мое письмо мне ответили, что для студентов у них особые условия, и я не сразу сообразил, почему меня приняли за студента.

Впрочем, все это не мешало мне иметь личный домен второго уровня и держать на нем почту. Точнее заворачивать ее в свой студенческий ящик. Но в поле From: у меня все равно стоял мой первый адрес.

На втором курсе я стал администрировать студенческий сервер. Сначала я его взломал, написал о найденных дырах тогдашнему админу, и он к моему удивлению предложил мне заняться этой машиной. В связи с этим почту я читал следующим образом: логинился на сервер по ssh и запускал mutt. При этом в .forward у меня было

|procmail

А в файле .procmailrc были описаны правила, которые раскидывали почту по разным ящиками. mutt, понятное дело, работал локально.

Эта схема, не смотря на свою аскетичность, меня вполне устраивала. Однако со временем все сильней и сильней стали проявляться недостатки. Было неудобно работать с вложениями, приходилось гонять их туда-сюда через scp. Неудобно читать почту не из дома, не везде есть ssh, не везде есть доступ по 22 порту, не везде можно безбоязненно печатать пароль от шелла с возможностью sudo. И самое главное — после выпуска с каждым годом растет вероятность того, что шелл у меня отнимут навсегда. Таким образом встал вопрос: куда мигрировать?

Разные были варианты, вплоть до размещения сервера у себя дома (жесть, ага). Но в итоге победил Google Apps. Официально Google Apps — это набор веб-сервисов для организации работы в предприятии, в том числе и знаменитая гугловая почта. Помимо почты туда входят календарь, общие документы, веб-портал. Такой вот Groupware SaaS. Вообще Google хочет за эту денежку, но если число аккаунтов меньше 50 — то все удовольствие бесплатно. Поэтому Google Apps вполне можно использовать для бесплатного «паркинга» почты в своем домене. Нужно только поставить MX на серверы Google.

Итого я получил надежный прием почты, удобный веб-интерфейс для доступа из любого места (при этом возможность запускать любимый mutt осталась, нужно только настроить в нем доступ по IMAP), много места для писем, хороший поиск по ним. А в качестве бонуса — простейший менеджер текущих задач, календарь и Jabber в своем домене.

Освоившись с новой почтой, я изменил в настройках mutt поле From:, подписал свой новый адрес на все свои списки рассылки вместо старого и наконец добавил на студенческом сервере в /etc/mail/aliases запись:

grange:		grange@disorder.ru
, ,

ЭВМ/ OpenID

18.03.2010

Задумал я на базе этого блога сделать себе OpenID. OpenID — это способ идентифицировать и аутентифицировать себя на многих web-сервисах с помощью одной учетной записи. Фактически это означает, что получив один раз OpenID, можно больше не регистрироваться на сотне сайтов только ради того, чтобы читать приватные записи или писать комментарии. Конечно, эти сотни сайтов должны поддерживать OpenID. Получить OpenID можно во многих местах абсолютно бесплатно, например в том же LJ. Или настроить OpenID provider у себя в standalone блоге.

Вообще, я много лет жил без OpenID и прожил бы еще столько же, но недавно мой хороший друг уехал далеко-далеко и стал описывать свое новое житье в LJ. А так как он слегка страдает паранойей, все его записи доступны только «для друзей». Конечно, можно было завести технический аккаунт в LJ, единственной целью которого было бы предоставление доступа к приватным записям, но это совсем не комильфо.

В целом задача выглядела очень простой. Для WordPress (а этот блог работает именно на нем, если вдруг кто не понял) есть специальный плагин, который так и называется — OpenID, он предоставляет функционал как потребителя OpenID (для тех же комментариев), так и провайдера. Однако после установки плагин не заработал, так что пришлось засучить рукава и выяснять почему. Для тестирования в качестве потребителя OpenID использовался все тот же LJ.

Первое, что нагуглилось сразу — текущая версия OpenID 3.3.2 не работает с PHP 5.3, а именно его я использую по ряду причин. Патчик, исправляющий проблему, очень простой и действительно рабочий. Кроме того автор патча утверждает, что обратная совместимость не ломается, так что есть надежда, что в новой версии плагина эта проблема будет исправлена. Однако в Subversion репозитории проекта этого патча почему-то нет. На всякий случай я напомнил автору OpenID об этой проблеме.

Вторая проблема была связана с тем, что при авторизации возникал переход по адресу вида http://blog.name/index.php/openid/server…, который заканчивался ошибкой 404. Эта проблема также известна, и даже есть кривая заплатка. Чтобы понять ее причину и, главное, найти правильное решение, нужно сделать шаг в сторону и выяснить, как устроены постоянные ссылки в WP.

Постоянные ссылки на записи не меняются со временем и могут быть использованы на внешних ресурсах. По умолчанию WP генерирует постоянные ссылки вида http://blog.name/?p=123. Они не очень красиво выглядят, так как содержат в себе CGI параметры. «Красивые» ссылки вида http://blog.name/raznoe/kak-ya-provel-leto возможны при наличии mod_rewrite в Apache или соответствующих правил в конфигах lighttpd или nginx. Есть еще одна возможность, из-за которой собственно все и не работает — так называемые «почти красивые ссылки», или PATHINFO permalinks. Ссылки такого типа выглядят как http://blog.name/index.php/raznoe/kak-ya-provel-leto.

Метод PATHINFO (точнее даже PATH_INFO) работает только в Apache и использует одну его интересную особенность: по умолчанию URI вида /path/script.cgi/another/path, при наличии скрипта path/script.cgi, приводят к вызову обработчика этого скрипта, при этом устанавливается специальная переменная окружения PATH_INFO со значением равным /another/path.

У меня Apache нет, вместо него стоят nginx и php-fpm. В конфиге nginx присутствуют строчки, эмулирующие поведение mod_rewrite:

if (!-e $request_filename) {
        rewrite . /index.php last;
}

Вообще говоря, господин Сысоев всячески порицает (см. самый низ страницы) подобные конфиги, однако рекомендуемая им директива try_files присутствует только в nginx 0.7.x, тогда как у меня в Debian Lenny nginx версии 0.6.x, и менять его пока желания нет.

С nginx и его rewrite отдельная очень интересная история. Если зайти на страницу конфигурирования WP в раздел постоянных ссылок, то можно увидеть такую картинку:

Как видно, в качестве альтернативы «некрасивым» ссылкам WP предлагает использовать PATHINFO, которое не работает в nginx! Происходит это из-за того, что WP проверяет имя сервера, и если оно не Apache, или если Apache, но не загружен модуль mod_rewrite, то для постоянных ссылок по умолчанию включается режим PATHINFO. Справедливости ради надо отметить, что на самом деле правила rewrite для nginx, приведенные выше, все-таки заставляют схему с PATHINFO работать. Видимо, WP внутри себя как-то решает эту проблему. Но вот его плагины, в частности OpenID — нет, из-за чего собственно весь сыр-бор.

Так вот, оказывается, существует специальный плагин nginx Compatibility, который, во-первых, сообщает WP, что mod_rewrite как будто бы присутствует, а во-вторых, чинит какую-то проблему с FastCGI PHP SAPI, которая нас сейчас не интересует.

После активации плагина страница настроек стала выглядеть правильно:

По умолчанию предлагаются красивые mod_rewrite постоянные ссылки.

Но вернемся к OpenID. Проблема с ним заключена в нескольких строчках кода в файле common.php:

        if ($wp_rewrite->using_permalinks()) {
                $url .= 'index.php/openid/' . $service;
        } else {
                $url .= '?openid=' . $service;
        }

Автор неявно полагает, что если включены красивые постоянные ссылки, то механизм PATHINFO точно должен работать. Как было показано выше, это верно только для Apache. Таким образом если у вас не Apache (а у меня не Apache), и вы используете красивые постоянные ссылки (а я их использую), то плагин OpenID у вас работать не будет. Замечу, что без использования красивых постоянных ссылок все работает.

Горячие головы предлагают выкинуть совсем строчки, добавляющие index.php в URI, но не думаю, что автор на это согласится, все же он эти строки не зря добавил.

Чтобы найти правильный путь, нужно поставить еще один плагин — AskApache RewriteRules Viewer. Он показывает всю внутреннюю кухню постоянных ссылок:

Видно, что свойство using_permalinks, на которое опирается OpenID, действительно истинно, но свойство using_index_permalinks, которое на самом деле показывает, что работает PATHINFO, ложно. Таким образом правильным решением будет замена в вышеприведенном куске кода using_permalinks на using_index_permalinks. После того, как это было сделано, плагин успешно заработал, а соответствующий патч был отправлен автору.

, , , ,

Поехали

10.03.2010

Когда-то на этом месте уже был блог. И даже не один, а два. Движок для первого я написал самостоятельно за пару вечеров на posix shell. База данных не использовалась, записи хранились в файлах. SQL-подобные выборки было очень удобно делать через file name globbing и подстановку переменных. В качестве процессора шаблонов использовался sed.

Через некоторое время мне надоело сочинять посты в vim, заходя по ssh на веб-сервер, и я поставил первый попавшийся php-блог Pivot. В целом он был неплох, правда пришлось его подпилить на предмет дизайна и русского языка.

А потом я женился, родилась дочка, времени что-то писать не стало. Затем оно правда опять появилось, но пропала охота. И сайт долгое время не обновлялся.

Были некоторые сомнения о целесообразности его реанимации. Но недавно я получил письмо от незнакомого человека, в котором он интересовался дальнейшей судьбой блога. И я подумал, что можно начать еще раз.