Total Pageviews

Tuesday, 5 February 2013

snova - 构建在PaaS 平台上的客户端-服务器模式的代理工具

关于

  • Snova(Java)是一个插件化的web proxy框架,目前自动集成基于Google AppEngine平台的GAE插件,支持Heroku/CloundFoundry/OpenShift/Dotcloud/Jelastic平台的C4插件,以及增强的PAC插件SPAC。源码在GoogleCode上维护。snova@GoogleCode
  • GSnova(Go)是几乎和snova功能一致的Go语言实现,包括GAE/C4支持,弱化的SPAC实现,以及额外的SSH支持。源码放到了GitHub上维护. gsnova@github

安装部署

  • 安装运行依赖
    • Snova(Java) 依赖JRE 1.6+
    • GSnova(Go)为系统原生可执行文件,无任何依赖

AppId共享计划

  • 在Snova(Java)的GAE Plugin的GUI中提供有一个共享appid的功能,任何人可以据此共享自己的appid
  • 在Snova(Java)的命令行工具admin.sh/admin.bat中也内置share/unshare命令
  • 当Snova/GSnova的用户由于某些原因(如不知道怎么安装server侧)没有配置自己的appid时,默认情况下,客户端会从服务器上随机获取几个共享appid,然后用匿名用户方式连接<shareappid>.appspot.com
  • GSnova(Go)则提供一个Web接口支持共享appid, 访问http://127.0.0.1:48100

注意

  • Go版本GAE服务端与Java版本GAE服务端功能完全一致,区别在于Go版本的性能较Java版本为好,粗略观察差距大约在30%以上,另外Go实例启动时间很短(<500ms),而Java实例的启动时间较长(>4s)
  • GSnova(Go)无GUI界面,只提供简单的本地Web界面支持。Snova(Java)提供GUI支持。
  • Snova(Java)的GUI以及CLI工具中均有share/unshare appid功能, 你可以分享自己的appid到中心服务器,也可以取消分享;中心服务器则随机分派appid给没有安装自己的snova-gae-server的用户
  • GSnova(Go)也通过本地web界面提供share/unshare appid功能.
------------------------------
 NodeJsPaaSInstallation

简要说明

  • 部署过程一般是将C4的服务端NodeJS实现部署到PaaS平台上,这个过程每个PaaS平台都不一样
  • 根据自己的需要任意选择一个PaaS平台部署,部署过程参考下个章节
  • 部署服务端成功后,需要修改snova/gsnova的客户端配置
  • 以下是几个NodeJS PaaS平台的简要部署指南以及snova/gsnova的客户端配置修改指南

部署服务端

Heroku

Step 1: 准备Heroku Client环境

按照Heroku官方的QuickStart注册帐号,安装Heroku Toolbelt(注册较简单,仅需要email)

Step 2: 部署Snova C4的服务端到Heroku

  • 下载snova-c4-nodejs-server-[version].zip, 放在任意地方
  • 在命令行下进入zip解压后所在目录,依次顺序执行以下的命令,每一行单独执行
  •        heroku login
           git init
           git add .
           git commit -m "init"
           heroku create               //此步创建app
           git push heroku master 
  • 留意执行“heroku create”时的输出,一般会显示创建的域名,为 "xx.herokuapp.com", 记下该域名,为配置Client准备(执行heroku apps可列出所有app)

Openshift

Step 1: 注册OpenShift环境, 安装OpenShift部署工具

到官方链接OpenShift注册注册帐号,参考说明rhc安装安装部署工具

Step 2: 部署服务到OpenShift

  • snova-c4-server-[version].war放到任意的空目录下,然后在命令行下进入该目录,逐个执行下面的命令
  • rhc setup        --登录
    rhc-create-domain -n <domainName>  --创建主域名, 部署新应用是这一步可不执行
    rhc-create-app -a <appname> -t nodejs-0.6  --创建app,执行后会在当前目录下创建一个appname的目录名;注意保留此目录用于以后更新
    
    cd <appname>
    unzip snova-c4-nodejs-server-[version].zip--上一步将snova-c4-nodejs-server-[version].zip在创建的<appname>目录下解压, windows用户参考说明操作 
    
    git add .
    git commit m deploy
    git push
  • 浏览器中输入<appname>-<domainName>.rhcloud.com, 查看是否部署成功,否则检查上述步骤是否执行成功

CloudFoundry

Step 1: 注册CloudFoundry环境,安装CloudFoundry部署工具

  • 到官方链接CloundFoundry注册帐号, 注意,注册不是马上成功,一般第二天才会收到注册成功的邮件,其中包含用户名密码
  • 参考官方说明安装命令行工具vmc,注意安装依赖ruby以及gem的安装。 vmc安装

Step 2: 部署服务到CloudFoundry

  • snova-c4-nodejs-server-[version].zip解压到任意的空目录下,然后在命令行下进入该目录,逐个执行下面的三行命令。注意要求node 0.6以上
  • vmc target api.cloudfoundry.com
    vmc login
    vmc push <appnamexxx>  ——执行此处appnamexxx为任意名称,为域名一部分,此命令执行后有类似下面的交互内容,参照下面的输入选择;更新app亦执行此命令。
    
    user@ubuntu:~/snova-deploy$ vmc push appnamexxxInstances> 1
    1: node2: otherFramework> node
    1: node2: node063: node084: otherRuntime> 3
    1: 64M
    2: 128M
    3: 256M
    4: 512M
    Memory Limit> 64M
    Creating appnamexxx... OK
    1: appnamexxx.cloudfoundry.com2: none
    URL> appnamexxx.cloudfoundry.com
    Updating appnamexxx... OK
    Create services for application?> n
    Bind other services to application?> n
    Save configuration?> n
    Uploading appnamexxx... OKStarting appnamexxx... OKChecking appnamexxx... OK
  • 浏览器中输入<appnamexxx>.cloudfoundry.com, 查看是否部署成功,否则检查上述步骤是否执行成功

Dotcloud

Step 1: 注册Dotcloud帐号,准备Dotcloud Client环境

  • 按照Dotcloud官方的Dotcloud注册帐号,遵循安装说明Installing the CLI安装Dotcloud Client
  • 安装完后,命令行下执行以下命令初始化dotcloud client
  •        dotcloud setup

Step 2: 部署Snova C4的服务端到Dotcloud

  • 下载snova-c4-nodejs-server-[version].zip, 解压到任意空目录中
  • 在命令行下进入war文件所在目录,依次顺序执行以下的命令,每一行单独执行
  •         dotcloud create <app_name>     --创建app,只需执行一次
            dotcloud push                  --上传app,注意失败后重试一次
  • 如果是更新C4服务端,注意保留上步的目录,替换解压后的文件后执行dotcloud push即可
  • 留意执行“dotcloud push”时的输出,一般会显示创建的域名,为 "xx.dotcloud.com", 记下该域名,为配置Client准备(执行heroku list可列出所有app)

Appfog

Step 1: 准备Appfog账号以及安装Client环境

  • Appfog注册账号,并按照官方的AF Command Line Tool说明下载安装appfog的命令行工具。
  • 注意:Appfog部署C4后的效果较差,问题不少,愿意研究的可以尝试

Step 2: 部署Snova C4的服务端到Appfog

  • 下载snova-c4-nodejs-server-[version].zip, 解压到任意空目录中
  • 在命令行下进入zip文件解压的目录,依次顺序执行以下的命令,每一行单独执行
  •        af login
           af push <appname>  
  • 执行af push命令后会出现下面输出,参考下面输入选择(注意, 以下实际appname用xxx代替, 内存可选择更高,以提高部署的app性能,下面选择512M仅为示范)
  •       Detected a Node.js Application, is this correct? [Yn]: Y
          1: AWS US East - Virginia
          2: AWS EU West - Ireland
          3: AWS Asia SE - Singapore
          4: Rackspace AZ 1 - Dallas
          5: HP AZ 2 - Las Vegas
          Select Infrastructure: 3
          Application Deployed URL [snova3.ap01.aws.af.cm]: 
          Memory reservation (128M, 256M, 512M, 1G, 2G) [64M]: 
          How many instances? [1]: 
          Create services to bind to 'snova'? [yN]: n
          Would you like to save this configuration? [yN]: n
          Creating Application: OK
           Uploading Application:
           Checking for available resources: OK
           Processing resources: OK
           Packing application: OK
           Uploading (3K): OK   
           Push Status: OK
           Staging Application 'xxx': OK                                                 
           Starting Application 'xxx': OK 
  • 留意执行“af push”时的输出,出现 Application Deployed URL的一行中含部署后的app的域名,记住次域名,用于配置C4。例如:
  •         Application Deployed URL [xxx.ap01.aws.af.cm]: 
            其中xxx.ap01.aws.af.cm即为域名

修改客户端配置

客户端可选gsnova(Go)或者snova(Java)

gsnova(Go)

  • 修改gsnova.conf中C4部分,填入之前创建的域名,重启gsnova生效
  •      [C4]
         #Enable改为1,C4才能生效,默认为0关闭
         Enable=1
         #修改domain为Step2创建的域名, 可加多个域名
         WorkerNode[0]=xyz.herokuapp.com
         WorkerNode[1]=xyz.cloudfoundry.com
  • 修改gsnova.conf中SPAC下默认的Proxy实现为C4
  •      [SPAC]
         Enable=1
         #默认Proxy实现,初始为GAE
         Default=C4

snova(Java)

  • 从snova-0.12.0120开始自动集成c4 plugin,无需单独安装
  • 修改<snova>/plugins/c4/conf/c4-client.conf
  •        [C4]
               #修改domain为Step2创建的域名, 可加多个域名
           WorkerNode[0]=xyz.herokuapp.com
           WorkerNode[1]=xyz.cloudfoundry.com
  • 修改<snova>/conf/snova.conf,将C4改为默认proxy实现(可选)
  •       [Framework]
          .........
          ##Can choose in plugins, default is GAE
          ProxyService=C4

SPAC(可选)

from http://code.google.com/p/snova/wiki/NodeJsPaaSInstallation
-------------------------------------------------
JavaPaaSInstallation  
C4 Plugin在Java PaaS上的部署配置说明.
Featured

简要说明

  • 部署过程一般是将C4的服务端实现war包部署到PaaS平台上,这个过程每个PaaS平台都不一样
  • 根据自己的需要任意选择一个PaaS平台部署,部署过程参考下个章节
  • 部署服务端成功后,需要修改snova/gsnova的客户端配置
  • 以下是几个Java PaaS平台的简要部署指南以及snova/gsnova的客户端配置修改指南

部署服务端

Heroku

Step 1: 准备Heroku Client环境

按照Heroku官方的QuickStart注册帐号,安装Heroku Toolbelt(注册较简单,仅需要email)

Step 2: 部署Snova C4的服务端到Heroku

  • 下载snova-c4-server-[version].war, 放在任意地方
  • 在命令行下war文件所在目录,依次顺序执行以下的命令,每一行单独执行
  •        heroku login
           heroku plugins:install https://github.com/heroku/heroku-deploy  --只需执行一次,以后不用执行
           heroku apps:create      --此步创建一个app,名字随机,记住此步的appname(域名不含.herokuapp.com)。更新不用执行此步
           heroku deploy:war --war <path_to_war_file> --app <app_name> 
  • 留意执行“heroku apps:create”时的输出,一般会显示创建的域名,为 "xx.herokuapp.com", 记下该域名,为配置Client准备(执行heroku apps可列出所有app)

Openshift

Step 1: 注册OpenShift环境, 安装OpenShift部署工具

到官方链接OpenShift注册注册帐号,参考说明rhc安装安装部署工具

Step 2: 部署服务到OpenShift

  • snova-c4-server-[version].war放到任意的空目录下,然后在命令行下进入该目录,逐个执行下面的命令
  • rhc setup        --登录
    rhc-create-domain -n <domainName>  --创建主域名, 部署新应用是这一步可不执行
    rhc-create-app -a <appname> -t jbossews-1.0  --创建app,执行后会在当前目录下创建一个appname的目录名;注意保留此目录用于以后更新
    
    cd <appname>
    mv snova-c4-server-[version].war webapps/ROOT.war--上一步将snova-c4-server-[version].war改名为ROOT.war, 移动到webapps目录下, windows用户参考说明操作 
    
    git rm -r src pom.xml   此步重新部署同一个app时可不执行
    git add .
    git commit m deploy
    git push
  • 浏览器中输入<appname>-<domainName>.rhcloud.com, 查看是否部署成功,否则检查上述步骤是否执行成功

CloudFoundry

Step 1: 注册CloudFoundry环境,安装CloudFoundry部署工具

  • 到官方链接CloudFoundry注册帐号, 注意,注册不是马上成功,一般第二天才会收到注册成功的邮件,其中包含用户名密码
  • 参考官方说明安装命令行工具vmc,注意安装依赖ruby以及gem的安装。 vmc安装

Step 2: 部署服务到CloundFoundry

  • snova-c4-server-[version].war放到任意的空目录下,然后在命令行下进入该目录,逐个执行下面的三行命令。
  • vmc target api.cloudfoundry.com
    vmc login
    vmc push <appnamexxx>  ——执行此处appnamexxx为任意名称,为域名一部分,此命令执行后有类似下面的交互内容,参照下面的输入选择;更新app亦执行此命令。
    
    user@ubuntu:~/snova-deploy$ vmc push appnamexxxInstances> 1
    1: java_web2: otherFramework> 1       
    1: java2: java73: otherRuntime> 1
    1: 64M
    2: 128M
    3: 256M
    4: 512M
    Memory Limit> 512M
    Creating appnamexxx... OK
    1: appnamexxx.cloudfoundry.com2: none
    URL> appnamexxx.cloudfoundry.com
    Updating appnamexxx... OK
    Create services for application?> n
    Bind other services to application?> n
    Save configuration?> n
    Uploading appnamexxx... OKStarting appnamexxx... OKChecking appnamexxx... OK
  • 浏览器中输入<appnamexxx>.cloudfoundry.com, 查看是否部署成功,否则检查上述步骤是否执行成功

Dotcloud

Step 1: 注册Dotcloud帐号,准备Dotcloud Client环境

  • 按照Dotcloud官方的Dotcloud注册帐号,遵循安装说明Installing the CLI安装Dotcloud Client
  • 安装完后,命令行下执行以下命令初始化dotcloud client
  •        dotcloud setup

Step 2: 部署Snova C4的服务端到Dotcloud

  • 下载snova-c4-server-[version].war, 改名为ROOT.war,放在任意空目录中
  • 下载dotcloud.yml, 放到和ROOT.war同一个目录下
  • 在命令行下进入war文件所在目录,依次顺序执行以下的命令,每一行单独执行
  •         dotcloud create <app_name>     --创建app,只需执行一次
            dotcloud push                  --上传app,注意失败后重试一次
  • 如果是更新C4服务端,注意保留上步的目录,替换ROOT.war后执行dotcloud push即可
  • 留意执行“dotcloud push”时的输出,一般会显示创建的域名,为 "xx.dotcloud.com", 记下该域名,为配置Client准备(执行heroku list可列出所有app)

Appfog

Step 1: 准备Appfog账号以及安装Client环境

  • Appfog注册账号,并按照官方的AF Command Line Tool说明下载安装appfog的命令行工具。
  • 注意:Appfog部署C4后的效果较差,问题不少,愿意研究的可以尝试

Step 2: 部署Snova C4的服务端到Appfog

  • 下载snova-c4-server-[version].war, 放在任意地方
  • 在命令行下进入war文件所在目录,依次顺序执行以下的命令,每一行单独执行
  •        af login
           af push <appname> --path ./snova-c4-server-0.19.0.war  
  • 执行af push命令后会出现下面输出,参考下面输入选择(注意, 以下实际appname用xxx代替, 内存可选择更高,以提高部署的app性能,下面选择512M仅为示范)
  •        Detected a Java Web Application, is this correct? [Yn]: Y
          1: AWS US East - Virginia
          2: AWS EU West - Ireland
          3: AWS Asia SE - Singapore
          4: Rackspace AZ 1 - Dallas
          5: HP AZ 2 - Las Vegas
          Select Infrastructure: 3
          Application Deployed URL [xxx.ap01.aws.af.cm]: 
          Memory reservation (128M, 256M, 512M, 1G, 2G) [512M]: 512M
          How many instances? [1]: 
          Create services to bind to 'snova'? [yN]: n
          Would you like to save this configuration? [yN]: n
          Creating Application: OK
           Uploading Application:
           Checking for available resources: OK
           Processing resources: OK
           Packing application: OK
           Uploading (3K): OK   
           Push Status: OK
           Staging Application 'xxx': OK                                                 
           Starting Application 'xxx': OK 
  • 留意执行“af push”时的输出,出现 Application Deployed URL的一行中含部署后的app的域名,记住次域名,用于配置C4。例如:
  •         Application Deployed URL [xxx.ap01.aws.af.cm]: 
            其中xxx.ap01.aws.af.cm即为域名

Jelastic

Step 1: 注册Jelastic环境

  • 到官方链接jelastic注册帐号
  • 注意jelastic的免费期较短,有意尝试的可以部署

Step 2: 部署

  • 完全图形化的操作,无需安装工具,按照说明将snova-c4-server-[version].war上传并deploy到ROOT下即可 jelastic部署指南

修改客户端配置

客户端可选gsnova(Go)或者snova(Java)

gsnova(Go)

  • 修改gsnova.conf中C4部分,填入之前创建的域名,重启gsnova生效
  •      [C4]
         #Enable改为1,C4才能生效,默认为0关闭
         Enable=1
         #修改domain为Step2创建的域名, 可加多个域名
         WorkerNode[0]=xyz.herokuapp.com
         WorkerNode[1]=xyz.cloudfoundry.com
  • 修改gsnova.conf中SPAC下默认的Proxy实现为C4
  •      [SPAC]
         Enable=1
         #默认Proxy实现,初始为GAE
         Default=C4

snova(Java)

  • 从snova-0.12.0120开始自动集成c4 plugin,无需单独安装
  • 修改<snova>/plugins/c4/conf/c4-client.conf
  •        [C4]
               #修改domain为Step2创建的域名, 可加多个域名
           WorkerNode[0]=xyz.herokuapp.com
           WorkerNode[1]=xyz.cloudfoundry.com
  • 修改<snova>/conf/snova.conf,将C4改为默认proxy实现(可选)
  •       [Framework]
          .........
          ##Can choose in plugins, default is GAE
          ProxyService=C4

SPAC(可选)

from http://code.google.com/p/snova/wiki/JavaPaaSInstallation
----------------------------------------------------------------
C4VPSInstallation  
C4 Plugin在VPS上的部署配置说明.
Featured
Updated Dec 9, 2012 by yinqiwen@gmail.com

简要说明

  • 部署过程一般是将C4的服务端在vps上启动
  • 根据自己的需要任意选择一个Java/NodeJS实现部署,部署过程参考下个章节
  • 部署服务端成功后,需要修改snova/gsnova的客户端配置

部署服务端

Java

Step 1: 准备Java环境

  • Java要求1.6以上

Step 2: 部署启动

  • 下载snova-c4-server-[version].war, 放在任意地方
  • 下载JettyRunner 下载地址,下载的文件放到war文件同一目录
  • 在命令行下进入war文件所在目录,执行下面命令启动
  •        java -jar jetty-runner-7.6.8.v20121106.jar snova-c4-server-[version].war
  • 注意默认绑定端口为8080,需要绑定其它端口参考jetty runner帮助;同时记住VPS的外网IP

NodeJS

Step 1: 注册NodeJS环境

  • 到官方链接NodeJS下载安装NodeJS,注意要求0.6以上

Step 2: 部署启动

  • snova-c4-nodejs-server-[version].zip解压缩到任意的空目录下
  • 在命令行下进入war文件所在目录,执行下面命令启动
  •       node server.js
  • 注意默认绑定端口为8080,需要绑定其它端口需要修改server.js;同时记住VPS的外网IP

修改客户端配置

客户端可选gsnova(Go)或者snova(Java)

gsnova(Go)

  • 修改gsnova.conf中C4部分,填入VPS IP:端口,重启gsnova生效
  •      [C4]
         #Enable改为1,C4才能生效,默认为0关闭
         Enable=1
         #修改domain为Step2创建的域名, 可加多个
         WorkerNode[0]=10.101.10.10:8080
         WorkerNode[1]=10.101.10.11:8080
  • 修改gsnova.conf中SPAC下默认的Proxy实现为C4
  •      [SPAC]
         Enable=1
         #默认Proxy实现,初始为GAE
         Default=C4

snova(Java)

  • 从snova-0.12.0120开始自动集成c4 plugin,无需单独安装
  • 修改<snova>/plugins/c4/conf/c4-client.conf
  •        [C4]
          #修改填入VPS IP:端口
           WorkerNode[0]=10.101.10.10:8080
           WorkerNode[1]=10.101.10.11:8080
  • 修改<snova>/conf/snova.conf,将C4改为默认proxy实现(可选)
  •       [Framework]
          .........
          ##Can choose in plugins, default is GAE
          ProxyService=C4

SPAC(可选)

from http://code.google.com/p/snova/wiki/C4VPSInstallation
--------------------------------------------------------------
 http://jingpin.org/snova-cloud-foundry/
http://jingpin.org/heroku-snova/
http://jingpin.org/snova-openshift/
http://jingpin.org/jelastic-snova/
----------------

Heroku上,部署gsnova
  1. git init
    git add .
    git commit -m "gsnova"
    heroku login
    heroku create
    git push heroku master
    
  2. Gsnova客户端修改配置文件

参考

-------------------------

Heroku部署过程

0.选择Heroku云平台
    
    伴随着云计算的浪潮,国内的云服务可谓多种多样,价格虽然不高,但是真正能够提供永久免费使用的,哪怕有些限制也好,似乎也找不到。
    出于学习/研究/实验/测试或是真正应用等各种需求,这时我们不妨使用把应用部署到国外的Heroku云平台上,Heroku的免费版除了其提供的Postgres数据库有限制之外(小于1万条记录的小型数据库不用付费就可以添加到自己的Web应用上),其它都可以免费使用,这绝对是不二的选择。
    另外一点来说,Heroku对Python的支持非常良好,所以部署起来会轻松很多,这就省去了许多不必要的麻烦了。
    最近要把应用部署到Heroku上,这里把完整的部署过程分享给大家。



说明:我使用的操作系统是Ubuntu 15.10,部署的Python Web应用为基于Flask的应用,下面的部署过程都是在该操作环境下进行部署,建议大家也在Linux环境下进行部署,会方便很多。(当然你有Mac Book就更好了,只是博主没钱,用不起啦)

1.准备Git环境
   
     要想使用Heroku,你的Web应用必须要托管在Git仓库中,如果你之前一直是使用Git的方式来作开发的,那问题就很容易解决了,相信你很明白其中的道理。如果不是的话,请按照下面我的方法来生成一个Git仓库,非常简单。
    很多人觉得使用Git很麻烦,于是就放弃了Heroku平台的使用,这不能不说是一种极大的浪费:
1.首先浪费的是Heroku这么好的一个平台资源;
2.然后就是放弃了Git这么优秀的版本控制系统的使用
3.再者说就是放弃了Linux环境的使用。
    其实这些对于开发来说都是非常有帮助的!所以不要觉得麻烦,只要你以后不是完全做Windows平台的开发,这些你都应该要懂,只要慢慢习惯了,后面一切就都很自然了。

第一步:安装Git
    以Ubuntu为例,可以直接使用下面的命令安装:
1
sudo apt-get install git
    当然如果你正在使用的是其它版本的Linux发行版本,相信安装方法也不难。

第二步:把你的完整Web应用放到一个新的目录中
    比如这里我已经有一个开发完整的Web应用,它主要有下面的这些文件和应用:
1
2
3
4
5
6
7
8
9
10
11
drwxrwxr-x  6 xpleaf xpleaf 4096  1月 29 16:04 .
drwxr-xr-x 38 xpleaf xpleaf 4096  1月 29 16:01 ..
drwxrwxr-x  7 xpleaf xpleaf 4096  1月 29 03:31 app
-rw-rw-r--  1 xpleaf xpleaf 3295  1月 29 03:31 config.py
-rw-rw-r--  1 xpleaf xpleaf 1083  1月 29 03:31 LICENSE
-rwxrwxr-x  1 xpleaf xpleaf 2391  1月 29 03:31 manage.py
drwxrwxr-x  3 xpleaf xpleaf 4096  1月 29 03:31 migrations
-rw-rw-r--  1 xpleaf xpleaf   25  1月 29 03:13 Procfile
-rw-rw-r--  1 xpleaf xpleaf  376  1月 29 03:31 README.md
-rw-rw-r--  1 xpleaf xpleaf   76  1月 29 03:13 requirements.txt
drwxrwxr-x  2 xpleaf xpleaf 4096  1月 29 03:31 tests
    然后创建一个名为Heroku_pro的文件夹,并把上面完整的Web应用程序放进去,如下:
1
2
3
4
xpleaf@leaf:~/Heroku_propwd
/home/xpleaf/Heroku_pro
xpleaf@leaf:~/Heroku_prols
app  config.py  LICENSE  manage.py  migrations  README.md  requirements.txt  tests Procfile
    这一步完成!

第三步:在Heroku_pro目录下生成一个Git仓库
1
2
xpleaf@leaf:~/Heroku_pro$ git init
初始化空的 Git 版本库于 /home/xpleaf/Heroku_pro/.git/
    这时你会发现在当前目录下多了一个.git的目录:
1
2
3
xpleaf@leaf:~/Heroku_prols -a
.   app        .git     manage.py   README.md     tests
..  config.py  LICENSE  migrations  requirements
    这一步完成。

第四步:把当前目录下的所有文件都托管到本地Git仓库
1
2
3
4
5
6
7
8
9
10
xpleaf@leaf:~/Heroku_pro$ git add .
xpleaf@leaf:~/Heroku_pro$ git commit -m "ver1.0"
[master (根提交) a7cea3f] ver1.0
 78 files changed, 3350 insertions(+)
 create mode 100644 LICENSE
 create mode 100644 README.md
 create mode 100644 app/__init__.py
 create mode 100644 app/api_1_0/__init__.py
 create mode 100644 app/api_1_0/authentication.py
 ......
    Ok,这一步完成。

    关于Git的使用显然不是这里要讨论的重点,这里只是为没有用过Git的朋友提供一种临时的解决方案。



2.注册Heroku账户
    
    跟目前国内的大多数云平台一样,首先你也需要注册一个账号,可以在下面的链接进行注册:
    wKiom1arIdeCH2S0AAAwrabARcc665.png



3.安装Heroku Toolbelt客户端
    
    Toolbelt是Heroku的命令行工具,使用该客户端的好处是,我们完全可以在本地通过命令行操作的方式来管理我们托管在Heroku上的Web应用。
    以Ubuntu为例,参考官方的安装文档:
wKioL1arJNPyFfuxAAFTt-ic4Oo654.png    我们使用下面的命令来进行安装就可以了:
1
wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
    可以参考这里的官方文档:https://toolbelt.heroku.com/



4.登陆Heroku
    在刚刚的Heroku_pro目录下执行下面的命令,登陆到Heroku上:
1
2
3
4
5
6
xpleaf@leaf:~/Heroku_pro$ heroku login
Enter your Heroku credentials.
Email: flasky_mini@sina.com
Password (typing will be hidden): 
Logged in as flasky_mini@sina.com
xpleaf@leaf:~/Heroku_pro$
    注意登陆成功后的提示:Logged in as flasky_mini@sina.com
    需要注意的是,login命令默认会自动为你当前的主机创建SSH公钥并上传,SSH公钥非常重要,在你后面执行git push命令的时候是必须要用到的,不过不用担心,heroku的客户端会自动帮我们处理好。当然你也可以手动上传,只需要执行命令:heroku keys:add。



5.使用Heroku客户端创建app程序

    所谓的app程序其实就是herokuapp.com的一个子域名,当你在Heroku创建了一个名为my-heroku-app-cn的app程序之后,如果你部署成功,你就可以直接通过地址https://my-heroku-app-cn.herokuapp.com来访问你的Web应用,因此名字要注意,不能使用别人已经使用过的。我们下面就来创建一个。
1
2
3
xpleaf@leaf:~/Heroku_pro$ heroku create my-heroku-app-cn
Creating my-heroku-app-cn... done, stack is cedar-14
https://my-heroku-app-cn.herokuapp.com/ | https://git.heroku.com/my-heroku-app-cn.git
    出现上面的提示,就说明程序创建成功了!Heroku还分配了一个Git服务器给我们,地址为https://git.heroku.com/my-heroku-app-cn.git
    当然,其实app程序的名字也是可以改的,你只要登陆官居网,在你的个人信息页里就可以修改。



6.配置数据库

    Heroku以扩展的方式支持Postgres数据库,只是有些限制而已,正如前面所说。这里我们就使用Postgres数据库,这也意味着,你需要在你的Web应用源代码中添加相应的数据库路径,这个我们待会再说。
    使用下面的命令配置数据库:
1
2
3
4
5
6
7
8
xpleaf@leaf:~/Heroku_pro$ heroku addons:create heroku-postgresql:hobby-dev
Creating postgresql-rectangular-17531... done, (free)
Adding postgresql-rectangular-17531 to my-heroku-app-cn... done
Setting DATABASE_URL and restarting my-heroku-app-cn... done, v3
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Use `heroku addons:docs heroku-postgresql` to view documentation.
    出现上面的提示也就说明数据库配置成功了,关于该数据库的详细信息,你也可以到官网的个人中心进行查看,里面有非常详细的说明,如下:
wKioL1arLkPh3tgwAAAyoMoXOPA985.png
wKiom1arLHWxUsiGAABaJNUtBsI656.png
wKioL1arLL7QrszqAAA4cAWiwdE778.png
    这里我们需要注意一句话:Setting DATABASE_URL and restarting my-heroku-app-cn... done, v3
    也就是说,Heroku自动为我们刚刚创建的my-heroku-app-cn程序创建了一个名为DATABASE_URL的环境变量,变量的值就是在Heroku平台中该数据库的路径地址,这也意味着,如果你想让你的Web应用部署成功后可以正常连接上该数据库,就必须在你的源代码中设置数据库的地址为:DATABASE_URL,仅此而已,其它的Heroku会为我们完成,不用担心。



7.配置必要的环境变量

    这不是必要的,这取决于你的Web应用的源代码中是否有获取系统环境变量的需要,如果有的话,你可以通过下面的方式进行环境变量的设置。
    比如我在我的源代码的配置文件中有下面的两行代码:
1
2
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    显然电子邮件的用户名和密码这些敏感的信息不应该出现在源代码中,所以我是通过获取环境变量的值来知道用户名和密码的,因此我需要在Heroku上设置相对应的环境变量,命令如下:
1
2
3
4
5
6
xpleaf@leaf:~/Heroku_pro$ heroku config:set MAIL_USERNAME="xpleaf"
Setting config vars and restarting my-heroku-app-cn... done
MAIL_USERNAME: xpleaf
xpleaf@leaf:~/Heroku_pro$ heroku config:set MAIL_PASSWORD="***"
Setting config vars and restarting my-heroku-app-cn... done
MAIL_PASSWORD: ***
    当然如果你需要设置其它的环境变量,通过这个方式设置就可以了。



8.使用生产Web服务器

    我们知道,在使用DjangoFlask作开发的时候,它们都自带了开发Web服务器来连接我们的Web应用程序,这对于在开发的过程中来说是再适合不过的了。然而现在我们要做的是在生产环境中部署我们的Web应用程序,因此你不可能说还使用原来这些Web框架自带的开发服务器,因为性能实在是不可保证,因为它们都是为开发环境设计的Web服务器,而不是为生产环境设计的。所以,我们要使用生产环境的Web服务器。(PS:请注意Web应用程序Web服务器的区别)
    我要部署的Web应用程序是基于Flask的,所以当然要使用一个支持Flask的Web服务器软件,这里我使用的是Gunicorn。当然,这取决于你使用的是什么Web框架,关于这点,可自行去了解。
    选择了要使用Gunicorn来作为我的生产环境,我待会只需要把它添加到依赖需求文件中去就可以了。
    当然,你也完全可以把Gunicorn下载下来进行本地的测试,由于不是每个人都使用的Python Web框架都是Flask或者使用的生Web服务器软件是Gunicorn,所以这里就不提及。



9.添加依赖需求文件和Profile文件

    这是必需也是非常重要的一点,否则的话部署很难成功!
    Heroku要求在我们的Web程序(这里针对Python的Web应用程序)目录中必须要有下面的两个文件:
  
必需文件说明
requirements.txtWeb应用程序所依赖的各种第三方扩展包
Procfile里面包含的是我的Web应用服务器启动时执行的命令
    正如刚刚在我的Heroku_pro目录下看到的:
1
2
3
xpleaf@leaf:~/Heroku_prols -l requirements.txt Procfile 
-rw-rw-r-- 1 xpleaf xpleaf 25  1月 29 03:13 Procfile
-rw-rw-r-- 1 xpleaf xpleaf 76  1月 29 03:13 requirements.txt
    注意这两个文件必须位于当前Heroku_pro目录下。
    requirements.txt的文件内容类似于这样:
1
2
3
4
5
6
7
8
9
10
Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-HTTPAuth==2.7.0
Flask-Login==0.3.1
...
SQLAlchemy==0.9.9
WTForms==1.0.5
Werkzeug==0.10.4
alembic==0.6.2
bleach==1.4.0
    里面包含了支撑我的Web应用程序运行的各种扩展包。当然至于内容是什么,取决于你正在开发的Web项目。
    而Profile文件的内容则类似于这样:
1
web: gunicorn manage:app
    正如前面所说,里面放的是命令,比如这里的这个命令就是用来启动我前面所说的Gunicorn生产环境Web服务器的。
    再次说明,这两个文件非常重要,如果没有的话,待会部署就会失败的。



10.执行git push进行部署

    前面的确认无误之后,就可以部署了,当然,如果你临时修改了你当前Heroku_pro目录下的文件,请先使用下面的命令提交你的修改:
1
2
git add .
git commit -m "ver1.0"
    Ok,下面就开始部署:
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
28
29
30
xpleaf@leaf:~/Heroku_pro$ git push heroku master
对象计数中: 97, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (90/90), 完成.
写入对象中: 100% (97/97), 35.04 KiB | 0 bytes/s, 完成.
Total 97 (delta 22), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Python app detected
remote: -----> Installing runtime (python-2.7.11)
remote: -----> Installing dependencies with pip
remote:        Collecting Flask==0.10.1 (from -r requirements/common.txt (line 1))
..........
remote: -----> Preparing static assets
remote:        Collectstatic configuration error. To debug, run:
remote:        $ heroku run python manage.py collectstatic --noinput
remote: 
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:        Done: 37.2M
remote: -----> Launching...
remote:        Released v6
remote:        https://my-heroku-app-cn.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy.... done.
To https://git.heroku.com/my-heroku-app-cn.git
 * [new branch]      master -> master
    会看到中间有一大堆的输出信息,这是Heroku为我们的环境安装所需的软件包,而这些软件包即是前面我们在需求文件中指定的。当然这些操作都是在Heroku中执行的,我们本地只是看到它的一个操作过程而已。
    部署完成后,根据我的Flask应用所选择的Web服务器的启动方式,使用下面的命令来进行启动:
1
2
3
4
5
6
7
8
9
10
11
#启动Web服务器进行相关初始化配置
xpleaf@leaf:~/Heroku_pro$ heroku run python manage.py deploy    
Running python manage.py deploy on my-heroku-app-cn... up, run.7690
INFO  [alembic.migration] Context impl SQLiteImpl.
......
INFO  [alembic.migration] Running upgrade 288cd3dc5a8 -> 2356a38169ea, followers
INFO  [alembic.migration] Running upgrade 2356a38169ea -> 51f5ccfba190, comments
 
#重新启动
xpleaf@leaf:~/Heroku_pro$ heroku restart
Restarting dynos... done

    上面的完成后,就可以访问我们创建的Web应用了:
    当然,当你访问它的时候可能我已经把它关掉了,你可以访问另一个用同样方法部署的应用的地址:



11.升级

    如果你需要对你的源代码修改以增加或删除某些功能,在Heroku_pro目录下修改了之后,请依次执行下面的命令:
1
2
3
4
5
6
7
8
9
10
11
12
#告诉Heroku,你要进行升级操作
heroku maintenance:on
 
#提交部署
git push heroku master
 
#重新运行服务器
heroku run python manage.py deploy
heroku restart
 
#告诉Heroku,升级完成
maintenance:off


    Ok,到这里的话,本文就结束了,其实关于部署应用到Heroku上,无论你的Web应用是基于Python开发的,或者是其它语言,都是类似的,只是这里侧重说的是Python的Web应用。
    当然在实际的部署过程当中可能会遇到各种各样的问题,这时就需要充分发挥你的随机应变能力了,当出现问题时,可以Google查找(百度找的资料很少,Google上不了就自己想办法吧),或者到Stack Overflow上面去查找或是提问,同时要根据提示的错误信息去阅读官方的文档来解决存在的问题。
    但不管怎么说,部署Python Web应用的主要流程是类似于上面所给出的操作,本文相信对初次在Heroku上部署Python Web应用的朋友会有所帮助,写此文,也确实是希望帮到更多的朋友,因为目前国内有关Python Web部署资源实在不多,更别说部署到国外的云平台上去了。
    好吧,希望帮到有需要的朋友,谢谢大家!

参考:
《Flask Web Development: Developing Web Applications with Python》


from http://xpleaf.blog.51cto.com/9315560/1739940