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.8LABEL 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/
Golang项目部署相关推荐
- view如何接受json_如何将你的 ThinkJS 项目部署到 ZEIT 上
编者按:本文作者奇舞团前端开发工程师李喆明. 什么是 ZEIT ZEIT(https://zeit.co) 是免费的云平台,支持部署静态网站以及 Serverless 函数.Serverless 是近 ...
- 如何将你的 ThinkJS 项目部署到 ZEIT 上
奇技指南 本文转载自奇舞周刊,作者奇舞团前端开发工程师李喆明. 什么是 ZEIT ZEIT(https://zeit.co) 是免费的云平台,支持部署静态网站以及 Serverless 函数.Serv ...
- go项目部署:docker部署go项目直接运行二进制文件部署(两种方式进行部署)
go项目部署:docker部署go项目&直接运行二进制文件部署 引言:之前断断续续的接触到项目部署,一直没有详细的了解部署,于是最近就好好的专研一下项目的部署,前期准备:一个自己或者别人的具有 ...
- gin项目部署到服务器并后台启动
前言 我们写好的gin项目想要部署在服务器上,我们应该怎么做呢,接下来我会详细的讲解一下部署教程. 1.首先我们要有一台虚拟机,虚拟机上安装好go框架. 2.将写好的项目上传到虚拟机上. 3.下载好项 ...
- 项目部署时网关怎么回事_使用Kubernetes部署聊天网关(或技术按预期运行时)...
项目部署时网关怎么回事 by Richard Li 理查德·李(Richard Li) 使用Kubernetes部署聊天网关(或技术按预期运行时) (Using Kubernetes to deplo ...
- 关于springboot vue前后端分离项目部署到阿里云轻量服务器(前后端分开部署)
0.购买阿里云服务器 1.安装jdk 使用yml安装 2.安装mysql 3.安装nginx 4.打包后端项目 后端项目更改: 在pom.xml文件中,增加打包成jar包的配置文件 applicati ...
- Eclipse复制或修改项目后,把项目部署后发现还是原来的项目名称
Eclipse复制或修改项目后,把项目部署后发现还是原来的项目名称 解决: 到项目根目录打开.setting文件夹,找到"org.eclipse.wst.common.component&q ...
- [项目过程中所遇到的各种问题记录]部署篇——项目部署过程中那些纠结的问题-SQLServer...
前一篇文章说了些有关IIS的,这篇则是说SQLServer的,相比IIS来说,SQLServer的配置过程中问题就少了许多,而且都比较有针对性,下面开始记录: 注:由于实际项目的开发都是基于SQL20 ...
- 获取weblogic上指定文件的路径 java_项目部署到WebLogic文件路径访问不正确
在项目中,需要将所有的ip配置在properties文件中,以便维护.在本地开发时用jetty,这个路径是可以访问的.整个过程没有问题. public static String getIp(Stri ...
最新文章
- Solr学习总结(二)Solr的安装与配置
- 前端基础之CSS_1
- 阿里云Redis开发规范[转]
- 论坛用的两个函数:积分计算排名和楼层函数
- AngularJs 1.5 $location获取url参数
- python从指定文件夹导入模块_python – 从特定文件夹导入模块
- BZOJ4321:queue2(DP)
- python可以做哪些小工具_用Python写过哪些「脑洞大开」的小工具?
- java监听键盘事件(控制台输出按键信息)
- Modelsim SE的下载和安装
- 中科软java笔试题
- 用php表单写出梯形的面积,梯形面积
- bose qc30 安静的城市是什么样子
- 孙子兵法——02 作战第二
- Java开发入门学习线路图+配套Java基础视频教程分享
- 地震点、火点和气候数据收集
- 傲游创始人陈明杰创业故事
- 北京科技大学,计算机考研情况
- 魔方三阶玩法[图解]
- B树B+树的原理和操作
热门文章
- python培训班深圳-深圳哪里有Python培训班?
- python编程实例下载-python网络编程之文件下载实例分析
- python编程自学能学会吗-Python能自学成功吗?
- python读取文件一行-Python逐行读取文件内容
- 使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用
- LeetCode 468 validate ip address(正则表达式)
- adb和adbd详尽分析
- linux学习(2)——文件和目录管理
- 阿里感悟系列文章(存)
- Android webservice的用法详细讲解