前一篇:动手搭建开发网站: nginx, wiki + trac + git (一)
部署Trac
Trac部署,使用sqlite数据库,nginx收到请求后,以wsgi协议扔给uwsgi的socket,后者从线程/进程池中调出线程/进程来执行python脚本。
整个部署过程需要:
- 安装trac及其依赖包
- 配置uwsgi和nginx以导出web界面
- 配置一个公用的trac.ini
- 创建一个trac项目
- 开机自动运行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
其内容为:更多选项解释参见: projects.unbit.it/uwsgi/wiki/Doc[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
配置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项目:[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
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了没?
Hmm,点进去一看,css和js都找不到么,如下解决:service nginx restart uwsgi --ini /home/helpers/uwsgi/uwsgi.ini
cd /home/media # 通过“trac-admin ... deploy ...”的将trac静态文件都统一存放,所有项目间共享且由nginx来服务。 trac-admin /home/services/trac/web/projects/demo_project deploy trac
最后,我们让uwsgi开机自动的跑,必须的。加到/etc/rc.local:
service rc.local start即可。rc.local不支持reload,stop,通过如下命令来弥补:mkdir -p /run/uwsgi-www-data chown www-data.www-data /run/uwsgi-www-data uwsgi --ini /home/helpers/uwsgi/uwsgi.ini &
rc.local将来还会放入更多的服务,不断运行service rc.local start,会造成uwsgi多个实例的出现,怒召 SingletonLauncher,这是一个确保单一实例的启动器。rc.local中命令修改如下:uwsgi --stop /run/uwsgi-www-data/uwsgi.pid uwsgi --reload /run/uwsgi-www-data/uwsgi.pid
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 &