Один из вариантов настройки SCM TRAC под вебсервером Nginx на Linux. Не единственно верный и возможно не самый правильный способ. Но быстрый и главное работающий
Во многих дистрибутивах линукса 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. Для запуска через сокет создаём следующий скрипт:
#
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. В другом дистре делайте по аналогии:
# 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:
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 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/
Его я нашёл уже после настройки описанным выше способом, но попробовать интересно.
Комментарии
Пытался я как-то trac настроить, но не вышло. Спасибо.
Я описал не самый простой способ. В Debian, Ubuntu, Gentoo из пакета Trac ставится с готовым скриптом запуска демона tracd - его можно стартовать и перенаправить к нему обращения с вебсервера (это делается модулем mod_proxy в Apache или через proxy_pass в Nginx). Вот здесь это описано подробно: http://trac.edgewall.org/wiki/TracNginxRecipe