Heroku黑客指南(二)

Dynos

(一)什么是dyno

dyno是Heroku特有的概念,它对应其他云平台的虚拟服务器。它本质是个容器,用户的应用都运行在这个容器里。dyno是Ubuntu 10.04的虚拟服务器实例,可以根据需求调整规模大小。每个dyno的配置如下(当前):

  • 512MB内存,1GB交换内存
  • 4核CPU(Xeon X5550 @ 2.67GHz)
  • 隔离的执行环境。你存储在dyno里的数据与其他dyno完全隔离。
  • chroot jail环境。这意味着用户完全限制在一个目录树下,不能访问系统文件。
  • 秒单位支付。对每个APP你可以拥有一个免费dyno。对第二个dyno,用了2秒就支付2秒费用,用了一个月就支付一个月费用。

(二)理解dyno

既然dyno就是Ubuntu虚拟服务器,这意味着只要你的应用能运行在Linux上,就能运行在dyno中。这也意味着你在Linux里能做的任何事都能在Heroku上做,比如运行bash命令等。

总体上,可以把dyno想象成支持实时scale up和scale down的VPS。

(三)dyno运行的服务类型

在构建现代web应用时,典型的需要多个服务运行。对某个应用可能需要:

  • 一个web实例响应HTTP请求
  • 一个worker实例处理异步工作
  • 一个scheduler实例处理后台调度任务

因为dyno其实就是虚拟服务器,它们可以轻易运行任何类型的服务。例如,对于上述需求,我们需要:

  • 一个web类型dyno
  • 一个worker类型dyno
  • 一个scheduler类型dyno

(四)定义Procfile

为了让dyno知道运行何种类型的服务(web, worker, scheduler),我们需要告诉Heroku要执行的命令。告诉Heroku执行何种命令,需要在项目的根目录里定义Procfile文件。

假设我们要部署一个Flask应用,包括它的web, worker和scheduler。先定义Procfile文件如下:

web: gunicorn -b ’0.0.0.0:$PORT’ myproject:app
worker: python manage.py celeryd
scheduler: python manage.py celeryd -B

它的格式很简单。每行定义一个dyno。左边是dyno类型,右边是Heroku运行的命令。在上述示例里,需要从命令行运行gunicorn myproject:app来启动web服务,所以定义了这个web dyno:

web: gunicorn –bind ’0.0.0.0:$PORT’ myproject:app

如果项目只需要一个dyno,那么Procfile写一行就够了。

请注意:在上述web dyno里定义了web服务器绑定在0.0.0.0:$PORT接口。这是因为默认情况下Heroku给每个dyno自动分配一个随机端口,所以你的应用必须使用特殊变量$PORT,这样Heroku将自动替换这个端口到应用的对应端口。

 

此条目发表在Common分类目录,贴了, 标签。将固定链接加入收藏夹。