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

来源:互联网 发布:linux安装yum命令 编辑:程序博客网 时间:2024/05/23 20:26

前一篇:动手搭建开发网站: 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-tztar xf Trac-0.12.3.tar.gz && cd Trac-0.12.3python setup.py install# 安装trac-accountmanager (http://trac-hacks.org/wiki/AccountManagerPlugin)插件,# 本文写作时,trac-hacks.org不幸中箭宕机,因此我们通过其他途径来安装。# 实践证明easy_install TracAccountManager是一种很坑爹的做法,# 原因是装的TracAccountManager版本较老,有几个严重bugs。于是...apt-get source trac-accountmanagerrm trac-accountmanager_*.debian.tar.gz trac-accountmanager_*.dsctar xf trac-accountmanager_0.2.1+r7731.orig.tar.bz2cd trac-accountmanager_0.2.1+r7731python setup.py install# 下述建立的目录在后面配置中会引用到mkdir -p /home/services/trac/webcd /home/services/trac/web# nginx配置中,TRAC_ENV_PARENT_DIR环境变量指向mkdir -p projectschown www-data.www-data projects# 在公用trac.ini中用到,该目录用于容纳htpasswd格式的用户账号文件mkdir -p trac.htpasswdchown www-data.www-data trac.htpasswd# nginx配置中,TRAC_ENV_PARENT_DIR环境变量指向mkdir -p python-eggschown www-data.www-data python-eggs
安装uwsgi: 
apt-get install uwsgi-core uwsgi-plugin-python
配置url:
在原有nginx基础上,把www.example.com/trac分给 trac:
# export to webmkdir -p /home/sites/defaultln -ds /home/services/trac/web /home/sites/default/trac
配置uwsgi:
mkdir -p /home/helpers/uwsgivi /home/helpers/uwsgi/uwsgi.ini
其内容为:
[uwsgi]plugins = pythonuid = www-datachdir = /run/uwsgi-www-datapidfile =/run/uwsgi-www-data/uwsgi.pidchmod-socket = 666socket = /run/uwsgi-www-data/uwsgi.sock; 退出后删除pid和sock文件vacuum = truevhost = truemaster = true; 5个干活的processes = 5; 60秒无响应,杀掉干活的harakiri = 60post-buffering = 8192single-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 = 432000default_charset = utf-8genshi_cache_size = 128show_email_addresses = trueshow_ip_addresses = false; 这个是静态文件的地址,静态文件被统一存放到了/home/sites/default/media/trac下面htdocs_location = /media/trac/common[notification]admit_domains =always_notify_owner = truealways_notify_reporter = truealways_notify_updater = trueemail_sender = SendmailEmailSenderignore_domains =mime_encoding = base64; 召唤mailSender.py。关于mailSender.py,参见本系列一sendmail_path = /home/helpers/sendmail/mailSender.pysmtp_always_bcc =smtp_always_cc =smtp_default_domain =smtp_enabled = truesmtp_from = trac@example.comsmtp_from_name = tracsmtp_password =smtp_port = 25smtp_replyto =smtp_server =smtp_subject_prefix = __default__smtp_user =ticket_subject_template = $prefix #$ticket.id: $summaryuse_public_cc = falseuse_short_addr = falseuse_tls = false[components]; 使用插件accountmanager,自带登陆模块被禁用trac.web.auth.LoginModule = disabledacct_mgr.* = enabledtracopt.perm.authz_policy.authzpolicy = enabledtracopt.perm.config_perm_provider.extrapermissionsprovider = enabledtracopt.ticket.commit_updater.committicketreferencemacro = enabledtracopt.ticket.commit_updater.committicketupdater = enabledtracopt.ticket.deleter.ticketdeleter = enabled[account-manager]; 指定用户账号文文件所在位置。注意该文件可被trac修改(例如注册新用户,故放到一个可写目录中,作为“容器”password_store = HtPasswdStorepassword_file = /home/services/trac/web/trac.htpasswd/trac.htpasswd-[logging]; 日志级别和输出位置log_level = INFOlog_type = stderr[header_logo]alt = (please configure the [header_logo] section in trac.ini)height = -1link = /tracsrc = /media/logo.pngwidth = -1[attachment]; 最大附件大小max_size = 20971520render_unsafe_content = false[browser]color_scale = Truedownloadable_paths = /trunk, /branches/*, /tags/*hide_properties = svk:mergeintermediate_color =intermediate_point =newest_color = (255, 136, 136)oldest_color = (136, 136, 255)oneliner_properties = trac:summaryrender_unsafe_content = falsewiki_properties = trac:description
创建trac项目
cd /home/services/trac/websudo -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/bashset -eTracBase="/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!"fiif [ -z "$ProjectName" -o -z "$AdminName" ]; then        echo "$Usage"        exit 1fidb="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_ADMINecho "Done!"

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

service nginx restartuwsgi --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-datachown www-data.www-data /run/uwsgi-www-datauwsgi --ini /home/helpers/uwsgi/uwsgi.ini &
service rc.local start即可。rc.local不支持reload,stop,通过如下命令来弥补:
uwsgi --stop /run/uwsgi-www-data/uwsgi.piduwsgi --reload /run/uwsgi-www-data/uwsgi.pid
rc.local将来还会放入更多的服务,不断运行service rc.local start,会造成uwsgi多个实例的出现,怒召SingletonLauncher,这是一个确保单一实例的启动器。rc.local中命令修改如下:
mkdir -p /run/uwsgi-www-datachown 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 (三)

原创粉丝点击