- Created by 郭强, last modified by 海亮 on Jul 13, 2023
使用GoFrame
开发的应用程序可以独立地部署到服务器上,设置为后台守护进程运行即可。这种模式常用在简单的API服务项目中。
服务器我们推荐使用*nix
服务器系列(包括:Linux
, MacOS
, *BSD
),以下使用Ubuntu
系统为例,介绍如何部署使用GoFrame
框架开发的项目。
*nix
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
即可; - 使用
ctrl
+B & D
快捷键可以退出当前终端窗口; - 使用
tmux attach -t gf-app
可进入到之前的终端窗口;
3. supervisor
supervisor
是用Python
开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon
,并监控进程状态,异常退出时能自动重启。官方网站:http://supervisord.org/ 常见配置如下:
[program:gf-app] user = root directory = /var/www 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
管理的进程状态;
踩坑分享经验:
conf
配置文件变更后需要在supervisorctl
中执行reload
才能更新使用到最新的配置。directory
配置一般是不能缺少的,指定当前的工作目录路径,且必须配置在command
之前。command
命令需要使用绝对路径,否则会找不到执行文件。
4. systemctl
Systemd
是 Linux
系统工具,用来启动守护进程,已成为大多数发行版的标准配置。
而 systemctl
是 Systemd
的主命令,用于管理系统。可以参考 阮一峰对于 Systemd 的解读 ,文章的第四、五章节。
其实我们大部分服务都有使用 systemctl
管理,比如 MySQL、Nginx
等等。
常见配置如下:
[Unit] # 单元描述 Description=GF APP # 在什么服务启动之后再执行本程序 After=mysql.service [Service] Type=simple # 程序执行的目录 WorkingDirectory=/data/server/gfapp/ # 启动的脚本命令 ExecStart=/data/server/gfapp/gfapp # 重启条件 Restart=always # 几秒后重启 RestartSec=5 [Install] WantedBy=multi-user.target
使用方法:
- 创建应用配置文件
/etc/systemd/system/gfapp.service
, 内容如上; - 使用
systemctl daemon-reload
重新加载服务; - 执行
systemctl start gfapp
来启动服务; - 最后执行
systemctl status gfapp
来查看服务运行的状态信息; - 执行
systemctl enable gfapp
将服务添加到开机启动项; - 注意:执行的
gfapp
是使用文件名作为服务名; - 常见的命令有:
start(启动), stop(停止), restart(重启), status(查看运行状态), enable(添加到开机启动项), disable(将程序从开机启动中移除)
5. screen
Screen
是一款由 GNU
计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen
可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
安装方式:
sudo apt install -y screen
(debian
系列)
sudo yum install -y screen
(centos
)
常用参数:
screen -S yourname
-> 新建一个叫 yourname 的 sessionscreen -ls
-> 列出当前所有的 sessionscreen -r yourname
-> 回到 yourname 这个 sessionscreen -d yourname
-> 远程detach某个 sessionscreen -d -r yourname
-> 结束当前 session 并回到 yourname 这个 session
使用方法:
- 使用命令
screen -S gfapp
创建一个 session; - 在新终端窗口中执行
./gf-app
即可; - 执行
ctrl-a, ctrl-d
暂时离开当前session; - 执行
screen -r gfapp
返回命令窗口; 若返回不成功, 可能是该窗口被占用(Attached
)了, 可以尝试使用screen -Dr gfapp
; - 执行
screen -X -S gfapp quit
结束程序;
windows
1.NSSM
- No labels
10 Comments
皛心
关于screen命令,好像和byobu功能差不多。
目前在用byobu,还不错。
杨佳佳
请问部署后,gf是单进程的吗?如果是能在部署时自定义进程数吗?
皛心
这问题问的……
go语言的goroutine,GoLang最强大的特性!
你先了解一下goroutine,然后就不会问这个问题了!
高先
多进程就会开多个端口,生产中一般不建议这样做。单台实例只部署一个进程。
lshfong
怎么在win下面部署成服务呢。现在注册成服务后,服务启动时的运行目录不在程序所在目录,怎么处理呢
lshfong
SuperLeo
supervisor下如何使用平滑重启?
apple15634145
nohup ./gf-app & 这个怎么指定config.yaml文件,我需要用的是config-prod.yaml
apple15634145
systemctl 可以指定config.yaml吗
changwj
安装一个node.js 用pm2 做为管理,作为守护进程也很方便