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

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

Запустил у себя, правда вместо 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

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

А вот где засада-то версия не та, а я тут моск напрягал, что за файл такой... Статью черкну по 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 перешёл :)

Debian jessie.

Андрей, а есть ли альтернативный способ установки вот этого модуля "XMLRPC::Transport::HTTP::Plack"?
Скажем, сегодня cpanminus, task, starman можно устанавливать из репозитория, а не комплектовать как выше указано(которые в домашней директории создают системные каталоги).
С самого начала по порядку... Дело в том что при установке cpanminus через "curl" создается в домашней директории каталог .cpanm. Далее при установке тройки модулей через него(cpanm) пишет - cpanm: command not found(команда не найдена). Хорошо, пусть так, я использую альтернативу "cpan", у меня все устанавливается, но также создается в домашней директории каталог .cpan. =) Кстати установка этих трех модулей только из под "рута" или через судо, которых также создают пару каталогов в домашней директории (.perl5 и т.д.) как у пользователя так и у рута. В итоге если устанавливать, по этому мануалу который выше описан ничего не работает все ломается на старте "/etc/init.d/mt-starman start"(дословно не помню что пишет, приметно так "start-stop-daemon : not found").

При установки cpanminus из репозитория чрез "aptitude install" сpanm работает(его директория /usr/share/perl5/App/cpanminus), но при установки трех модулей также создаются локальные каталоги, которым по всей видимости нужны рутовские права(непонятно зачем они там нужны?), так как например starman не работает из за того что он где-то в локальном каталоге валяется, и его нет по этому пути "/usr/local/bin/starman".
Но если starman установить через aptitide install, то у него сейчас другая директория "/usr/bin/starman" (при создании mt-starman нужно этот уже путь указывать).
На этом наверно остановлюсь, хотя еще пару ошибок было. Этот квест решить мне одному не под силу, может думаю уже есть более легкий путь решения проблем.
Например такой: aptitude install cpanminus Starman Task и другие пакеты, потом просто создать файл в /etc/init.d/mt-starman и все.



Всё описанное в посте, конечно же, выполняется из под рута.

Не могу подсказать, как решить именно вашу проблему, но могу сказать точно, что лучше устанавливать модули из репозиториев системы. Просто они не всегда там есть (на момент написания поста их вообще не было).

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

Статистика

Яндекс.Метрика

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

  • Movable Type 5.2.13

    Очередное обновление для 5-й и 6-й веток. Для пятой версии изменения затрагивают только устранение проблемы с безопасностью, а для шестой — тоже самое, плюс некоторые...

  • Где скачать Movable Type 6

    На первый взгляд может показаться, что новые версии Movable Type 6 остались только в планой версии, однако для персонального использования движок можно по-прежнему использовать бесплатно....

  • Movable Type 5.2.12

    Для 5-й и 6-й веток Movable Type вышло обновление, устраняющее угрозу безопасности. Скачать новую версию: 5.2.12 в zip-архиве 5.2.12 в tar.gz-архиве Только изменённые файлы (в...

  • Movable Type 5.2.11

    Обновление для 5-й ветки, в соответствии с жизненным циклом версий, появляются только при появлении угроз безопасности. Сегодня такая угроза появилась, поэтому рекомендуется обновить Movable Type....

  • Обновился сайт с плагинами

    Сайт plugins.movabletype.org, долгое время находившийся в полурабочем состоянии, вновь стал рабочим. У каждого плагина появились обнозначения о совместимости со старыми и новыми версиями. Также многие...

Закрыть