测试积点老人 发表于 2018-12-17 16:00:21

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')

Miss_love 发表于 2021-1-5 17:00:06

支持分享
页: [1]
查看完整版本: python web应用部署