51Testing软件测试论坛

标题: python web应用部署 [打印本页]

作者: 测试积点老人    时间: 2018-12-17 16:00
标题: 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里面拽出来的):

  1. from fabric.api import *

  2. # the user to use for the remote commands
  3. env.user = 'root'
  4. # the servers where the commands are executed
  5. env.hosts = ['xxx.example.com',]

  6. def pack():
  7.     # create a new source distribution as tarball
  8.     local('rm -rf dist/*')
  9.     local('python setup.py sdist --formats=gztar', capture=False)

  10. def deploy():
  11.     # figure out the release name and version
  12.     dist = local('python setup.py --fullname', capture=True).strip()

  13.     # upload the source tarball to the temporary folder on the server
  14.     package_name = '%s.tar.gz' % dist
  15.     put('dist/%s' % package_name, '/tmp/%s' % package_name)

  16.     # /web is a virtualenv container
  17.     with cd('/web/'):
  18.         run('/web/bin/pip install /tmp/%s' % package_name)

  19.         # now that all is set up, delete the folder again
  20.         run('rm -rf /tmp/%s' % package_name)

  21.         # and finally touch the .wsgi file so that mod_wsgi triggers
  22.         # a reload of the application
  23.         run('touch /web/configs/uwsgi_reload.txt')
  24.         run('tail -f /tmp/uwsgi.log')
复制代码



作者: Miss_love    时间: 2021-1-5 17:00
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2