Nginx8.x+uWSGI驱动 Trac
环境: CentOS 5.5 + Python2.6 + Nginx 0.8.54 + KTRAC 1.0(基于trac 0.11)
愿望
使用 Nginx+uWSGI 高效发布
- 思路
- 安装 uWSGI 服务器
- 用 uWSGI 带动 KTRAC 运行
- 通过 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
通过 trac-admin 工具生成 wsgi发布脚本
# trac-admin /data/app/tracs/trac deploy /data/app/tracs/
生成 /data/app/tracs/cgi-bin 目录
其中的 trac.wsgi 就是发布脚本
生成所有依赖目录信息:
# 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 ...
编写 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 运行失败!
运行 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 发布
配置/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; } ...
测试配置:
# /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
发布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 管理
Supervisor: A Process Control System — supervisor v3.0a9 documentation
- 使用 Supervisor 可以统一管理所有 WSGI/FCGI/SCGI 动态应用的进程!
反馈
创建 by -- ZoomQuiet [2011-01-07 06:57:25]