动手搭建开发网站: nginx, wiki + trac + git (二)

前一篇:动手搭建开发网站: nginx,  wiki + trac + git (一)

部署Trac

Trac部署,使用sqlite数据库,nginx收到请求后,以wsgi协议扔给uwsgi的socket,后者从线程/进程池中调出线程/进程来执行python脚本。
整个部署过程需要:
  1. 安装trac及其依赖包
  2. 配置uwsgi和nginx以导出web界面
  3. 配置一个公用的trac.ini
  4. 创建一个trac项目
  5. 开机自动运行uwsgi服务
安装
trac本身的安装避开了deb包的机制,这是因为源上的版本不够新,另外deb依赖强制引入的subversion乃至apache2依赖,令人不爽。
apt-get install python-babel python-docutils python-genshi python-imaging python-lxml python-pygments python-roman python-tz

tar xf Trac-0.12.3.tar.gz && cd Trac-0.12.3
python setup.py install

# 安装trac-accountmanager (http://trac-hacks.org/wiki/AccountManagerPlugin)插件,
# 本文写作时,trac-hacks.org不幸中箭宕机,因此我们通过其他途径来安装。
# 实践证明easy_install TracAccountManager是一种很坑爹的做法,
# 原因是装的TracAccountManager版本较老,有几个严重bugs。于是...
apt-get source trac-accountmanager
rm trac-accountmanager_*.debian.tar.gz trac-accountmanager_*.dsc
tar xf trac-accountmanager_0.2.1+r7731.orig.tar.bz2

cd trac-accountmanager_0.2.1+r7731
python setup.py install

# 下述建立的目录在后面配置中会引用到
mkdir -p /home/services/trac/web
cd /home/services/trac/web

# nginx配置中,TRAC_ENV_PARENT_DIR环境变量指向
mkdir -p projects
chown www-data.www-data projects

# 在公用trac.ini中用到,该目录用于容纳htpasswd格式的用户账号文件
mkdir -p trac.htpasswd
chown www-data.www-data trac.htpasswd

# nginx配置中,TRAC_ENV_PARENT_DIR环境变量指向
mkdir -p python-eggs
chown www-data.www-data python-eggs
安装uwsgi: 
apt-get install uwsgi-core uwsgi-plugin-python
配置url:
在原有nginx基础上,把www.example.com/trac分给 trac:
# export to web
mkdir -p /home/sites/default
ln -ds /home/services/trac/web /home/sites/default/trac
配置uwsgi:
mkdir -p /home/helpers/uwsgi
vi /home/helpers/uwsgi/uwsgi.ini
其内容为:
[uwsgi]
plugins = python

uid = www-data
chdir = /run/uwsgi-www-data

pidfile =/run/uwsgi-www-data/uwsgi.pid

chmod-socket = 666
socket = /run/uwsgi-www-data/uwsgi.sock

; 退出后删除pid和sock文件
vacuum = true
vhost = true
master = true

; 5个干活的
processes = 5

; 60秒无响应,杀掉干活的
harakiri = 60
post-buffering = 8192

single-interpreter = true

; 将uwsgi_param UWSGI_SETENV传递过来的环境变量设到os.environ中去
reload-os-env = true
更多选项解释参见: projects.unbit.it/uwsgi/wiki/Doc

配置nginx:vi /etc/nginx/sites-enabled/default

        location ~ ^/trac/[^/]+/chrome(/.*)?$ {
                alias /home/sites/default/media/trac$1;
        }

        location ~ ^/trac(/.*)?$ {
                include uwsgi_params;
                uwsgi_pass unix:///run/uwsgi-www-data/uwsgi.sock;

                # 下面两条是为了让wsgi脚本正确获得“/trac/<xxx>”中的<xxx>
                uwsgi_param SCRIPT_NAME /trac;
                uwsgi_modifier1 30;

                uwsgi_param UWSGI_SETENV PYTHON_EGG_CACHE=/home/sites/default/trac/python-eggs;
                uwsgi_param UWSGI_SETENV TRAC_ENV_PARENT_DIR=/home/sites/default/trac/projects;
                uwsgi_param UWSGI_SCRIPT trac.web.main:dispatch_request;
        }

更多uwsgi_param选项解释参见:projects.unbit.it/uwsgi/wiki/uWSGIVars

现在创建一个trac项目看看,不过在此之前先配置一个公用的trac.ini

# vi /home/services/trac/web/trac.ini

[trac]
auth_cookie_lifetime = 432000
default_charset = utf-8
genshi_cache_size = 128
show_email_addresses = true
show_ip_addresses = false
; 这个是静态文件的地址,静态文件被统一存放到了/home/sites/default/media/trac下面
htdocs_location = /media/trac/common

[notification]
admit_domains =
always_notify_owner = true
always_notify_reporter = true
always_notify_updater = true
email_sender = SendmailEmailSender
ignore_domains =
mime_encoding = base64
; 召唤mailSender.py。关于mailSender.py,参见本系列一
sendmail_path = /home/helpers/sendmail/mailSender.py
smtp_always_bcc =
smtp_always_cc =
smtp_default_domain =
smtp_enabled = true
smtp_from = trac@example.com
smtp_from_name = trac
smtp_password =
smtp_port = 25
smtp_replyto =
smtp_server =
smtp_subject_prefix = __default__
smtp_user =
ticket_subject_template = $prefix #$ticket.id: $summary
use_public_cc = false
use_short_addr = false
use_tls = false

[components]
; 使用插件accountmanager,自带登陆模块被禁用
trac.web.auth.LoginModule = disabled
acct_mgr.* = enabled
tracopt.perm.authz_policy.authzpolicy = enabled
tracopt.perm.config_perm_provider.extrapermissionsprovider = enabled
tracopt.ticket.commit_updater.committicketreferencemacro = enabled
tracopt.ticket.commit_updater.committicketupdater = enabled
tracopt.ticket.deleter.ticketdeleter = enabled

[account-manager]
; 指定用户账号文文件所在位置。注意该文件可被trac修改(例如注册新用户,故放到一个可写目录中,作为“容器”
password_store = HtPasswdStore
password_file = /home/services/trac/web/trac.htpasswd/trac.htpasswd-

[logging]
; 日志级别和输出位置
log_level = INFO
log_type = stderr

[header_logo]
alt = (please configure the [header_logo] section in trac.ini)
height = -1
link = /trac
src = /media/logo.png
width = -1

[attachment]
; 最大附件大小
max_size = 20971520
render_unsafe_content = false

[browser]
color_scale = True
downloadable_paths = /trunk, /branches/*, /tags/*
hide_properties = svk:merge
intermediate_color =
intermediate_point =
newest_color = (255, 136, 136)
oldest_color = (136, 136, 255)
oneliner_properties = trac:summary
render_unsafe_content = false
wiki_properties = trac:description
创建trac项目
cd /home/services/trac/web
sudo -u www-data PYTHON_EGG_CACHE=python-eggs trac-admin projects/demo_project initenv \
  demo sqlite:db/trac.db --inherit=`pwd`/trac.ini

Well, 真是个繁琐的命令,写个脚本放到/home/services/trac下面,后面新建项目就只要调脚本即可。好吧~这个脚本叫new_project.sh

用法:./new_project.sh <项目名> <管理员ID>

#!/bin/bash
set -e

TracBase="/home/services/trac/web"
trac_ini_g="${TracBase}/trac.ini"
trac_py_egg_cache="${TracBase}/python-eggs"

Usage="./new_project.sh <ProjectName> <AdminName>"
ProjectName="$1"
AdminName="$2"

#ProjectName_encoded="$(echo -n "$ProjectName" | base64)"
ProjectName_encoded="$ProjectName"

if [ $(id -u) -ne 0 ]; then
        echo "Please run it as root!"
fi

if [ -z "$ProjectName" -o -z "$AdminName" ]; then
        echo "$Usage"
        exit 1
fi

db="Trac_${ProjectName_encoded}"
db_user="${db}_u"
db_url="sqlite:db/trac.db"
project_dir="${TracBase}/projects/${ProjectName_encoded}"

echo sudo -u www-data PYTHON_EGG_CACHE=\"$trac_py_egg_cache\" \
        trac-admin \"$project_dir\" initenv \"$ProjectName\" \
    \"$db_url\" --inherit=\"$trac_ini_g\"

sudo -u www-data PYTHON_EGG_CACHE="$trac_py_egg_cache" \
        trac-admin "$project_dir" initenv "$ProjectName" \
         \"$db_url\" --inherit=\"$trac_ini_g\"
sudo -u www-data PYTHON_EGG_CACHE="$trac_py_egg_cache" \
        trac-admin "$project_dir" initenv "$ProjectName" \
       "$db_url" --inherit="$trac_ini_g"

trac-admin "$project_dir" permission add "$AdminName" TRAC_ADMIN
echo "Done!"

Now,试试看,能访问了www.example.com/trac了没?

service nginx restart
uwsgi --ini /home/helpers/uwsgi/uwsgi.ini

Hmm,点进去一看,css和js都找不到么,如下解决:
cd /home/media
# 通过“trac-admin ... deploy ...”的将trac静态文件都统一存放,所有项目间共享且由nginx来服务。
trac-admin /home/services/trac/web/projects/demo_project deploy trac

最后,我们让uwsgi开机自动的跑,必须的。加到/etc/rc.local:

mkdir -p /run/uwsgi-www-data
chown www-data.www-data /run/uwsgi-www-data
uwsgi --ini /home/helpers/uwsgi/uwsgi.ini &
service rc.local start即可。rc.local不支持reload,stop,通过如下命令来弥补:
uwsgi --stop /run/uwsgi-www-data/uwsgi.pid
uwsgi --reload /run/uwsgi-www-data/uwsgi.pid
rc.local将来还会放入更多的服务,不断运行service rc.local start,会造成uwsgi多个实例的出现,怒召 SingletonLauncher,这是一个确保单一实例的启动器。rc.local中命令修改如下:
mkdir -p /run/uwsgi-www-data
chown www-data.www-data /run/uwsgi-www-data
# SignletonLauncher,-n <全局唯一名>;-d 守护启动的进程 -- 非法退出时自动复活之;-N 禁用图形通知
/home/helpers/SingletonLauncher -n uwsgi-www-data -dN uwsgi --ini /home/helpers/uwsgi/uwsgi.ini &


下一篇:动手搭建开发网站: nginx, wiki + trac + git (三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值