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
容器编排工具一起使用。
容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:
Golang项目部署的更多相关文章
- gin项目部署到服务器并后台启动
前言 我们写好的gin项目想要部署在服务器上,我们应该怎么做呢,接下来我会详细的讲解一下部署教程. 1.首先我们要有一台虚拟机,虚拟机上安装好go框架. 2.将写好的项目上传到虚拟机上. 3.下载好项 ...
- jsp项目部署
每新建一个项目都要发布到服务器,也就是项目部署,在tomcat中的 tomcat\Tomcat 6.0\webapps 路径下就会新建你的项目文件夹 webapps是tomcat的默认访问路径,很 ...
- javaWeb项目部署到阿里云服务器步骤
记录web项目部署到阿里云服务器步骤 (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以 ...
- Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)
在IDEA中将项目部署到本地Tomcat下进行运行并验证整合结果 (1).点击如下图所示的下拉按钮,弹出Edit Configurations...后点击该项. (2).跳出如下界面后,点击红框内的& ...
- SSIS2012 项目部署模型
SSIS 2012 支持两种部署模型:项目部署模型和包部署模型. 使用项目部署模型可以将项目部署到 Integration Services 服务器,使用包部署模型可以将单独的包部署到Integrat ...
- 项目部署到tomcat Root中后导致 WebApplicationContext 初始化两次的解决方法
上一篇文章刚说项目部署到tomcat的ROOT中,今天就发现一个问题.通过eclipse启动tomcat时候,WebApplicationContext 初始化两次: 现象: 通过eclipse控 ...
- 百度BAE JAVA环境项目部署和调试
起初在一个应用挂在虚拟主机上,昨天早上虚拟主机挂了.本来考虑迁移到SAE上的,但之前发现SAE的JVM云豆消耗的太快(PS:我是中级开发者,每月 10000云豆,如果有哪位大神对SAE JAVA云豆能 ...
- 如何正确的将J2ee项目部署到Tomcat
如何正确的将J2ee项目部署到Tomcat 1.打开配置文件(我的如下:C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\serv ...
- SSIS 项目部署模型
微软 BI 系列随笔 - SSIS 2012 基础 - SSIS 项目部署模型 关于部署 SSIS 2012 支持两种部署模型:项目部署模型和包部署模型. 使用项目部署模型可以将项目部署到 Integ ...
随机推荐
- 1011 World Cup Betting (20 分)
With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...
- PTA数据结构与算法题目集(中文) 7-26
PTA数据结构与算法题目集(中文) 7-26 7-26 Windows消息队列 (25 分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生, ...
- SI24R2F新一代2.4G超低功耗单发射有源RFID芯片 SI24R2E升级版智能充电安全管理方案首选
目前全国有很多电动车因在充电时电池温度过高,而导致爆炸引起火灾的情况.作为国内RFID行业的推动者,动能世纪联合中科微向IOT应用领域推出新款大功率2.4G射频芯片,并针对电动车防盗.电动车充电桩市场 ...
- Mac下Web切图常用PS快捷命令
Mac下 Z 放大镜 双击放大镜 图片会回到100%大小 C 切片工具 B 画笔 alt 在B模式下 吸取颜色 M 选区(默认) 点击第二次M 矩形选区 可以固定大小 shift+c ...
- list[列表]的使用
#!/usr/bin/env python3# -*- coding:utf-8 -*-# name:zzyushop_list = [["手机",5000], ["电脑 ...
- 【DataBase】 在Windows系统环境 下载和安装 解压版MySQL数据库
MySQL官网解压版下载地址:https://dev.mysql.com/downloads/mysql/ 为什么不推荐使用安装版?无脑下一步,很多配置的东西学习不到了 点选第一个就好了,下面的是调试 ...
- D. AB-string
https://codeforces.com/contest/1238/problem/D 题目大意:统计good string的个数,good string的定义,给定的字符串中含有回文段落, 题解 ...
- 原创hadoop2.6集群环境搭建
三台机器: Hmaster 172.168.2.3.Hslave1 172.168.2.4.Hslave2 172.168.2.6 JDK:1.8.49 OS:red hat 5.4 64 (由于后期 ...
- tensorflow-参数、超参数、卷积核权值共享
根据网上查询到的说法,参数就是在卷积神经网络中可以被训练的参数,比如卷积核的权值和偏移等等,而超参数是一些预先设定好并且无法改变的,比如说是卷积核的个数等. 另外还有一个最最基础的概念,就是卷积核的权 ...
- ExceptionInChainedOperatorException:flink写hbase对于null数据导致数据导致出现异常
使用的flink版本:1.9.1 异常描述 需求: 从kafka读取一条数据流 经过filter初次筛选符合要求的数据 然后通过map进行一次条件判断再解析.这个这个过程中可能返回null或目标输出o ...