这篇文章主要介绍了Python部署web app的详细教程,示例代码基于Python2.x版本,需要的朋友可以参考下

作为一个合格的开发者,在本地环境下完成开发还远远不够,我们需要把Web App部署到远程服务器上,这样,广大用户才能访问到网站。

很多做开发的同学把部署这件事情看成是运维同学的工作,这种看法是完全错误的。首先,最近流行DevOps理念,就是说,开发和运维要变成一个整体。其次,运维的难度,其实跟开发质量有很大的关系。代码写得垃圾,运维再好也架不住天天挂掉。最后,DevOps理念需要把运维、监控等功能融入到开发中。你想服务器升级时不中断用户服务?那就得在开发时考虑到这一点。

下面,我们就来把awesome-python-webapp部署到Linux服务器。
搭建Linux服务器

要部署到Linux,首先得有一台Linux服务器。要在公网上体验的同学,可以在Amazon的AWS申请一台EC2虚拟机(免费使用1年),或者使用国内的一些云服务器,一般都提供Ubuntu Server的镜像。想在本地部署的同学,请安装虚拟机,推荐使用VirtualBox。

我们选择的Linux服务器版本是Ubuntu Server 12.04 LTS,原因是apt太简单了。如果你准备使用其他Linux版本,也没有问题。

Linux安装完成后,请确保ssh服务正在运行,否则,需要通过apt安装:

?
1
$ sudo apt-get install openssh-server

有了ssh服务,就可以从本地连接到服务器上。建议把公钥复制到服务器端用户的.ssh/authorized_keys中,这样,就可以通过证书实现无密码连接。
部署方式

在本地开发时,我们可以用Python自带的WSGI服务器,但是,在服务器上,显然不能用自带的这个开发版服务器。可以选择的WSGI服务器很多,我们选gunicorn:它用类似Nginx的Master-Worker模式,同时可以提供gevent的支持,不用修改代码,就能获得极高的性能。

此外,我们还需要一个高性能Web服务器,这里选择Nginx,它可以处理静态资源,同时作为反向代理把动态请求交给gunicorn处理。gunicorn负责调用我们的Python代码,这个模型如下:

Nginx负责分发请求:

在服务器端,我们需要定义好部署的目录结构:

复制代码 代码如下:
/
+- srv/
   +- awesome/       <-- Web App根目录
      +- www/        <-- 存放Python源码
      |  +- static/  <-- 存放静态资源文件
      +- log/        <-- 存放log

在服务器上部署,要考虑到新版本如果运行不正常,需要回退到旧版本时怎么办。每次用新的代码覆盖掉旧的文件是不行的,需要一个类似版本控制的机制。由于Linux系统提供了软链接功能,所以,我们把www作为一个软链接,它指向哪个目录,哪个目录就是当前运行的版本:

而Nginx和gunicorn的配置文件只需要指向www目录即可。

Nginx可以作为服务进程直接启动,但gunicorn还不行,所以,Supervisor登场!Supervisor是一个管理进程的工具,可以随系统启动而启动服务,它还时刻监控服务进程,如果服务进程意外退出,Supervisor可以自动重启服务。

总结一下我们需要用到的服务有:

  • Nginx:高性能Web服务器+负责反向代理;
  • gunicorn:高性能WSGI服务器;
  • gevent:把Python同步代码变成异步协程的库;
  • Supervisor:监控服务进程的工具;
  • MySQL:数据库服务。

在Linux服务器上用apt可以直接安装上述服务:

?
1
$ sudo apt-get install nginx gunicorn python-gevent supervisor mysql-server

然后,再把我们自己的Web App用到的Python库安装了:

?
1
$ sudo apt-get install python-jinja2 python-mysql.connector

在服务器上创建目录/srv/awesome/以及相应的子目录。

在服务器上初始化MySQL数据库,把数据库初始化脚本schema.sql复制到服务器上执行:

?
1
$ mysql -u root -p < schema.sql

服务器端准备就绪。
部署

用FTP还是SCP还是rsync复制文件?如果你需要手动复制,用一次两次还行,一天如果部署50次不但慢、效率低,而且容易出错。

正确的部署方式是使用工具配合脚本完成自动化部署。Fabric就是一个自动化部署工具。由于Fabric是用Python开发的,所以,部署脚本也是用Python来编写,非常方便!

要用Fabric部署,需要在本机(是开发机器,不是Linux服务器)安装Fabric:

?
1
$ easy_install fabric

Linux服务器上不需要安装Fabric,Fabric使用SSH直接登录服务器并执行部署命令。

下一步是编写部署脚本。Fabric的部署脚本叫fabfile.py,我们把它放到awesome-python-webapp的目录下,与www目录平级:

复制代码 代码如下:
awesome-python-webapp/
+- fabfile.py
+- www/
+- ...

Fabric的脚本编写很简单,首先导入Fabric的API,设置部署时的变量:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# fabfile.py
import os, re
from datetime import datetime
# 导入Fabric API:
from fabric.api import *
# 服务器登录用户名:
env.user = 'michael'
# sudo用户为root:
env.sudo_user = 'root'
# 服务器地址,可以有多个,依次部署:
env.hosts = ['192.168.0.3']
# 服务器MySQL用户名和口令:
db_user = 'www-data'
db_password = 'www-data'

然后,每个Python函数都是一个任务。我们先编写一个打包的任务:

?
1
2
3
4
5
6
7
8
9
10
11
_TAR_FILE = 'dist-awesome.tar.gz'
def build():
  includes = ['static', 'templates', 'transwarp', 'favicon.ico', '*.py']
  excludes = ['test', '.*', '*.pyc', '*.pyo']
  local('rm -f dist/%s' % _TAR_FILE)
  with lcd(os.path.join(os.path.abspath('.'), 'www')):
    cmd = ['tar', '--dereference', '-czvf', '../dist/%s' % _TAR_FILE]
    cmd.extend(['--exclude=\'%s\'' % ex for ex in excludes])
    cmd.extend(includes)
    local(' '.join(cmd))

Fabric提供local('...')来运行本地命令,with lcd(path)可以把当前命令的目录设定为lcd()指定的目录,注意Fabric只能运行命令行命令,Windows下可能需要Cgywin环境。

在awesome-python-webapp目录下运行:

?
1
$ fab build

看看是否在dist目录下创建了dist-awesome.tar.gz的文件。

打包后,我们就可以继续编写deploy任务,把打包文件上传至服务器,解压,重置www软链接,重启相关服务:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
_REMOTE_TMP_TAR = '/tmp/%s' % _TAR_FILE
_REMOTE_BASE_DIR = '/srv/awesome'
def deploy():
  newdir = 'www-%s' % datetime.now().strftime('%y-%m-%d_%H.%M.%S')
  # 删除已有的tar文件:
  run('rm -f %s' % _REMOTE_TMP_TAR)
  # 上传新的tar文件:
  put('dist/%s' % _TAR_FILE, _REMOTE_TMP_TAR)
  # 创建新目录:
  with cd(_REMOTE_BASE_DIR):
    sudo('mkdir %s' % newdir)
  # 解压到新目录:
  with cd('%s/%s' % (_REMOTE_BASE_DIR, newdir)):
    sudo('tar -xzvf %s' % _REMOTE_TMP_TAR)
  # 重置软链接:
  with cd(_REMOTE_BASE_DIR):
    sudo('rm -f www')
    sudo('ln -s %s www' % newdir)
    sudo('chown www-data:www-data www')
    sudo('chown -R www-data:www-data %s' % newdir)
  # 重启Python服务和nginx服务器:
  with settings(warn_only=True):
    sudo('supervisorctl stop awesome')
    sudo('supervisorctl start awesome')
    sudo('/etc/init.d/nginx reload')

注意run()函数执行的命令是在服务器上运行,with cd(path)和with lcd(path)类似,把当前目录在服务器端设置为cd()指定的目录。如果一个命令需要sudo权限,就不能用run(),而是用sudo()来执行。
配置Supervisor

上面让Supervisor重启gunicorn的命令会失败,因为我们还没有配置Supervisor呢。

编写一个Supervisor的配置文件awesome.conf,存放到/etc/supervisor/conf.d/目录下:

复制代码 代码如下:
[program:awesome]
command     = /usr/bin/gunicorn --bind 127.0.0.1:9000 --workers 1 --worker-class gevent wsgiapp:application
directory   = /srv/awesome/www
user        = www-data
startsecs   = 3

redirect_stderr         = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups  = 10
stdout_logfile          = /srv/awesome/log/app.log

配置文件通过[program:awesome]指定服务名为awesome,command指定启动gunicorn的命令行,设定gunicorn的启动端口为9000,WSGI处理函数入口为wsgiapp:application。

然后重启Supervisor后,就可以随时启动和停止Supervisor管理的服务了:

?
1
2
3
4
$ sudo supervisorctl reload
$ sudo supervisorctl start awesome
$ sudo supervisorctl status
awesome        RUNNING  pid 1401, uptime 5:01:34

配置Nginx

Supervisor只负责运行gunicorn,我们还需要配置Nginx。把配置文件awesome放到/etc/nginx/sites-available/目录下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
  listen   80; # 监听80端口
  root    /srv/awesome/www;
  access_log /srv/awesome/log/access_log;
  error_log /srv/awesome/log/error_log;
  # server_name awesome.liaoxuefeng.com; # 配置域名
  # 处理静态文件/favicon.ico:
  location /favicon.ico {
    root /srv/awesome/www;
  }
  # 处理静态资源:
  location ~ ^\/static\/.*$ {
    root /srv/awesome/www;
  }
  # 动态请求转发到9000端口(gunicorn):
  location / {
    proxy_pass    http://127.0.0.1:9000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

然后在/etc/nginx/sites-enabled/目录下创建软链接:

?
1
2
3
$ pwd
/etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-available/awesome .

让Nginx重新加载配置文件,不出意外,我们的awesome-python-webapp应该正常运行:

?
1
$ sudo /etc/init.d/nginx reload

如果有任何错误,都可以在/srv/awesome/log下查找Nginx和App本身的log。如果Supervisor启动时报错,可以在/var/log/supervisor下查看Supervisor的log。

如果一切顺利,你可以在浏览器中访问Linux服务器上的awesome-python-webapp了:

如果在开发环境更新了代码,只需要在命令行执行:

?
1
2
$ fab build
$ fab deploy

自动部署完成!刷新浏览器就可以看到服务器代码更新后的效果。
友情链接

嫌国外网速慢的童鞋请移步网易和搜狐的镜像站点:

http://mirrors.163.com/

http://mirrors.sohu.com/

您可能感兴趣的文章:

  • 关于你不想知道的所有Python3 unicode特性
  • Python 2.7.x 和 3.x 版本的重要区别小结
  • 用Python编写一个国际象棋AI程序

部署Python的框架下的web app的详细教程相关推荐

  1. ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程

    ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程 ESP RainMaker ESP RainMaker 是乐鑫推出的一个端到端平台.基于该平台,用户无需管理基础设 ...

  2. Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略

    Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略 目录 双下划线介绍 1.关于双下划线的函数或方法或属性 双下划线介绍 1.关于双下划线的函数或方法或属性 __name_ ...

  3. Windows申请iOS证书上架App Store详细教程 (有这一篇就够了)

    Windows申请iOS证书上架App Store详细教程 上架基本需求资料 1.苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2.开发好的APP 通过本篇教程,可以学习到ios证书申请 ...

  4. mac搭建svn服务器文件被锁定,mac安装svn_在MAC下搭建SVN服务器的详细教程

    摘要 腾兴网为您分享:在MAC下搭建SVN服务器的详细教程,易信,无忧兼职,茄子快传,每日一淘等软件知识,以及android解锁大师,workflow,乐客联盟,海鸥旅游,mm直播app,腾讯新闻,中 ...

  5. 服务器2003系统U盘安装方法,u盘winpe下安装windows server 2003详细教程

    最近,很多用户都表示不知道如何在u盘winpe下安装windows server 2003,今天,U大侠小编就针对大家的这个困扰,给大家介绍下u盘winpe下安装windows server 2003 ...

  6. python数据可视化读取excell文件绘制图像详细教程

    python数据可视化读取excell文件绘制图像详细教程 python数据可视化 python库中的基本用法 import pandas as pd # 调用pandas库 来读取excell的文件 ...

  7. ubuntu下完全卸载 opencv库 详细教程

     ubuntu下完全卸载 opencv库 详细教程 1:首先你需要先进入安装 opencv的build目录下(这个目录一般都会在你的 home里),进入build目录 执行卸载命令,这个命令执行起来比 ...

  8. ramdisk和linux PE,PE下建立Ramdisk盘的详细教程

    如何在PE下建立一个Ramdisk盘呢?之前我们有介绍过如何在PE下安装系统ghost,有看过教程的朋友应该都会安装了吧.但是如果要在PE下建立一个Ramdisk盘,要如何建立呢?今天U大侠小编就和大 ...

  9. Office web app server2013详细的安装和部署

    SharePoint 2013集成Office web apps server2013详细的安装和部署  安装前的需要理解的: 1.Office Web Apps 只能由使用基于声明的身份验证的 Sh ...

最新文章

  1. 网络框架 - 收藏集 - 掘金
  2. 剑指Offer——网易笔试之解救小易
  3. 【IM】关于最小二乘法及约束的理解
  4. 自己动手制作(DIY)一个Mini-Linux系统
  5. 网络安全:图片防盗链的实现原理
  6. Python学习笔记——GIF倒放处理
  7. win10中cmd拒绝访问授权
  8. 排序类问题度量指标:Recall , MAP,MRR
  9. python开发的网络调试助手_Linux/windows/mac 下的socket网络通信调试助手 UDP/TCP
  10. 配置思科交换机冗余链路汇聚
  11. php用for循环输出九九乘法表,php循环之打印九九乘法表
  12. error: Microsoft Visual C++ 14.0 is required. Get it with “Build Tools for Visual Studio“: https://
  13. 正态性检验中的统计量D值和统计量W值如何计算?
  14. 计算机的自动播放功能有什么用,禁用自动播放功能的几种方法
  15. 360影视大全 python_爬取360影视排行榜-总榜
  16. 动环监控系统的监控对象有哪些?动环监控系统作用
  17. python中endswith函数什么意思_Python中endswith()函数的基本使用
  18. R语言h2o深度学习分类
  19. 基于SSH的客户关系CRM管理系统设计与实现
  20. WordPress 大前端dux5.0Plus(添加:添加主机推荐和联系我们模块;)-dux5.0 增加首页公告模块

热门文章

  1. 9亿财产如何分配:大S与汪小菲离婚所感
  2. 医院招聘计算机管理岗考试题库13套
  3. 互联网的996与华为的惊世骇俗
  4. 继续谈下脑残的NODE_MODULE_VERSION,全世界冷眼看着electron
  5. dw编写html缩小间距,dw段落行距怎么设置 用DW怎么控制文章的行间距
  6. 最新完整数据结构与算法
  7. Spring Boot 学习[一] 介绍与入门
  8. 多媒体个人计算机能处理什么,多媒体信息处理
  9. 关于移动硬盘突然变成RAW格式数据该怎么恢复
  10. 5.2.6UART寄存器编程(下)