Перенос Trac на Nginx и tracd
Я когда-то написал статью Установка и настройка Trac на FreeBSD, теперь пришло время отказываться от Apache, в пользу Nginx+PHP/FastCGI и необходимо куда-то пересаживать Trac.
Есть несколько способов помимо mod_python, я выбрал использование tracd (веб-сервер самого трака). Но если в какой-то момент времени я пойму что этот способ мне не нравится, я обязательно напишу статью про связку через FastCGI.
Tracd
Поднимаем tracd так:
tracd --daemonize --pidfile=/var/run/trac/tracd.3050 --port=3050 --protocol=http --env-parent-dir=/var/trac \ --basic-auth=project1,/var/svn/svn-auth-file,svn --basic-auth=project2,/var/svn/svn-auth-file,svn
Где,
- --daemonize - запуск tracd в фоне как демона;
- --pidfile - путь до pid-файла;
- --port - tcp-порт, который будет слушать;
- --protocol - протокол (Варианты: http, scgi, ajp. В нашем случае http);
- --env-parent-dir - мульти-проектовый режим, надо указать родительский каталог проектов (Еще есть "--single-env", это сингл-режим и надо указывать полный путь до проекта);
- --basic-auth - авторизация (Формат "projectdir,htpasswd_file,realm", если юзаете --env-parent-dir, то можете только каталог проекта указывать в "projectdir", а не полный путь).
Наберите "--help" и почитайте справку по всем опциям.
Nginx
Теперь добавим в Nginx новый бекенд:
upstream trac { server 127.0.0.1:3050; }
И перепишем конфиг хоста:
server { listen 80; server_name trac.example.com; location / { #auth_basic "Password, please!"; #auth_basic_user_file /var/svn/svn-auth-file; proxy_pass proxy_set_header Host $host; } }
Ну вот и все, осталось ребутнуть nginx
/usr/local/etc/rc.d/nginx restart
Скрипт управления нашим траком
Ну в довесок сделаем скрипт по управлению tracd:
#!/bin/sh TRACD="/usr/local/bin/tracd" TRAC="/var/trac" USER="www" PIDFILE="/var/run/trac/tracd.3050" PORT="3050" PYTHON_EGG_CACHE="/tmp/egg_cache" start() { export PYTHON_EGG_CACHE su $USER -c "$TRACD --daemonize --pidfile=$PIDFILE --port=$PORT --protocol=http --env-parent-dir=$TRAC \ --basic-auth=project1,/var/svn/svn-auth-file,svn --basic-auth=project2,/var/svn/svn-auth-file,svn" } stop() { su $USER -c "kill `cat $PIDFILE`" } restart() { stop sleep 1 start } $1
Так как мы будем запускать от имени www, то нам надо для каталога /var/run/trac/ указать права на запись.
Сохраним скрипт в файле "/usr/local/etc/rc.d/tracd" и запустим:
/usr/local/etc/rc.d/tracd start
Если вы увидели ошибку "This account is currently not available.", то вам надо для пользователя от которого вы запускаете tracd установить шелл. Делается черезchsh имя_пользователя

Комментарии
Есть ли возможность запускать "сайты" под разными учетками? Я бы предпочел чтобы trac крутился под отдельным аккаунтом
это решает проблему )
можно писать это в секции сервер?
туплю, сорри
У меня не прокатывает через su почему-то. Шелл у указуемого юзера есть.
если убрать ключ daemonize то через su запускается, но это же не метод :( гемор какой-то
А что за ОС? Какая версия?
Debian 5. Trac 0.11. подставляю в su имя хозяина траковского проекта, он же хозяин базы svn. шелл этому пользователю разрешён. и нифига!
сейчас у меня нет доступа к ssh, дома еще на 10 раз перепроверю все права, а то грызут смутные сомнения…
Как вариант дай мне доступ по ssh, рутовый - я помогу разобраться
ок, как доберусь до пароля — вышлю жабером. спасибо!
Готово, теперь работает с --daemonize. Я юзеру поставил шелл через chsh (шелл: /bin/bash) и заработало, еще там путь был неверный до пароле, но видимо ты просто забыл его сменить, так как в своей строке у тебя был нормальный. Ну еще для stop() прикрутил запуск от того же юзера что и start().
Забыл скачать, что --daemonize не запускался, так как прав небыло у пользователя на PIDFILE
Адво, я восхищаюсь тобой!
Да ладно, что такого, я всегда помогу другу! :)
а как указать что-то вроде Listen 127.0.0.1:3050, чтобы только через nginx была возможность обратиться к траку?
Я же написал в статье :)
моё чсв уже близко к нулю, но я не вижу в статье как запретить обращение напрямую к 3050 мимо нгинкса
http://trac.mysite.com/test/ - работает через nginx на порту 80
http://trac.mysite.com:3050/test/ - тоже работает, напрямую.
Я блокирую через ipfw, тебе видимо надо через iptables
На работу через tracd все-таки нету нареканий, он норм справляется?
Нету, все прекрасно работает :)
А какие плюсы у этой связки перед простым tracd, без отдельного веб-сервера? Работает стабильно, для корпоративного трекера должно хватить.
Никаких
Оставьте свой комментарий