Настройка TRAC под Nginx (WSGI через FastCGI)

Главные вкладки

Аватар пользователя axel axel 3 ноября 2007 в 14:50

Один из вариантов настройки SCM TRAC под вебсервером Nginx на Linux. Не единственно верный и возможно не самый правильный способ. Но быстрый и главное работающий Smile

Во многих дистрибутивах линукса TRAC и Nginx имеются в пакетах. Я ставил их на Debian и Gentoo. Если нет готового пакета в дистрибутиве - пройтись по ссылкам выше и установить из исходников. Установку Nginx опишу как-нибудь отдельно, пока конфиг для Trac.

TRAC написан на питоне и предлагает несколько способов для запуска: CGI, FastCGI, Apache+mod_python, WSGI. Я предпочёл последний способ. Он также допускает вариации. Наиболее быстрой мне видится работа через unix socket. К сожалению готовых скриптов на этот случай в Debian и Gentoo не нашлось. В Gentoo предлагается скрипт для запуска демона tracd, слушающего заданный порт по http. Т.е. по сути в этом случае TRAC становится сам себе вебсервером, а Nginx выполняет роль обратного прокси. Руководство на сайте TRAC предлагает этот же путь.

Итак полагаем, что в системе уже установлены интерпретатор питона >= 2.4, nginx, trac > 0.10. Для запуска через сокет создаём следующий скрипт:

#!/usr/bin/env python
#

from trac.web.main import dispatch_request
from trac.web._fcgi import WSGIServer

WSGIServer(dispatch_request,
           bindAddress='/dev/shm/trac-fcgi.sock',
           ).run()

Адрес сокета может быть и другим, например /tmp/trac-fcgi.sock. Кладем скрипт в /usr/local/bin и делаем исполняемым.

Далее в стартовых скриптах системы (см. руководство по стартовым скриптам своего дистрибутива) создаём скрипт запуска trac как демона, но без помощи tracd. Скрипты разнятся для разных дистрибутивов, привожу пример для Gentoo. В другом дистре делайте по аналогии:

#!/sbin/runscript
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License, v2 or later

FCGI=/usr/local/bin/trac.fcgi
SOCK=/dev/shm/trac-fcgi.sock

depend() {
        need net
}

start() {
        ebegin "Starting trac.fcgi"
        env TRAC_ENV_PARENT_DIR=/var/lib/trac \
        start-stop-daemon --start --pidfile /var/run/trac.pid \
                --chuid ${TRAC_USER:-apache}:${TRAC_GROUP:-apache} \
                --make-pidfile --background --exec $FCGI
        eend $?
}

stop() {
        ebegin "Stopping trac.fcgi"
        start-stop-daemon --stop --pidfile /var/run/trac.pid
        rm -f $SOCK
        eend $?
}

Можно заметить, что демон по дефолту будет работать под юзером apache. Поправьте скрипт или задайте переменные TRAC_USER, TRAC_GROUP для смены этого поведения. Предполагается, что проекты TRAC располагаются под /var/lib/trac. Скрипт помещаем в /etc/init.d/ или другое место для скриптов запуска в вашем дистре, не забыв сделать исполняемым.

Теперь создаём конфиг виртуального хоста для nginx:

    server {
        listen       192.168.1.1:80;  # Replace this IP and port with the right ones for your requirements
        server_name  trac.example.com;  # Multiple hostnames seperated by spaces.  Replace these as well.

        charset utf8;

        root   /var/www/trac/htdocs/;
        access_log /var/www/trac/log/access_log;
        error_log /var/www/trac/log/access_log info;

        location ~ /(.*?)/chrome/site/ {
          rewrite /(.*?)/chrome/site/(.*) /$1/htdocs/$2 break;
          root    /var/lib/trac;
        }

        # pass to tracd
        location /login {
            auth_basic            "Access restricted area.";
            auth_basic_user_file  /var/lib/trac/htpasswd;

            fastcgi_pass    unix:/dev/shm/trac-fcgi.sock;
            fastcgi_intercept_errors    off;
            include /etc/nginx/fastcgi_params;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_param SCRIPT_NAME "";
            fastcgi_param AUTH_USER $remote_user;
            fastcgi_param REMOTE_USER $remote_user;
            fastcgi_param TRAC_ENV_PARENT_DIR /var/lib/trac;
        }
        location / {
            fastcgi_pass    unix:/dev/shm/trac-fcgi.sock;
            fastcgi_intercept_errors    off;
            include /etc/nginx/fastcgi_params;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_param SCRIPT_NAME "";
            fastcgi_param TRAC_ENV_PARENT_DIR /var/lib/trac;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
            deny  all;
        }

     }

В конфиге следует заменить IP на внешний адрес, который будет прослушиваться Nginx, Пароли для TRAC в данной схеме хранятся в /var/lib/trac/htpasswd и могут заводиться апачевской утилитой htpasswd. Виртуальный хост располагается в /var/www/trac, что также можно изменить на свой вкус и в соответствии с рекомендациями к своему дистрибутиву. В /etc/nginx/fastcgi_params хранятся дефолтные параметры для fastcgi, на всякий случай цитирую этот файл, хотя он помнится идёт в комплекте с Nginx:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  REMOTE_USER        $remote_user;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Собственно всё. Стартовав /etc/init.d/trac.fcgi start и перегрузив конфиг вебсвервера /etc/init.d/nginx reload можем обращаться к нашему TRAC. В TRAC разумеется предварительно следует определить хотя бы один проект, с помощью trac-admin. Но настройка самого TRAC это тоже отдельная тема.

Документы на базе которых разбирался с конфигом:
http://trac.edgewall.org/wiki/TracNginxRecipe
http://www.mail-archive.com/trac-users@googlegroups.com/msg06842.html

Также интересен в данном контексте новый модуль mod_wsgi для nginx:
http://hg.mperillo.ath.cx/nginx/mod_wsgi/

Его я нашёл уже после настройки описанным выше способом, но попробовать интересно.

Комментарии

Аватар пользователя axel axel 12 ноября 2007 в 12:49

Я описал не самый простой способ. В Debian, Ubuntu, Gentoo из пакета Trac ставится с готовым скриптом запуска демона tracd - его можно стартовать и перенаправить к нему обращения с вебсервера (это делается модулем mod_proxy в Apache или через proxy_pass в Nginx). Вот здесь это описано подробно: http://trac.edgewall.org/wiki/TracNginxRecipe