SAME: NginxuWSGIPublishTrac

Nginx8.x+uWSGI驱动 Trac

环境: CentOS 5.5 + Python2.6 + Nginx 0.8.54 + KTRAC 1.0(基于trac 0.11)

愿望

使用 Nginx+uWSGI 高效发布

思路
  1. 安装 uWSGI 服务器
  2. 用 uWSGI 带动 KTRAC 运行
  3. 通过 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 就是发布脚本

  2. 生成所有依赖目录信息:

    # 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
    ...
  3. 编写 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 运行失败!

  4. 运行 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;
            }
    ...
  2. 测试配置:

    # /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
  3. 发布KTRAC:

    # kill -HUP `cat /usr/local/nginx/run/nginx.pid`

TODO:Supervisor 管理

Supervisor: A Process Control System — supervisor v3.0a9 documentation


反馈

创建 by -- ZoomQuiet [2011-01-07 06:57:25]

MiscItems/2010-12-16 (last edited 2011-01-07 07:02:07 by ZoomQuiet)