如何快速使用 Heroku 来部署你的 Laravel 应用

file

很多 Laravel 新手在第一次做出一个属于自己的应用后,脑中都会自然而然的冒出一个想法:"我如何将 Laravel 应用部署到线上,让其它人可以通过访问一个 URL 在线上查看我的应用?"。

当你开始使用 Google 进行相关搜索的时候,你会发现有很多种解决方案摆在你面前。例如可以通过购买 Linode, DigitalOcean 服务器来部署应用,或者是使用一些如 Engine Yard CloudHeroku 这样的云部署服务来快速完成应用的部署上线。

而我今天想给大家介绍的是: 如何快速使用 Heroku 来部署 Laravel 应用?

什么是 Heroku?

Heroku 是一个支持多种编程语言的 PaaS(Platform-as-a-Service)。在 2010 年被 Salesforce 收购。Heroku 作为最开始的云平台之一,从 2007 年 6 月起开始开发,当时它仅支持 Ruby,后来增加了对 Java、Node.js、Scala、Clojure、Python 以及 PHP 和 Perl 的支持。

为什么选用 Heroku?

  1. Heroku 的部署上线流程异常简单。你只需要将源代码纳入到 Git 版本控制系统中即可,其它额外操作 Heroku 都会帮你自动处理好。
  2. Heroku 提供给开发者的免费套餐非常丰富。其中包括最多 5 个应用的免费创建,自定义域名的支持等。实乃良心商家。唯一的不足就是有时候在国内访问速度会比较慢。
  3. Heroku 产品服务在业内评价特别高。在 Rails 圈子中许多有经验的开发者都会使用 Heroku 来部署上线自己的 Demo 应用,其部署流程和速度都受到了 Rails 社区成员的广大好评。

Heroku 的基本安装及配置

首先我们先 注册一个 Heroku 账号

注册完成之后使用 Heroku Toolbelt 来安装 Heroku 客户端。

安装完毕后使用 heroku version 来检查当前系统是否已安装好 Heroku 客户端:

$ heroku version

如果有类似下面的输出,则代表 Heroku 客户端已成功安装:

heroku-toolbelt/3.43.9 (x86_64-darwin10.8.0) ruby/1.9.3
heroku-cli/5.2.39-010a227 (darwin-amd64) go1.6.2
You have no installed plugins.

安装成功之后,你需要使用以下命令来登录你的 heroku 账号:

$ heroku login

然后添加 SSH 密钥:

$ heroku keys:add

至此,Heroku 的基本安装及配置已完成。下一步我们开始尝试将应用部署到 Heroku 上。

将项目部署到 Heroku 上

新建一个 Laravel 项目

我们需要新建一个 Demo 项目,然后将此项目部署到线上。

$ composer create-project laravel/laravel --prefer-dist hello_laravel_heroku
$ cd hello_laravel_heroku

初始化 Git 仓库

$ git init
$ git add .
$ git commit -m "new laravel project"

创建 Procfile

要将应用部署到 Heroku 上,你需要新建一个 Procfile 文件,这个文件的作用是通过正确的配置来告诉 Heroku 应用应当使用什么命令来启动 Web 服务器。

将配置写入 Procfile 文件并将其纳入 Git 版本控制中:

$ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
$ git add .
$ git commit -m "Procfile for Heroku"

在 Heroku 上创建一个新应用

我们可以使用 heroku create 命令在 Heroku 上创建一个新应用:

$ heroku create

命令行会输出类似如下信息:

Creating mighty-hamlet-1982... done, stack is cedar-14
http://mighty-hamlet-1982.herokuapp.com/ | git@heroku.com:mighty-hamlet-1982.git
Git remote heroku added

mighty-hamlet-1982 是 Heroku 随机为应用生成的默认名称,每个人生成的名称都不相同。http://mighty-hamlet-1982.herokuapp.com/ 则是应用的线上地址。

如果你对生成的默认名称不满意,你可以使用 heroku rename 来对应用名称进行更改,但要保证更改的名称未被其它人占用。如:

$ heroku rename your-app-name

声明 buildpack

Heroku 对多种语言进行了支持,因此在应用部署的时候它会去自动检查应用的代码是用什么语言写的,然后再接着执行一系列针对该语言的操作。Laravel 的应用默认会包含 package.json 文件,但当 Heroku 检查到该文件时,它会认为此应用是用 Node.js 写的,因此我们需要对应用的 buildpack 进行声明,告诉 Heroku 我们的应用是用 PHP 写的。声明命令如下:

$ heroku buildpacks:set heroku/php

设置 APP key

Laravel 使用 App Key 来完成对用户会话及其它信息的编码加密操作,因此我们也需要将 App Key 加入到 Heroku 的配置中。

生成 App Key:

$ php artisan key:generate

将生成的 App Key 附加到此命令行后面以完成配置:

$ heroku config:set APP_KEY=…

将应用推送到 Heroku 上

接下来,让我们把代码部署到 Heroku 上:

$ git push heroku master

有如下输出则代表代码推送成功:

Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 379 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Fetching custom git buildpack... done
remote: -----> PHP app detected
remote: -----> Resolved 'composer.lock' requirement for PHP to version 5.6.14.
remote: -----> Installing system packages...
remote:        - PHP 5.6.14
remote:        - Apache 2.4.10
remote:        - Nginx 1.6.0
remote: -----> Installing PHP extensions...
remote:        - mbstring (composer.lock; bundled)
remote:        - zend-opcache (automatic; bundled)
remote: -----> Installing dependencies...
remote:        Composer version 1.0.0-alpha10 2015-04-14 21:18:51
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
...
remote:          - Installing laravel/framework (v5.1.19)
remote:            Downloading: 100%
remote:
remote:        Generating optimized autoload files
remote:        Generating optimized class loader
remote:        Compiling common classes
remote: -----> Preparing runtime environment...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing... done, 74.5MB
remote: -----> Launching... done, v5
remote:        https://mighty-hamlet-1982.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/mighty-hamlet-1982.git
   1eb2be6..1b70999  master -> master

代码推送成功之后,使用此命令可快速打开线上应用:

$ heroku open

至此,我们便完成了一个 Laravel 应用的部署,十分简单对吧!这就是为什么大家都说 Heroku 牛逼的原因!因为这他妈的确实就是牛逼!


参考文档:

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 7年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 11

Heroku 如何自动做 Rewrite rule 的呢?看上去用的是 Apache?如果要选用 Nginx 不知道该怎么办

7年前 评论
Summer

几年前整 Rails 那会,觉得 Heroku 好神奇

7年前 评论

@raywill 可参照 此文档 来指定要使用哪种服务器。

7年前 评论

@Summer Heroku 的产品服务一直做得很棒

7年前 评论
Summer

这里是 iPhone

7年前 评论

@Payne 多谢指出,已更正

7年前 评论
superwen

file

ooyee,成功。不错。挺好玩。

7年前 评论

@Aufree good,减轻很大工作量

7年前 评论

git 中heroku login 登录不上,总是报错:

file

file
这两种错误。怎么能解决呢?

6年前 评论

推送到 heroku后 除了首页能访问外 其他路由页面都是404 web容器是nginx 按heroku手册添加了自定义的nginx配置后主页也是404了

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!