##在这里详述 NginxuWSGIPublishTrac。 ##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 <> = Nginx8.x+uWSGI驱动 Trac = 环境: `CentOS 5.5 + Python2.6 + Nginx 0.8.54 + KTRAC 1.0(基于trac 0.11)` ##startInc == 愿望 == 使用 `Nginx+uWSGI` 高效发布 思路:: 1. 安装 uWSGI 服务器 1. 用 uWSGI 带动 KTRAC 运行 1. 通过 Nginx 的mod_uwsgi 发布 === 安装 uWSGI === {{{ # cd /data/app/_src # wget http://projects.unbit.it/downloads/uwsgi-0.9.6.5.tar.gz # tar xzvf... # cd uwsgi-0.9.6.5 # make *** uWSGI linking *** gcc -pthread -o uwsgi utils.o pyutils.o protocol.o socket.o logging.o wsgi_handlers.o wsgi_headers.o uwsgi_handlers.o plugins.o main.o uwsgi_pymodule.o async.o nagios.o ini.o proxy.o http.o snmp.o sendfile.o xmlconf.o spooler.o -lpthread -rdynamic -lpthread -ldl -lutil -lm -lpython2.6 -L/usr/local/lib -lxml2 -lz -liconv -lm *** uWSGI is ready, launch it with ./uwsgi *** # cp uwsgi /usr/sbin/ }}} === 运行 uWSGI === 1. 通过 trac-admin 工具生成 wsgi发布脚本 {{{ # trac-admin /data/app/tracs/trac deploy /data/app/tracs/ }}} * 生成 `/data/app/tracs/cgi-bin` 目录 * 其中的 `trac.wsgi` 就是发布脚本 1. 生成所有依赖目录信息: {{{ # python Python 2.6.6 (r266:84292, Dec 1 2010, 23:08:07) [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> for i in sys.path: ... print "pythonpath=%s"%i ... pythonpath=/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/flup-1.0.3.dev_20100525-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/docutils-0.7-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/epydoc-3.0.1-py2.6.egg ... }}} 1. 编写 uWSGI 配置文件 `vi /data/app/tracs/cgi-bin/uwsgi.ini`:{{{ [uwsgi] uid=www gid=www socket=/usr/local/nginx/tmp/uwsgi_temp/trac.sock processes=5 pidfile=/usr/local/nginx/run/trac.uwsgi.pid wsgi-file=/data/codeijinshan/tracs/cgi-bin/trac.wsgi chmod-socket=666 harakiri=30 disable-logging=true master=true memory-report=true profiler=true single-interpreter=true pythonpath=/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/flup-1.0.3.dev_20100525-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/docutils-0.7-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/epydoc-3.0.1-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/Pygments-1.3.1-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/pytz-2010o-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/simplejson-2.1.2-py2.6-linux-i686.egg pythonpath=/usr/lib/python2.6/site-packages/Genshi-0.6dev-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/Babel-1.0dev-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/Trac-0.12dev-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/psycopg2-2.3.0-py2.6-linux-i686.egg pythonpath=/usr/lib/python2.6/site-packages/chardet-1.0.1-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/supervisor-3.0a9-py2.6.egg pythonpath=/usr/lib/python2.6/site-packages/meld3-0.6.7-py2.6.egg pythonpath=/usr/lib/python26.zip pythonpath=/usr/lib/python2.6 pythonpath=/usr/lib/python2.6/plat-linux2 pythonpath=/usr/lib/python2.6/lib-tk pythonpath=/usr/lib/python2.6/lib-old pythonpath=/usr/lib/python2.6/lib-dynload pythonpath=/usr/lib/python2.6/site-packages }}} * `注意!` 所有 `pythonpath=` 使用前述Py 交互环境的输出,以免Python 安装时的目录混乱,引发uWSGI 运行失败! 1. 运行 uWSGI 守护:{{{ # /usr/sbin/uwsgi --ini /data/app/tracs/cgi-bin/uwsgi.ini -d /usr/local/nginx/log/uwsgi.log }}} * 可以直接观察运行日志来确认是否正常:{{{ # tail -f /usr/local/nginx/log/uwsgi.log added /usr/lib/python2.6/site-packages to pythonpath. initializing hooks...done. application 0 () ready setting default application to 0 spawned uWSGI master process (pid: 18956) spawned uWSGI worker 1 (pid: 18957) spawned uWSGI worker 2 (pid: 18958) spawned uWSGI worker 3 (pid: 18959) spawned uWSGI worker 4 (pid: 18960) spawned uWSGI worker 5 (pid: 18961) ... }}} === 用Nginx 发布 === 1. 配置`/usr/local/nginx/conf/nginx.conf` {{{ server { listen 80; ... location /trac { include uwsgi_params; uwsgi_pass unix:///usr/local/nginx/tmp/uwsgi_temp/trac.sock; # 确保以 http://foo.urs.org/trac 形式发布正常 uwsgi_param SCRIPT_NAME /trac; uwsgi_modifier1 30; } ... }}} 1. 测试配置:{{{ # /usr/local/nginx/sbin/nginx -t the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful }}} 1. 发布KTRAC:{{{ # kill -HUP `cat /usr/local/nginx/run/nginx.pid` }}} == TODO == === :静态发布 === `但是,不论用什么正式发布Trac,运营时,都会发现80%的计算和流量都是静态样式文件的动态输出!` 所以,建议将主要的几个静态文件目录直接发布 {{{ location /trac/chrome { alias /path/2/htdocs/; autoindex on; } location /trac/raw-attachment { alias /path/2/attachments/; #autoindex on; } location /trac/pygments { alias /path/2/pygments; autoindex on; } }}} === :Supervisor 管理 === [[http://supervisord.org/index.html|Supervisor: A Process Control System — supervisor v3.0a9 documentation]] * 使用 Supervisor 可以统一管理所有 WSGI/FCGI/SCGI 动态应用的进程! ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]