共计 9188 个字符,预计需要花费 23 分钟才能阅读完成。
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_pro $ pwd /home/xpleaf/Heroku_pro xpleaf@leaf:~ /Heroku_pro $ ls 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_pro $ ls -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 账户
跟目前国内的大多数云平台一样,首先你也需要注册一个账号,可以在下面的链接进行注册:
https://www.heroku.com/
3. 安装 Heroku Toolbelt 客户端
Toolbelt 是 Heroku 的命令行工具,使用该客户端的好处是,我们完全可以在本地通过命令行操作的方式来管理我们托管在 Heroku 上的 Web 应用。
以 Ubuntu 为例,参考官方的安装文档:
我们使用下面的命令来进行安装就可以了:
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. |
出现上面的提示也就说明数据库配置成功了,关于该数据库的详细信息,你也可以到官网的个人中心进行查看,里面有非常详细的说明,如下:
这里我们需要注意一句话: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 服务器
我们知道,在使用 Django 或Flask作开发的时候,它们都自带了开发 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.txt | Web 应用程序所依赖的各种第三方扩展包 |
Procfile | 里面包含的是我的 Web 应用服务器启动时执行的命令 |
正如刚刚在我的 Heroku_pro 目录下看到的:
1 2 3 | xpleaf@leaf:~ /Heroku_pro $ ls -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 应用了:
https://my-heroku-app-cn.herokuapp.com/
当然,当你访问它的时候可能我已经把它关掉了,你可以访问另一个用同样方法部署的应用的地址:
https://flasky-mini.herokuapp.com/
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》
https://help.heroku.com/
https://devcenter.heroku.com/articles/getting-started-with-python#introduction
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-02/128118.htm