文章来源:https://goframe.org/deploymen...css
使用GF
开发的应用程序能够独立地部署到服务器上,设置为后台守护进程运行便可。这种模式经常使用在简单的API服务项目中。前端
服务器咱们推荐使用*nix
服务器系列(包括:Linux
, MacOS
, *BSD
),如下使用Ubuntu
系统为例,介绍如何部署使用GF
框架开发的项目。linux
nohup
咱们可使用简单的nohup
命令来运行应用程序,使其做为后台守护进程运行,即便远程链接的SSH断开也不会影响程序的执行。在流行的Linux发行版中每每都默认安装好了nohup
命令工具。
命令以下:nginx
nohup ./gf-app &
tmux
tmux
是一款Linux下的终端复用工具,能够开启不一样的终端窗口来将应用程序做为后台守护进程执行,即便远程链接的SSH断开也不会影响程序的执行。
在ubuntu
系统下直接使用sudo apt-get install tmux
安装便可。使用如下步骤将应用程序后台运行。git
tmux new -s gf-app
;./gf-app
便可;crt
+ B & D
快捷键能够退出当前终端窗口;tmux attach -t gf-app
可进入到以前的终端窗口;supervisor
supervisor
是用Python
开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon
,并监控进程状态,异常退出时能自动重启。官方网站:http://supervisord.org/
常见配置以下:github
[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
使用步骤以下:golang
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
配置中,常见的场景例如:须要静态文件分离、须要配置多个域名及证书、须要自建负载均衡层,等等。docker
虽然Golang
实现的WebServer
也可以处理静态文件,可是相比较于专业性的WebServer
如nginx
/apache
来讲比较简单,性能也较弱。所以不推荐使用Golang WebServer
做为前端服务直接处理静态文件请求。
Nginx
咱们推荐使用Nginx
做为反向代理的前端接入层,有两种配置方式实现动静态请求的拆分。apache
这种方式经过文件名后缀区分,将指定的静态文件转交给nginx
处理,其余的请求转交给golang
应用。
配置示例以下:ubuntu
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
应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。
跨平台交叉编译是golang
的特色之一,能够很是方便地编译出咱们须要的目标服务器平台的版本,并且是静态编译,很是方便地解决了运行依赖问题。
使用如下方式静态编译Linux
平台amd64
架构的可执行文件:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gf-app main.go
这样便编译出来一个gf-app
的可执行文件。
咱们须要将该可执行文件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
镜像。
使用如下命令运行镜像:
docker run gf-app
容器的分发可使用docker
官方的平台:https://hub.docker.com/ ,国内也能够考虑使用阿里云:https://www.aliyun.com/produc... 。
在企业级生产环境中,docker
容器每每须要结合kubernetes
或者docker swarm
容器编排工具一块儿使用。
容器编排涉及到的内容比较多,感兴趣的同窗能够参考如下资料: