python web应用部署
之前代码要上线都是直接给代码打个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')
支持分享
页:
[1]