部署Python网站到Heroku云平台 - 2012-05-09
Heroku对rails支持是最好的. 不过它支持的语言非常多, Python是其中之一. 下面记录如何把一个Python网站部署到Heroku云平台.
Heroku准备
你最好不是第一次使用Heroku, 否则会有一些东西等着你先做好, 才能继续下面的步骤. 一个Heroku帐号是必须的. 其次要能在命令行执行heroku这个命令. 这个命令如果找不到, 说明相关的软件包没有装. heroku这个命令是通过一个Ruby软件包来提供的, 如果你已经本地已经搭建好了Ruby环境的话, 你可以一条命令安装heroku: gem install heroku. 如果本地的Ruby环境没有装好, 需要查找资料安装Ruby环境. 安装Ruby不是这里的重点, 不做介绍.
你需要把本地的SSH key公钥上传到Heroku网站上, 并跟你的帐号关联起来. 这是用来身份认证的, 否则的话Heroku不知道你是谁, 不会接受你的服务请求的. 一个好消息是有一条命令可以轻松帮你搞定一切: heroku login. 你只需按照命令行的提示输入你的邮箱和密码就行了.
Python网站准备
- 首先你得在本地把网站跑起来, 测试没有问题了. 本地都跑不起来, 就别往云平台折腾了.
- 要有一个requirements.txt文件, 里面放上你的项目依赖的python软件包
- 这个文件可以手写, 也可以自动生成: pip freeze > requirements.txt
- Heroku平台是采用类似foreman + Procfile的方式来运行Python程序的, 所以你得创建一个Procfile, 内容:
- web: python manage.py run_app
- "web: "后面的命令是用来在本地运行网站程序的. 根据具体情况调整这条语句
- 实际上就是第1步你用来运行网站的语句
- 注意, 运行网站的时候, 端口必须从环境变量中读取, 否则在Heroku平台起不来.
- 示例代码: port = int(os.environ.get('PORT', 5000))
- 注意Procfile首字母是大写的
- 在本地测试下用foreman来启动程序
- 如果没有安装foreman, 安装: gem install foreman
- 启动网站: foreman start
- 测试网站运行是否正常
- 如果网站程序没有用git做版本控制, 现在把它加入到git版本控制:
- git init
- git add .
- git commit -m "Initial commit"
- 如果你的网站已经用git做了版本控制, 不要忘了把上面步骤中对requirements.txt和Procfile等文件的修改commit.
- git add .
- git commit -m "Prepare for Heroku"
数据库准备
Heroku唯一支持的关系型数据库是Postgresql. 你的程序最好支持Postgresql数据库. 如果你采用的是某种ORM框架比如说quick_orm, 那么你只需要更改数据库的连接字符串就能做到轻松切换数据库了.
运行命令heroku config, 在其中找到你的数据库的链接字符串
如果找不到, 执行命令: heroku addons:add shared-database, 然后再次执行命令heroku config
从中找到SHARED_DATABASE_URL, 更新到你的程序中去. 这就是你的程序部署到远程之后的数据库链接字符串.
Heroku唯一支持的关系型数据库是Postgresql. 你的程序最好支持Postgresql数据库. 如果你采用的是某种ORM框架比如说quick_orm, 那么你只需要更改数据库的连接字符串就能做到轻松切换数据库了.
运行命令heroku config, 在其中找到你的数据库的链接字符串
如果找不到, 执行命令: heroku addons:add shared-database, 然后再次执行命令heroku config
从中找到SHARED_DATABASE_URL, 更新到你的程序中去. 这就是你的程序部署到远程之后的数据库链接字符串.
开始部署
- heroku create --stack cedar
- 给你的网站换个好记的英文名字: heroku rename everblog
- 上面的everblog是我给我的网站取的英文名字
- everblog这个名字已经被我占用了, 你得自己再选个其它的名字
- 推送代码到Heroku平台: git push heroku master
- 给网站分配一个web进程: heroku ps:scale web=1
- 问: 为何不多分配几个进程呢? 答: Heroku对一个程序只免费提供一个进程, 更多进程是要收费的.
- 查看当前运行的进程: heroku ps
- 如果你有一些初始化的脚本要执行, 在这一步中执行
- 对于我的网站, 执行的命令是: heroku run python manage.py recreate_tables_then_load_data
问题诊断
如果你的网站不能访问, 或者报了错, 你该怎么办? 标准答案只有一个 -- 先看日志: heroku logs
具体什么错误日志中都会有详细的说明, 根据具体情况去解决问题, 搞不定就多Google, 实在还搞不定就请教有经验的前辈.
一个成功的例子
everblog: http://everblog.herokuapp.com