如何部署Revel应用

Revel 是 Golang 的一个优秀的 Web 框架,我们平时开发测试的时候都是直接在源码环境下运行,热编译,修改完代码后不需要编译重启服务。最终在生产环境下部署的时候,也是把源码上传到服务器上,直接运行产品模式。我平时部署 Revel 应用就是用的这种方式。

但是如果是在客户的服务器上,我不想给他源代码,或者基于安全考虑,也不想在服务器上上传源代码,那么该如何做呢?下面通过一个例子来逐步讲解一下。

首先安装Revel包,假设当前目录已在 GOPATH 中。

注意

我的环境是 OS X ,命令可能会稍有不同,Windows 环境请自行调整。

go get github.com/revel/revel
go get github.com/revel/cmd/revel

创建应用 myapp :

$ ./bin/revel new myapp
~
~ revel! http://revel.github.io
~
Your application is ready:
   /Users/jimmykuu/Works/go/myapp/src/myapp

You can run it with:
   revel run myapp

启动程序测试:

$ ./bin/revel run myapp
~
~ revel! http://revel.github.io
~
INFO  2014/04/30 22:51:35 revel.go:320: Loaded module static
INFO  2014/04/30 22:51:35 revel.go:320: Loaded module testrunner
INFO  2014/04/30 22:51:35 run.go:57: Running myapp (myapp) in dev mode
INFO  2014/04/30 22:51:35 harness.go:165: Listening on :9000

打开浏览器,通过 http://localhost:9000 访问。

一般我们图方便,部署的时候可以这样。

$ ./bin/revel run myapp prod &

查看进程的话,可以看到这两个:

29539 s003  SN     0:00.05 ./bin/revel run myapp prod
29556 s003  SN     0:00.02 /Users/jimmykuu/Works/go/myapp/bin/myapp -port=9000 -importPath=myapp -runMode=prod

这样启动服务比较方便,但是也有不方便之处,比如如果想重启服务,要先杀掉进程。因为开了两个进程,也不能用 Supervisor 等进程管理工具管理。当然也可以写脚本杀掉原来的进程,再启动服务。

下面我们来尝试另一种部署方式。先看revel命令有哪些:

$ ./bin/revel help
~
~ revel! http://revel.github.io
~
usage: revel command [arguments]

The commands are:

    new         create a skeleton Revel application
    run         run a Revel application
    build       build a Revel application (e.g. for deployment)
    package     package a Revel application (e.g. for deployment)
    clean       clean a Revel application's temp files
    test        run all tests from the command-line

Use "revel help [command]" for more information.

看下build命令的帮助:

$ ./bin/revel help build
~
~ revel! http://revel.github.io
~
usage: revel build [import path] [target path]

Build the Revel web application named by the given import path.
This allows it to be deployed and run on a machine that lacks a Go installation.

WARNING: The target path will be completely deleted, if it already exists!

For example:

    revel build github.com/revel/revel/samples/chat /tmp/chat

通过 revel build [import path] [target path] 生成可执行的目录。

$ ./bin/revel build myapp myapp
~
~ revel! http://revel.github.io
~
INFO  2014/04/30 23:26:30 revel.go:320: Loaded module static
TRACE 2014/04/30 23:26:30 build.go:128: Exec: [/usr/bin/git --git-dir=/Users/jimmykuu/Works/go/myapp/src/myapp/.git describe --always --dirty]
WARN  2014/04/30 23:26:30 build.go:132: Cannot determine git repository version: exit status 128
TRACE 2014/04/30 23:26:30 build.go:77: Exec: [/usr/local/go/bin/go build -ldflags -X myapp/app.APP_VERSION "" -tags  -o /Users/jimmykuu/Works/go/myapp/bin/myapp myapp/app/tmp]

在当前目录下会生成一个myapp的目录(当然你也可以在这里使用绝对路径放到想要的目录)。里面有执行脚本 run.batrun.sh ,通过执行 ./run.sh可以发现服务跑起来了,也不需要设置 GOPATH 。但是查看 src 目录,会发现源代码都都在里面。

经过实验,源代码是可以删除的,src/myapp/app 目录下的 controllers 目录,init.go 文件,routes 目录以及 tmp 目录可以删除,如果有自己加的目录,比如 models ,也可以删除,其他的都不能删除,包括最外面的 github.com 目录。

当然你可以写个脚本,在执行完 revel build 命令后,删除这些目录和 init.go 文件即可。

上传到服务器上,执行 run.sh 或者用进程管理工具来进行管理。