部署到Heroku

Heroku是最早出现的PaaS提供商之一,从2007年就开始运营,Heroku平台的灵活性极高,且支持多种编程语言,若想把程序部署到Heroku上,开发者要使用Git把程序推送到Heroku的Git服务器上,在服务器上,git push命令会自动触发安装、配置和部署程序

Heroku使用名为Dyno计算单元衡量用量,并以此为依据收取服务费用,最常用的Dyno类型是Web Dyno,表示一个Web服务器实例,程序可以通过使用更多的Web Dyno以增强其请求能力,另一种Dyno类型是Worker Dyno,用来执行后台作业或其他辅助任务

Heroku提供了大量的插件和拓展,用于数据库、电子邮件支持和其他很多服务

准备程序

若想使用Heroku,程序必须托管在Git仓库中,如果你的程序托管在像GitHub或Bitbucket这样的远程git服务器上,那么克隆程序后会创建一个本地git仓库,可无缝用于Heroku,如果没有托管在Git仓库中,那么必须在开发电脑上创建一个仓库

安装Heroku Toolbelt

最方便的Heroku程序管理方法是使用Heroku Toolbelt命令行工具,由两部分组成:

  • heroku:Heroku客户端,用来创建和管理程序
  • foreman:一种工具,测试时可用于在自己的电脑上模拟Heroku环境

如果之前没有安装Git客户端,那么Toolbelt安装程序就自动为你安装Git

在Heroku客户端连接服务器之前,需要提供Heroku账户密令,heroku login命令可以完成这一操作

把你的SSH公钥上传到Heroku这一点很重要,上传后才能使用git push命令,正常情况下,login命令会自动创建并上传SSH公钥,但也可以使用heroku keys:add命令单独上传公钥或者上传额外所需的公钥

创建程序

接下来我们要使用Heroku客户端创建一个程序,为此,我们首先要确保程序已纳入Git源码控制系统,然后再顶级目录中运行如下命令:

C:\Program Files (x86)\Git>heroku create fangblog
Creating fangblog... done
https://fangblog.herokuapp.com/ | https://git.heroku.com/fangblog.git

程序名必须是唯一的,在创建过程中,Heroku还给你分配了一个Git服务器,地址为git@heroku.com:<appname>.git,create命令调用git remote命令把这个地址添加为本地Git仓库的远程服务器,名为heroku

配置数据库

heroku扩展形式执行Postgres数据库,少于一万条记录的小型数据库无需付费即可添加到程序中:

$ heroku addons:create heroku-postgresql:hobby-dev
Creating heroku-postgresql:hobby-dev on bangys... free
Created postgresql-sinuous-95421 as HEROKU_POSTGRESQL_ORANGE_URL
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

环境变量HEROKU_POSTGRESQL_ORANGE_URL中保存了数据库的URL,注意运行这个命令后,得到的颜色可能不是橘色,Heroku中的每个程序都支持多个数据库,而每个数据库URL中的颜色都不一样,数据库的地位可以提升,把URL保存到环境变量DATABASE_URL中,下面的命令把前面创建的橘色数据库提升为主数据库:

$ heroku pg:promote HEROKU_POSTGRESQL_ORANGE_URL
Ensuring an alternate alias for existing DATABASE... done, not needed
Promoting postgresql-sinuous-95421 to DATABASE_URL on bangys... done

DATEBASE_URL环境变量的格式正是SQLAlchemy所需的,回想一下config.py脚本的内容,如果设定了DATABASE_URL,就使用其中保存的值,所以现在程序可以自动连接到Postgres数据库

配置日志

之前我们实现了通过电子邮件发送重大错误消息的功能,除此之外,配置其他轻缓等级的消息也尤为重要,其中一个很好的例子是之前添加的数据库缓慢查询警告消息

在Heroku中,日志必须写入stdoutstderr,Heroku会捕获输出的日志,可以在Heroku客户端中使用heroku logs命令查看

日志的配置可添加到ProductionConfig类的init_app()静态方法中,但由于这种日志处理方式是Heroku专用的,因此可专门为这个平台新建一个配置类,把ProductionConfig作为不同类型生产平台的基类,HerokuConfig类如下:

# config.py
class HerokuConfig(ProductionConfig):
    @classmethod
    def init_app(cls, app):
        ProductionConfig.init_app(app)

       #out to stderr
       import logging
       from logging import StreamHandler
       file_handler.setLevel(logging.WARNING)
       app.logger.addHandler(file_handler)

通过Heroku执行程序时,程序需要知道是用的就是个配置,manage.py脚本创建的程序实例通过环境变量FLASK_CONFIG决定使用哪个配置,所以我们要在Heroku的环境中设定这个变量,环境变量使用Heroku客户端中的config:set命令设定:


$ heroku config:set FLASK_CONFIG=heroku
Setting FLASK_CONFIG and restarting bangys... done, v7
FLASK_CONFIG: heroku

配置电子邮件

Heroku并没有提供SMTP服务器,所以我们要配置一个外部服务器,很多第三方扩展能把适用于生产环境的邮件发送服务集成到Heroku中,但对于测试和评估而言,使用继承自Config基类的Gmail配置已经足够了

由于直接把安全密令写入脚本存在安全隐患,所以我们把SMTP服务器的用户名和密码保存在环境变量中:


$ heroku config:set MAIL_USERNAME=xxxx@xxx.com
$ heroku config:set MAIL_PASSWORD=xxxxx

运行生产Web服务器

Heroku没有为托管程序提供Web服务器,相反,它希望程序启动自己的服务器并监听环境变量PORT中设定的端口

Flask自带的开发Web服务器表现很差,因为它不是为生产环境设计的服务器,有两个可以在生产环境中使用、性能良好且支持Flask程序给的服务器:Gunicorn和uWSGI

若想在本地测试Heroku配置,我们最好在虚拟环境中安装Web服务器,安装Gunicorn

使用Gunicorn运行程序,执行命令:gunicorn manage:app,这个参数冒号左边的部分表示定义程序的包或模块,冒号右边的部分表示包中程序实例的部分,要注意的一点:Gunicorn默认使用端口8000, Flask默认是5000

这里我是windows环境,无法正常执行,grp模块无法导入,查了下资料貌似需要在Unix环境,所以这里先坑,以后再填

添加依赖需求文件

Heroku从程序顶级文件夹下的requirements.txt文件中加载包依赖,这个文件中的所有依赖都会在部署过程中导入Heroku创建的虚拟环境

Heroku的需求文件必须包含程序在生产环境中使用的所有通用依赖,以及支持Postgres数据库的psycopg2包和Gunicorn Web服务器

添加Procfile文件

Heroku需要知道使用哪个命令启动程序,这个命令在一个名为Procfile的特殊文件中指定,这个文件必须放在程序的顶级文件夹中

# Procfile
Web: gunicorn manage:app

Procfile文件内容的格式很简单:在每一行中指定一个任务名,后跟一个冒号,然后是运行这个任务的命令,名为web的任务比较特殊,Heroku使用这个任务启动Web服务器,Heroku会为这个任务提供一个PORT环境变量,用于设定程序监听请求的端口,如果设定了PORT变量,Gunicorn默认就会使用其中保存的值,因此无需将其包含在启动命令中

程序可在Procfile中使用web之外的名字声明其他任务, 例如程序所需的其他服务,部署程序后,Heroku会运行Procfile中列出的所有任务

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值