Доброго времени суток!=) Не подскажите, как связать Trac и Subversion с Tornado + Nginx. Tornado, Trac - back-end Nginx - frontend Установить - установил, а настроить - ума не хватает =( Или, если можно, в отдельную статью ее выделить. =) Видел много статей на эту тему, но вместо Tornado использовался Apache. Хотелось бы увидеть вот такую связку Trac + Nginx + Tornado + Subversion. Спасибо.

спросил May 31 '11 at 17:19

advtsk's gravatar image

advtsk
31

обновлено May 31 '11 at 17:20

Этот вопрос был закрыт по причине: "вопрос получил ответ, правильный ответ был принят"
Автор: dw
Закрыто: 10.06.2011 16:14


Разобрался!=) Для тех, кому интересно как, читать дальше. Прослойка между Trac'ом и Tornado следующая:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import signal
import fcntl
import time
from subprocess import Popen
import logging
import logging.handlers

import tornado.httpserver 
import tornado.ioloop 
import tornado.wsgi 

PORT = 8003
HOST = 'trac'
LOG_FILE = '/home/%username%/trac/projects/log/tornado/tornado.log'
LOG_LEVEL = 'INFO'

# настраиваем Trac

path_project = '/'.join(os.path.abspath(__file__).split('/')[:-1])
sys.path.insert(0, path_project)
os.environ['TRAC_ENV'] = path_project
os.environ['PYTHON_EGG_CACHE'] = os.path.join(path_project, 'eggs')
import trac.web.main
application = trac.web.main.dispatch_request

# настраиваем логирование в файл
os.chdir(os.path.dirname(os.path.abspath(__file__)))
if LOG_FILE:
    try:
        os.makedirs(os.path.split(LOG_FILE)[0])
    except OSError:
        pass
    file_handler = logging.handlers.RotatingFileHandler(
        filename = LOG_FILE, mode='a+',  # имя файла
        maxBytes = 1000000,  # максимально байт в файле
        backupCount = 2)  # максимум файлов
    file_handler.setLevel(getattr(logging, LOG_LEVEL))
    file_handler.setFormatter(
        logging.Formatter('%(asctime)s\t%(levelname)-8s %(message)s',
            datefmt = '%d-%m-%Y %H:%M:%S'))
    logging.getLogger('').setLevel(logging.NOTSET)
    logging.getLogger('').addHandler(file_handler)

# блокируемый файл для проверки активности сервера
PID_FNAME = '/tmp/' + '_'.join((os.path.abspath(__file__).strip('/').split('/'))) + '.pid'
COMMANDS = ['start', 'stop', 'restart']


def daemon():
    logging.critical('--- SERVER (RE)STARTED')
    f = open(PID_FNAME, 'w')
    fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
    f.write('%-12i' % os.getpid())
    f.flush()

    container = tornado.wsgi.WSGIContainer(application) 
    http_server = tornado.httpserver.HTTPServer(container) 
    http_server.listen(PORT) 
    tornado.ioloop.IOLoop.instance().start() 


def start():
    started = alegry_started()
    if not started:
        pid = Popen([HOST, os.path.abspath(__file__), 'daemon'],
            executable='python').pid
        print 'Server started at port %s (pid: %i)...' % (PORT, pid)
    else:
        print 'Server alegry started (pid: %i)' % started


def stop():
    started = alegry_started()
    if started:
        os.kill(started, signal.SIGKILL)
        print 'Server stoped (pid %i)' % started
    else:
        print 'Server not started'


def restart():
    stop()
    time.sleep(1)
    start()


def alegry_started():
    '''
    Если сервер запущен, возвращает pid, иначе 0
    '''
    if not os.path.exists(PID_FNAME):
        f = open(PID_FNAME, "w")
        f.write('0')
        f.flush()
        f.close()

    f = open(PID_FNAME, 'r+')
    try:
        fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
    except IOError:
        started = int(f.read())
    else:
        started = 0
    f.close()
    return started


if len(sys.argv) == 2 and sys.argv[1] in (COMMANDS + ['daemon']):
    cmd = sys.argv[1]
    globals()[cmd]()
else:
    print 'Error: invalid command'
    print 'Usage: python tornading.py {%s}.' % '|'.join(COMMANDS)

Так же приведу пример своего localtrac.ru в /etc/nginx/sites-available/:


upstream backends {
    server 127.0.0.1:8001;
    server 127.0.0.1:8003;
}

server {
    listen   80;
    server_name ChangeProject;

    access_log /home/%username%/trac/projects/log/nginx/nginx_access.log;
    error_log /home/%username%/trac/projects/log/nginx/nginx_error.log;

    location /project_two {
        proxy_pass http://127.0.0.1:8003;
        #proxy_redirect off;
        #proxy_set_header Host $host;
        #proxy_set_header X-Real-IP $remote_addr;
        #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /project_one {
        proxy_pass http://127.0.0.1:8001;
        #proxy_redirect off;
        #proxy_set_header Host $host;
        #proxy_set_header X-Real-IP $remote_addr;
        #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        root /home/adv/;
        index index.html;
    }

}

index.html самый простой для примера:

<html>
<title>
Change project
</title>
<body>
<a href="http://127.0.0.1:8001"> project_one </a>
<br>
<a href="http://127.0.0.1:8003"> project_two </a>
</body>
</html>

Установить и настроить Trac, Subversion, Nginx, Tornado не составит труда, благо статей на эти темы не мало =) Удачи!

ответил Jun 03 '11 at 15:42

advtsk's gravatar image

advtsk
31

обновлено Jun 03 '11 at 15:49