文章来源: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安装即可。使用以下步骤将应用程序后台运行。

  1. tmux new -s gf-app
  2. 在新终端窗口中执行./gf-app即可;
  3. 使用crt + B & D快捷键可以退出当前终端窗口;
  4. 使用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

使用步骤如下:

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

二、代理部署

代理部署即前置一层第三方的WebServer服务器处理所有的请求,将部分请求(往往是动态处理请求)有选择性地转交给后端的Golang应用程序执行,后端部署的Golang应用程序可以配置有多个。这种模式常用在复杂的WebServer配置中,常见的场景例如:需要静态文件分离、需要配置多个域名及证书、需要自建负载均衡层,等等。

虽然Golang实现的WebServer也能够处理静态文件,但是相比较于专业性的WebServernginx/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-appdocker镜像。

3. 运行镜像

使用以下命令运行镜像:

docker run gf-app

4. 镜像分发

容器的分发可以使用docker官方的平台:https://hub.docker.com/ ,国内也可以考虑使用阿里云:https://www.aliyun.com/produc...

5. 容器编排

在企业级生产环境中,docker容器往往需要结合kubernetes或者docker swarm容器编排工具一起使用。
容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:

最新文章

  1. TTTAttributedLabel xib sb lineSpacing not working
  2. python模块(六)
  3. 《UML大战需求分析》阅读笔记06
  4. css3 -- 过渡与动画
  5. iOS开发----调用地图导航
  6. T-SQL 变量
  7. 会话—session
  8. Codevs 2611 观光旅游
  9. 【线段树求逆序数】【HDU1394】Minimum Inversion Number
  10. AIR
  11. jquery的冒泡事件event.stopPropagation()
  12. h1b期间回国须知
  13. 在JavaScript中使用json.js:Ajax项目之GET请求(同步)
  14. TensorFlow问题:The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
  15. 斐讯 FIR151M 频繁掉线(OpenWRT解决方案)
  16. OAuth2.0学习(1-5)授权方式2-简化模式(implicit grant type)
  17. spark2.1注册内部函数spark.udf.register("xx", xxx _),运行时抛出异常:Task not serializable
  18. linux下安装apache(httpd-2.4.3版本)各种坑
  19. Heap Partition ZOJ - 3963(贪心)
  20. cadcam

热门文章

  1. 001_Three.js中的跨域问题
  2. springboot+ehcache 基于注解实现简单缓存demo
  3. 用人话告诉小白:什么是项目管理(例如Maven),什么是调试工具(即debugger),什么是编译(即compile)
  4. 今天无意中看到了str_split这个函数
  5. IO 模型知多少
  6. 细数Java项目中用过的配置文件(YAML篇)
  7. 大O表示法是什么?
  8. 搭建环境-Eclipse配置Tomcat创建Servlet总结
  9. 分享一本Java并发编程的免费好书
  10. 使用基于vuecli创建的目录推送到指定远程分支