Movable Type на PSGI и nginx

В Movable Type 5.2 появилась встроенная поддержка PSGI. В связке с nginx это даёт значительный прирост производительности — страницы открываются не просто быстро, а невероятно быстро.

Единственный минус PSGI — для настройки Movable Type необходимы права root, поэтому пользователям виртуального хостинга, к сожалению, радоваться не приходится. А для тех, у кого свой сервер или VPS, я подготовил подробную инструкцию.

Вся процедура установки и настройки разделена на 3 этапа: Debian, nginx и Movable Type. Для других операционных систем процесс будет аналогичен, но, возможно, процесс запуска системного сервиса будет немного отличаться.

Debian

Для начала необходимо установить дополнительные Perl-модули. Можно использовать стандартный установщик CPAN, а можно воспользоваться более удобным cpanminus.

Для установки cpanminus выполните команду (другие варианты установки):

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

Теперь можно устанавливать модули. При помощи cpanminus установка происходит командой «cpanm ИМЯ-МОДУЛЯ». Выполним установку 3 модулей за раз:

cpanm Task::Plack XMLRPC::Transport::HTTP::Plack Starman

После установки модулей необходимо создать системный сервис (daemon), который будет автоматически загружаться с системой. Разместите в папке /etc/init.d файл mt-starman со следующим содержанием (отредактируйте необходимое):

#!/bin/sh

### BEGIN INIT INFO
# Provides:          starman-mt
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starman daemon
# Description:       Start and stop Starman daemon.
### END INIT INFO

DIR=/absolute/path/to/mt-directory
SCRIPT=/absolute/path/to/mt.psgi
USER=www-data
GROUP=www-data

WORKERS=3
LISTEN=127.0.0.1:50000
ERROR_LOG=/var/log/mt-starman.log

# If you have a permission problem,
# move PID-file to USER home directory
PIDFILE=/var/run/mt.pid

case "$1" in
  start)
    start-stop-daemon --start --chuid $USER --chdir $DIR \
        --pidfile=$PIDFILE \
        --exec /usr/local/bin/starman -- -D --pid $PIDFILE \
        --listen $LISTEN --error-log $ERROR_LOG \
        --user $USER --group $GROUP \
        --workers $WORKERS $SCRIPT
    ;;
  stop)
    start-stop-daemon --stop --pidfile $PIDFILE
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop}" >&2
    exit 3
    ;;
esac

Количество процессов (WORKERS) может быть любым — от одного до бесконечности, в зависимости от того, сколько на сервере памяти.

На файл mt-starman необходимо установить права доступа 755, из терминала достаточно выполнить команду:

chmod 755 /etc/init.d/mt-starman

Чтобы сервис автоматически загружался со стартом системы, выполните команду:

update-rc.d mt-starman defaults

Если у вас Debian Squeeze или более новая, то команда будет такая:

insserv mt-starman

nginx

Сперва необходимо добавить в основной конфигурационный файл nginx (nginx.conf) в раздел http следующий блок:

upstream starman {
        server 127.0.0.1:50000;
}

После этого нужно настроить сайты. Для этого в раздел server каждого сайта, где используется Movable Type, добавьте следующее:

location /cgi-bin/mt/ {
    proxy_set_header        Host $http_host;
    proxy_set_header        X-Forwarded-Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass      http://starman;
}

Movable Type

Теперь добавляем в mt-config.cgi информацию, где расположен PID-файл:

PIDFilePath /var/run/mt.pid

Для удобства можно также сменить названия скриптов Movable Type, для этого в том же mt-config.cgi нужно добавить:

AdminScript app
CommentScript comments
TrackbackScript trackbacks
SearchScript ftsearch
XMLRPCScript xmlrpc
AtomScript atom
UpgradeScript upgrade

Сами файлы также нужно переименовать. Например, если основной файл был mt.cgi, то в соответствии с примером нужно переименовать его в app.

Теперь осталось перезагрузить nginx и запустить Starman:

/etc/init.d/mt-starman start && /etc/init.d/nginx restart

После этого Movable Type будет доступен по адресу example.com/cgi-bin/app.

Обратите внимание, при использовании PSGI, если вы изменили что-нибудь в mt-config.cgi, установили плагин или обновили Movable Type, нужно будет перезапускать процесс mt-starman.

Все примеры из этого поста можно скачать на Github: github.com/saahov/mt-starman-daemon.

Кроме того, вместо nginx можно использовать Lighttpd.

Movable Type также отлично работает в связке nginx + FastCGI.

Обратите внимание, чтобы в логах Movable Type отображался реальный IP, нужно указать в mt-config.cgi следующее:

TransparentProxyIPs 1

Комментариев: 44

Запустил у себя, правда вместо nginx lighttpd, мне он как-то больше нравится.

Главное от прожорливого Апача избавились ;)

Кстати в proxy_set_header смысла нет, starman в них все равно не смотрит результат - в журналах активности пишется 127.0.0.1

Да, точно, это не хорошо, попозже посмотрю, как это можно исправить.

Чтобы в логах отображался реальный IP, нужно в конфиг добавить строчку «TransparentProxyIPs 1».

Что за косяк? Starman говорит нет такого файла mt.psgi...

С путями всё порядке?

Ну да, так такого файла нет, откуда ему появится то? Еще и лог starman'a как начал увеличиваться... А что должно быть в DIR и SCRIPT?

В DIR что-то вроде этого:
/home/example.com/cgi-bin/mt

В SCRIPT:
/home/example.com/cgi-bin/mt/mt.psgi

Файл mt.psgi есть только в Movable Type 5.2+, потому что встроенная поддержка PSGI появилась только с этой версии.
Я где-то видел инструкцию, как запустить четвёртую версию на PSGI, сейчас уже не припомню где, но там не так просто было, как в пятой версии.

Зато получилось: NGINX+FastCGI+MT

А вот инструкция пригодилась бы ;)
Я бы поставил ссылку на неё в этом посте.

MT+FastCGI

Добавил в пост ссылку.

А вот где засада-то версия не та, а я тут моск напрягал, что за файл такой... Статью черкну по FastCGI, но много вопросов осталось, как-то все мне кажется не так работает... скорость бы проверить... не нравится что-то...

Starman не взлетает — ругается на отсутствие доступа.

Сделал как описано, вижу в логе:

Couldn't open pid file "/var/run/mt.pid" [%D0%9E%D1%82%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%BE %D0%B2 %D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B5].

at line 180 in file /usr/local/share/perl/5.10.1/Net/Server.pm

(В квадратных скобках — URL-encoded фраза «Отказано в доступе»).

Попробовал создать /var/run/mt.pid и отдать его пользователю www-data — получаю другую ошибку:

Couldn't find pid in existing pid_file at /usr/local/share/perl/5.10.1/Net/Server/Daemonize.pm line 48.

PID-файл создаётся во время запуска сервиса. Поэтому вторая ошибка сообщает, что файл уже есть, но PID в нём другой.
Попробуйте изменить строчку «PIDFILE=/var/run/mt.pid» на «PIDFILE=/home/username/mt.pid», то есть переместить в папку пользователя, который указан в USER.

Обхитрил: сделал каталог /var/run/www и отдал его юзеру www-data, поменяв попутно настройки в конфигах стармана и MT, чтоб они создавали pid-файл внутри именно этого каталога — стал запускаться.

Отличный вариант :)

Запускается, но на любой запрос из /cgi-bin/mtn/ (тут путь именно такой) возвращает страницу с текстом Not Found. HTTP-статус, соответственно, тоже 404 Not Found. В логе помимо отчёта, что демон запущен, ничего нет. Куда смотреть, что гуглить?

Что-то с путями. Возможно, поможет добавление в mt-config.cgi названия скриптов, в статье есть информация об этом.

Запустил. Но вот зачем он начитает по всему сайту мусорить файлами? И зачем он делает файлы *.php?

Может быть потому, что этой так предусмотрено, создавать статические файлы?

Да не должен он создавать php файлы. На код взгляните.

Так в нем же и написано, в комменте:

# If you have a permission problem,
# move PID-file to USER home directory

Я бы в конфиг добавил-бы такие директивы:

max-requests
keepaive-timeout


первая отвечает за максимальное количество запросов, по умолчанию стоит 1000, вторая сколько секунд ждать что-бы закрыть соединение.

Поработал денёк starman и сдох... Вот лог:

Error while loading /home/www/example.com/cgi-bin/mt.psgi: Can't use string ("") as a subroutine ref while "strict refs" in use at lib/MT/PSGI.pm line 257.

А в конфиге прописаны директивы вроде «AdminScript»?
Можно попробовать их прописать, перезапустить и посмотреть, что будет.

И прописывал, и закомментировал и перезапускал, и переустанавливал все модули включая старман... позже еще поковыряюсь, ведь работало-же!

Все, запустил но тут засада:

Не находит mt-comment.cgi

Закомментировал вот эту строку:

CommentScript comments

и вроде все работает.

А после того, как была добавлена строчка «CommentScript comments», скрипт mt-comment.cgi был переименован в comments?

Нет, а надо?

Оказывается, что да :)

Ахахаахах.... )))) щас попробую! Спасибо.

Вроде все запустил... тьфу-тьфу... Правда есть один нюанс, не показывает капчу... наверное где-то в nginx что-то прописать надо. Кстати, для начинающих что-бы мозг не выносить себе, есть базовые настройки nginx. Boilerplate называется, ищется в гугле.

Еще один неприятный нюанс, скрипты свои теперь в этой директории не запускаются, выскакивает сообщение "not found"

С чем такое связано, может из-за конфига в nginx?

Да, это из-за nginx и Starman, так как другие скрипты не приписаны в библиотеке MT.

Я так понимаю мне надо все переписывать на pcgi+plack? Или просто прописать в конфиге имена скриптов? Попробую второе.

Да не, не пройдет. Попробую запустить pcgi+plack.

Так тоже не прошло... зато получилось так, содержимое папки cgi-bin/ перенес в cgi-bin/mt/(вот где пригодилось-то...) оттуда скрипты запускаются как PCGI на 5000 порту, а содержимое cgi-bin/ то есть свои скрипты запустил через FastCGI на 8999 порту, ну и раз уж полез в конфиг nginx то запустил phpmyadmin как php5-cgi на 9000 порту... Пора уже статью писать про энто...

Статья была бы кстати :)

Что то у меня никак не хочет работать. Не создается файл mt.pid и в логах пусто.

На fastcgi работает.

Может пакетов каких то не хватает в системе или флаги не те выставил.

И дайте пожалуйста полный пример конфигурации сайта server {
}

mt.pid может не создаваться из-за прав доступа.
Я посмотрел свой конфиг nginx, если выкинуть из него всё специфичное для моего сервера, то будет тоже самое, что в примере, который в этом посте есть.
На всякий случай:
http://data.saahov.ru/f/14/01/25/example_c73b1ecc.conf

Спасибо, буду дальше ковырять.
Решил полностью избавиться от апача, заодно систему почищу, а потом заново все проинсталю.

И правильно, недавно я тоже полностью на nginx перешёл :)

Комментировать

Статистика

Последние записи

  • Основные нововведения в Movable Type 6

    В шестой версии появилось несколько новшеств, которых нет ни в одной другой системе управления контентом, и благодаря которым Movable Type стал ещё лучше. Data API...

  • Movable Type 5.2.9

    В новой версии нет значительных изменения, обновление касается только безопасности системы — была устранена ошибка, благодаря которой была возможна XSS-атака через визуальный редактор. Скачать новую...

  • Будущее Movable Type

    Когда на официальном сайте появилась новость о предстоящей смене лицензии для Movable Type 6.x, я, как наверняка многие из вас, не придал этому должного значения....

  • Movable Type 5.2.7

    Состоялся релиз новой версии Movable Type 5.27, основные изменения которого: Новая адаптивная тема «Eiger». Для редакции Pro и Advanced доступен плагин «Smartphone Option», благодаря которому...

  • Автоподстановка тегов в Movable Type

    Не знаю, как для вас, а для меня стало открытием, что в Movable Type работает автоподстановка тегов на кириллице — для этого достаточно ввести первые...

Закрыть