
安装virtualenv
看到别人布署bottle都是配合virtualenv来的,看了一下virtualenv的介绍,确实比较有用,它可以为你的应用创建一个独立的Python环境,这样如果你布署了几个Python应用,就不需要担心它们各自需要的依赖文件版本不同,甚至它们需要的Python版本也不同。
virtualenv官方建使用 pip-1.3以上版本安装,所以先安装一个pip(当然你也可以直接从源码安装):
wget http://peak.telecommunity.com/dist/ez_setup.py> 
python ez_setup.py> 
easy_install pip> 
pip install virtualenv
virtualenv会把所有依赖包安装在一个独立的环境下,所以你需要先建立一个给它专用的目录:
mkdir venv
针对你目前要布置的Python应用,建立一个新的环境目录:
virtualenv venv/bottle
激活:
     [www@HJY-SERVER ~]$ source ./venv/bottle/bin/activate>
     (bottle)[www@HJY-SERVER ~]$
激活后你可以看到上面的Shell提示符前面有了你当前环境名称“bottle”。
安装bottle:
(bottle)[www@HJY-SERVER ~]$ pip install bottle> 
Downloading/unpacking bottle> 
  Downloading bottle-0.11.6.tar.gz (60kB): 60kB downloaded> 
  Running setup.py egg_info for package bottle> 
Installing collected packages: bottle> 
  Running setup.py install for bottle> 
    changing mode of build/scripts-2.6/bottle.py from 664 to 775> 
    changing mode of /home/www/venv/bottle/bin/bottle.py to 775> 
Successfully installed bottle> 
Cleaning up...
安装uWSGI:
wget http://projects.unbit.it/downloads/uwsgi-1.4.9.tar.gz> 
tar zxvf uwsgi-1.4.9.tar.gz> 
cd ../uwsgi-1.4.9.tar.gz> 
make
如果遇到一大片的错误位置在pythong_plugin.c ,那么应该是缺少python-devel包,用yum安装一下:
plugins/python/python_plugin.c:1871: error: statement with no effect> 
yum install python-devel
编译完成后配置:
mkdir opt/uwsgi> 
cp uwsgi /opt/uwsgi/> 
touch /opt/uwsgi/bottle.xml> 
mkdir /home/www/html/cgi/
写一个测试页面:
cat >> /home/www/html/cgi/index.py
from bottle import route, run, default_app
@route('/')
def index():
 return "hello world"
if __name__ == "__main__":
 run(host="localhost", port=8888)
else:
 application = default_app()
uwsgi启动参数配置脚本:
[root@HJY-SERVER ~]# cat /opt/uwsgi/bottle.ini> 
[uwsgi]> 
socket=/opt/uwsgi/run/bottle.sock> 
daemonize=/opt/uwsgi/run/bottle.log> 
pidfile=/opt/uwsgi/run/bottle.pid> 
gid=www> 
uid=www> 
virtualenv=/home/www/venv/bottle> 
chdir=/home/www/html/cgi> 
module=index> 
master=True> 
processes=4> 
max-requests=5000
uWSGI没有自带的启动脚本,我这里从nginx的启动脚本改了一个过来:
#!/bin/sh
#
# uwsgi        Startup script for uwsgi
#
# chkconfig: - 85 15
# processname: uwsgi
# config: /etc/uwsgi/uwsgi.conf
# config: /etc/sysconfig/uwsgi
# pidfile: /var/run/uwsgi.pid
#
### BEGIN INIT INFO
# Provides: uwsgi
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop uwsgi
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
UWSGI=/opt/uwsgi/uwsgi
CONFFILE=/opt/uwsgi/bottle.ini
#CONFFILE=/opt/uwsgi/bottle.xml
prog=uwsgi
uwsgi=${UWSGI}
conffile=${CONFFILE}
lockfile=/opt/uwsgi/run/bottle.lck
pidfile=/opt/uwsgi/run/bottle.pid
logfile=/opt/uwsgi/run/bottle.log
SLEEPMSEC=100000
RETVAL=0
start() {
    echo -n $"Starting $prog: "
    ${uwsgi} --ini ${conffile}
    #daemon --pidfile=${pidfile} ${uwsgi} -x ${conffile} -d ${logfile}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}
stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} ${prog}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    killproc -p ${pidfile} ${prog} -HUP
    RETVAL=$?
    echo
}
upgrade() {
    oldbinpidfile=${pidfile}.oldbin
    configtest -q || return 6
    echo -n $"Staring new master $prog: "
    killproc -p ${pidfile} ${prog} -USR2
    RETVAL=$?
    echo
    /bin/usleep $SLEEPMSEC
    if [ -f ${oldbinpidfile} -a -f ${pidfile} ]; then
        echo -n $"Graceful shutdown of old $prog: "
        killproc -p ${oldbinpidfile} ${prog} -QUIT
        RETVAL=$?
        echo
    else
        echo $"Upgrade failed!"
        return 1
    fi
}
configtest() {
    if [ "$#" -ne 0 ] ; then
        case "$1" in
            -q)
                FLAG=$1
                ;;
            *)
                ;;
        esac
        shift
    fi
    ${uwsgi} -t -c ${conffile} $FLAG
    RETVAL=$?
    return $RETVAL
}
rh_status() {
    status -p ${pidfile} ${uwsgi}
}
# See how we were called.
case "$1" in
    start)
        rh_status >/dev/null 2>&1 && exit 0
        start
        ;;
    stop)
        stop
        ;;
    status)
        rh_status
        RETVAL=$?
        ;;
    restart)
        configtest -q || exit $RETVAL
        stop
        start
        ;;
    upgrade)
        upgrade
        ;;
    condrestart|try-restart)
        if rh_status >/dev/null 2>&1; then
            stop
            start
        fi
        ;;
    force-reload|reload)
        reload
        ;;
    configtest)
        configtest
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-re                                                                             load|upgrade|reload|status|help|configtest}"
        RETVAL=2
esac
exit $RETVAL
把uWSGI加入系统自启动脚本中:
[root@HJY-SERVER ~]# chkconfig --add uwsgi> 
[root@HJY-SERVER ~]# chkconfig --level 345 uwsgi on> 
[root@HJY-SERVER ~]# service uwsgi status
修改nginx.conf文件,支持不同端口的虚拟主机,一个80端口用来支持PHP,一个8051端口支持uWSGI:
user  www www;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       8051;
        server_name  localhost;
                root   /home/www/html/cgi;
        location / {
                        include uwsgi_params;
                        uwsgi_pass unix:///opt/uwsgi/run/bottle.sock;
        }
        }
    server {
        listen       80;
        server_name  localhost;
                root   /home/www/html;
                location ~ .*.(php|php5)?$
                {
                        fastcgi_pass 127.0.0.1:9000;
                        fastcgi_index index.php;
                        include fastcgi.conf;
                }
    }
}
参考文章:
http://www.liuts.com/post/216/
http://jinghong.iteye.com/blog/1283984
http://www.actkr.com/?p=791#sthash.gMK8MScq.3f8JF7RD.dpbs
Comments
kongove: 最近博客很活跃呀,还改版了。
