• Immutable Page
  • Info
  • Attachments

Использование MoinMoin с FastCgi

FastCGI это метод, позволяющий Apache общаться с "долгоиграющими" скриптами. Он имеет то преимущество, что скрипты запускаются и инициализируются только однажды, и данные кешируются в памяти от запроса к запросу, увеличивая производительность CGI-приложений.

Развертывание на Apache

Чтобы развернуть MoinMoin с использованием FastCGI вам нужен Apache с mod_fastcgi. Пожалуйста, ознакомьтесь с документацией по mod_fastcgi, описывающей, как его собрать.

Выполните базовую apache-инсталляцию для вашей операционной системы, как описано в других частях установочной документации MoinMoin. В большинстве случаев это HelpOnInstalling/ApacheOnLinux. Там, где в документации упоминается moin.cgi вам следует использовать вместо этого moin.fcg. Убедитесь, что .fcg обрабатывается модулем FastCGI (AddHandler fastcgi-script .fcg в вашем конфиге apache).

Обычно, Apache запускает CGI-скрипты под своим собственным пользователем и группой, или с пользователем и группой соответствующего виртуального хоста, если вы используете suexec wrapper. Чтобы делать это с помощью FastCGI вам нужно включить в вашем конфиге apache опцию FastCgiWrapper On (см. документацию по FastCGI).

Убедитесь, что вы перезапустили Apache после изменения py-файлов (таких как config) для запуска сервера FastCGI, иначе вы не увидите никаких изменений!

Запуск как отдельного приложения и/или на Windows

MoinMoin может быть запущен как внешнее приложение, отвечающее на запросы FastCGI через локальный TCP/IP-сокет. Это хорошо работает на Windows. Всё, что вам нужно (имея установленный mod_fastcgi и работающий экземпляр MoinMoin) это:

  1. Выбрать номер порта для внутренней связи. Он должен быть больше 1023. В этом примере, мы выбрали 8888 (просто по приколу).
  2. Добавить следующие строки в ваш httpd.conf:
    Alias /moin.fcg "/your/path/to/moin.fcg"
    FastCgiExternalServer "/your/path/to/moin.fcg" -host localhost:8888
  3. Отредактировать moin.fcg. Заменить

    fcg = thfcgi.THFCGI(handle_request)
    на
    fcg = thfcgi.THFCGI(handle_request, 0, 8888)
  4. Запустить файл moin.fcg вручную, как обычный скрипт Python:

    python moin.fcg
  5. Запустить Apache.

Откат на CGI если FastCGI недоступен

Установите и протестируйте MoinMoin согласно HelpOnInstalling/ApacheOnLinux. Потом сделайте и проверьте нужные правки для запуска mod_fastcgi. Если вы удовлетворены, то можете добавить следующий блок в свой конфиг Apache:

<IfModule !mod_fastcgi.c>
    ScriptAlias /mywiki "/your/path/to/moin.cgi"
</IfModule>
<IfModule mod_fastcgi.c>
    AddHandler fastcgi-script .fcg
    ScriptAlias /mywiki "/your/path/to/moin.fcg"
</IfModule>

Теперь Apache будет использовать mod_fastcgi если он доступен, и медленный cgi-скрипт в противном случае.

Развертывание на lighttpd

Лучшим вариантом будет запуск moin как внешнего приложения. В этом случае вам не понадобится перезапускать веб-сервер для перезапуска moin.

Настройка

fastcgi.server = ( "/mywiki" =>
                       ( "localhost" =>
                         (
                           "host" => "127.0.0.1",
                           "port" => 8888,
                           "check-local" => "disable",
                           "broken-scriptfilename" => "enable",
                         )
                       )
                   )
  • (!) Вы увидите в логе ошибок lighttpd много ошибок "2005-12-02 16:30:11: (mod_fastcgi.c.2373) FastCGI-stderr:", причина которых не ясна.

Запуск экземпляра MoinMoin

Чтобы запустить экземпляр MoinMoin либо следуйте изменениям из "Запуск как отдельного приложения и/или на Windows" выше, или запустите moin.fcg, пользуясь spawn-fcgi (установлено с lighttpd).

cd /www/org.mywiki/bin
sudo -u www /usr/local/bin/spawn-fcgi -f ./moin.fcg -P moin.pid

Чтобы остановить экземпляр позже:

sudo kill `cat moin.pid`
  • (!) Запуск spawn-fcgi под root и используя -u www -g www приводит к выходу по ошибке Python ImportError, причина не ясна. sudo -u www даёт тот же эффект.

Множество процессов moin

Если вы запускаете много экземпляров moin на разных портах, lighttpd автоматически распределяет нагрузку между ними, используя все CPU.

Используйте такие настройки:

fastcgi.server             = ( "/mywiki" =>
                               ( "localhost" =>
                                 ( "host" => "127.0.0.1", 
                                   "port" => 1080,
                                   "check-local" => "disable",
                                   "broken-scriptfilename" => "enable",
                                 ),
                                 ( "host" => "127.0.0.1", 
                                   "port" => 1081, 
                                   "check-local" => "disable",
                                   "broken-scriptfilename" => "enable",
                                 ),
                               )
                             )

Скрипт для автоматического запуска MoinMoin

Вот скрипт автоматического запуска для Mac OS X, использующий систему DarwinPortsStartup. Возможно, он будет полезен и для других UNIX-подобных платформ.

# Start and stop multiple moin fast cgi instances runnings on PORTS

NAME="moin"
DIR="/www/org.mywiki/bin"
FCGIAPP="./moin.fcg"
PREFIX="/usr/local"

# List of ports to start moin instances on, separated with whitesapce
# Keep in sync with fastcgi.server in lighttpd.conf
PORTS="1080 1081"

start_on_port () {
    # Start moin instance on port, leaving pid file
    port=$1
    
    cd "${DIR}" && sudo -u www "${PREFIX}/bin/spawn-fcgi" \
        -f "${FCGIAPP}" \
        -p $port \
        -P "${NAME}-${port}.pid" \
        > /dev/null
}

kill_on_port () {
    # Try to kill process using pid in pid file, then remove the pid file
    pidFile="${DIR}/${NAME}-$1.pid"
    kill `cat "$pidFile"` && rm -f "$pidFile" > /dev/null 
}

start () {
    for port in $PORTS; do start_on_port $port; done 
}

stop () {
    for port in $PORTS; do kill_on_port $port; done
}

case "$1" in
start)
    # XXX starting twice will break pid files (bug in spawn-fcgi)
    start && echo -n " $NAME"
        ;;
stop)
        stop && echo -n " $NAME"
        ;;
restart)
    stop
    start && echo -n " $NAME"
        ;;
*)
        echo "Usage: `basename $0` {start|stop|restart}" >&2
        ;;
esac

exit 0

Добавление скрипта автоматического запуска MoinMoin на Mac OS X

При помощи этого скрипта экземпляры moin будут автоматически запускаться при загрузке.

  1. Установите drarwinports

  2. Установите пакет DarwinPortsStartup:

    sudo port install DarwinPortsStartup
  3. Скопируйте moin.sh в /opt/local/etc/rc.d:

    sudo cp moin.sh /opt/local/etc/rc.d