乐趣区

Golang项目部署

文章来源:https://goframe.org/deploymen…
一、独立部署
使用 GF 开发的应用程序可以独立地部署到服务器上,设置为后台守护进程运行即可。这种模式常用在简单的 API 服务项目中。
服务器我们推荐使用 *nix 服务器系列(包括:Linux, MacOS, *BSD),以下使用 Ubuntu 系统为例,介绍如何部署使用 GF 框架开发的项目。
1. nohup

我们可以使用简单的 nohup 命令来运行应用程序,使其作为后台守护进程运行,即使远程连接的 SSH 断开也不会影响程序的执行。在流行的 Linux 发行版中往往都默认安装好了 nohup 命令工具。命令如下:
nohup ./gf-app &
2. tmux

tmux 是一款 Linux 下的终端复用工具,可以开启不同的终端窗口来将应用程序作为后台守护进程执行,即使远程连接的 SSH 断开也不会影响程序的执行。在 ubuntu 系统下直接使用 sudo apt-get install tmux 安装即可。使用以下步骤将应用程序后台运行。

tmux new -s gf-app;
在新终端窗口中执行./gf-app 即可;
使用 crt + B & D 快捷键可以退出当前终端窗口;
使用 tmux attach -t gf-app 可进入到之前的终端窗口;

3. supervisor

supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。官方网站:http://supervisord.org/ 常见配置如下:
[program:gf-app]
user=root
command=/var/www/main
stdout_logfile=/var/log/gf-app-stdout.log
stderr_logfile=/var/log/gf-app-stderr.log
autostart=true
autorestart=true
使用步骤如下:

使用 sudo service supervisor start 启动 supervisor 服务;
创建应用配置文件 /etc/supervisor/conf.d/gf-app.conf, 内容如上;
使用 sudo supervisorctl 进入 supervisor 管理终端;
使用 reload 重新读取配置文件并重启当前 supoervisor 管理的所有进程;
也可以使用 update 重新加载配置(默认不重启),随后使用 start gf-app 启动指定的应用程序;
随后可以使用 status 指令查看当前 supervisor 管理的进程状态;

二、代理部署
代理部署即前置一层第三方的 WebServer 服务器处理所有的请求,将部分请求 (往往是动态处理请求) 有选择性地转交给后端的 Golang 应用程序执行,后端部署的 Golang 应用程序可以配置有多个。这种模式常用在复杂的 WebServer 配置中,常见的场景例如:需要静态文件分离、需要配置多个域名及证书、需要自建负载均衡层,等等。
虽然 Golang 实现的 WebServer 也能够处理静态文件,但是相比较于专业性的 WebServer 如 nginx/apache 来说比较简单,性能也较弱。因此不推荐使用 Golang WebServer 作为前端服务直接处理静态文件请求。
Nginx
我们推荐使用 Nginx 作为反向代理的前端接入层,有两种配置方式实现动静态请求的拆分。
静态文件后缀
这种方式通过文件名后缀区分,将指定的静态文件转交给 nginx 处理,其他的请求转交给 golang 应用。配置示例如下:
server {
listen 80;
server_name goframe.org;

access_log /var/log/gf-app-access.log;
error_log /var/log/gf-app-error.log;

location ~ .*\.(gif|jpg|jpeg|png|js|css|eot|ttf|woff|svg|otf)$ {
access_log off;
expires 1d;
root /var/www/gf-app/public;
try_files $uri @backend;
}

location / {
try_files $uri @backend;
}

location @backend {
proxy_pass http://127.0.0.1:8199;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其中,8199 为本地的 golang 应用 WebServer 监听端口。
例如,在该配置下,我们可以通过 http://goframe.org/my.png 访问到指定的静态文件。
静态文件目录
这种方式通过文件目录区分,将指定目录的访问请求转交给 nginx 处理,其他的请求转交给 golang 应用。配置示例如下:
server {
listen 80;
server_name goframe.org;

access_log /var/log/gf-app-access.log;
error_log /var/log/gf-app-error.log;

location ^~ /public {
access_log off;
expires 1d;
root /var/www/gf-app;
try_files $uri @backend;
}

location / {
try_files $uri @backend;
}

location @backend {
proxy_pass http://127.0.0.1:8199;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其中,8199 为本地的 golang 应用 WebServer 监听端口。
例如,在该配置下,我们可以通过 http://goframe.org/piblic/my.png 访问静态文件。
三、容器部署
容器部署即使用 docker 化部署 golang 应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。
1. 编译程序
跨平台交叉编译是 golang 的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常方便地解决了运行依赖问题。使用以下方式静态编译 Linux 平台 amd64 架构的可执行文件:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gf-app main.go
这样便编译出来一个 gf-app 的可执行文件。
2. 编译镜像
我们需要将该可执行文件 gf-app 编译生成 docker 镜像,以便于分发及部署。Golang 的运行环境推荐使用 alpine 基础系统镜像,编译出的容器镜像约为 20MB 左右。
一个参考的 Dockerfile 文件如下(可以参考 gf-home 项目的 Dcokerfile: https://github.com/gogf/gf-home):
FROM loads/alpine:3.8

LABEL maintainer=”john@johng.cn”

###############################################################################
# INSTALLATION
###############################################################################

ADD ./gf-app /bin/main
RUN chmod +x /bin/main

###############################################################################
# START
###############################################################################

CMD main
其中,我们的基础镜像使用了 loads/alpine:3.8 这个镜像,基础镜像的 Dockerfile 地址:https://github.com/johngcn/do…,仓库地址:https://hub.docker.com/u/loads
随后使用 docker build gf-app . 命令编译生成名为 gf-app 的 docker 镜像。
3. 运行镜像
使用以下命令运行镜像:
docker run gf-app
4. 镜像分发
容器的分发可以使用 docker 官方的平台:https://hub.docker.com/,国内也可以考虑使用阿里云:https://www.aliyun.com/produc…。
5. 容器编排
在企业级生产环境中,docker 容器往往需要结合 kubernetes 或者 docker swarm 容器编排工具一起使用。容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:

https://kubernetes.io/
https://docs.docker.com/swarm/

退出移动版