之前代码要上线都是直接给代码打个tar包 然后丢到服务器上解压 touch一下uwsgi_reload文件 重新加载新的代码 这样的部署上线方式很简单 但是比较难控制 发布流程更加谈不上自动化 所以 最近改用另一种方式: 使用uwsgi + virtualenv + fabric + distribute 来发布应用 我们现在服务器上安装了Python2.7 这个是自己打的RPM包 便于管理 之前有过想用RPM + Puppet的方式来完成部署 但是推了一段时间后 就没啥后劲了 现在内部开发服务器上有一些是用Puppet来管理的 比较Nginx Php环境 Keepalived等 用起来也还算方便 但是用在Python应用上还是太重了 Python有Pip何不用它来管理呢 服务器上安装了Python环境,在预定的目录下安装了virtualenv 配置文件的存放地点也是实现预定的 使用uwsgi的来处在于部署方便 配置简单 还有touch reload这个牛X的功能 使用distribute可以把需要的依赖包写在setup.py文件里 加上MANIFEST.in可以很好地管理自己的应用 在安装的时候指定virtualenv中的pip来安装 这样不会把系统环境给捣乱 fabric 定义好自己需要的命令后 发布就是很顺畅了 下面这个是代码(从flask里面拽出来的): - from fabric.api import *
- # the user to use for the remote commands
- env.user = 'root'
- # the servers where the commands are executed
- env.hosts = ['xxx.example.com',]
- def pack():
- # create a new source distribution as tarball
- local('rm -rf dist/*')
- local('python setup.py sdist --formats=gztar', capture=False)
- def deploy():
- # figure out the release name and version
- dist = local('python setup.py --fullname', capture=True).strip()
- # upload the source tarball to the temporary folder on the server
- package_name = '%s.tar.gz' % dist
- put('dist/%s' % package_name, '/tmp/%s' % package_name)
- # /web is a virtualenv container
- with cd('/web/'):
- run('/web/bin/pip install /tmp/%s' % package_name)
- # now that all is set up, delete the folder again
- run('rm -rf /tmp/%s' % package_name)
- # and finally touch the .wsgi file so that mod_wsgi triggers
- # a reload of the application
- run('touch /web/configs/uwsgi_reload.txt')
- run('tail -f /tmp/uwsgi.log')
复制代码
|