使用 upstart 运维后台服务
本文主要针对使用Ubuntu桌面系统进行生产工作的用户,或者使用Ubuntu Service作为生产环境的运维。
Linux下有着五花八门的工具可以将一个需要长时间运行的程序转换为后台服务的工具,但是各个工具之间迥异的维护方式与部署结构以及针对目标都各有不同。因此,Linux下后台服务器的管理一直是一个问题,但是在Ubuntu (Service)下有着一个很好的解决方案:upstart。
简单的来说,upstart 就是使用简单的方式实现后台服务进程的工具。通常我喜欢使用 upstart 来将我个人编写的网页、Web应用等程序转化为独立的后台服务,其中有使用 Python 脚本编写的个人Web应用,也有使用 Node.JS 实现的博客,更有使用 Go 语言开发的小工具。
要使用 upstart 实现一个后台服务非常简单,只需要在==/etc/init==目录中建立一个服务配置文档==[service-name].conf==。具体的配置规则不谈,下面直接看几种常见的后台服务类型配置内容。
uwsgi-python 服务
对于使用 upstart 实现的基于 Flask 框架的 Python-uwsgi 后台服务而言:
- [service]:我定义的服务名称,类似于 “webapp” 等名称。
- [path-to-project]:顾名思义,项目所在路径
- /[path-to-project]/env:Python虚拟环境路径
- /[path-to-project]/[flask-app-module]:项目中基于Flask框架的具体 WebApp\网页 模块(类)
- [flask-app-instance]:项目中应用的实例,如
app=flask-app-module()
中的app。
根据以上命名,一个完整的配置文件如下:
# uWSGI for WebRazor script
description "uwsgi instance for my web app: https://qmz.me"
author "LimeQM"
# 开机自动启动与关闭
start on runlevel [2345]
stop on runlevel [016]
# 在服务关闭后自动重新加载服务
respawn
respawn limit 5 60 # respawn max 5 times in 60 seconds
# 加载服务前的动作
pre-start script
# 确保后面声称 [service].socket 文件的目录存在
if [ ! -d /run/uwsgi ]; then
mkdir /run/uwsgi
chown www-data:www-data /run/uwsgi
fi
end script
script
exec /[path-to-project]/env/bin/uwsgi \
--uid www-data \
--gid www-data \
--home /[path-to-project]/env \
--pythonpath /[path-to-project] \
--socket /run/uwsgi/[service].socket \
--chmod-socket \
--module [flask-app-module] \
--callable [flask-app-instance] \
--logdate \
--logto /var/log/uwsgi/[service].log \
--optimize 2 \
--processes 4 \
--master
end script
pre-stop script
# do nothing
end script
普通服务(Shadowsocks)
最常用的VPS服务,比如说 Shadowsocks Server ,也可以使用 upstart 实现后台服务,配置如下:
description "Shadowsocks service"
author "LimeQM - https://qmz.me"
start on runlevel [2345]
stop on runlevel[016]
respawn
respawn limit 5 60 # respawn max 5 times in 60 seconds
setuid ssuser
setgid ssuser
script
exec /usr/local/bin/ssserver -c /[path]/shadowsocks/config.json >> /dev/null 2>&1
end script
Node.js后台
本博客使用 Ghost 开源博客其中涉及到了 node.js 应用的服务化问题,其实也有很多使用 pm2、forever 等工具实现后台服务化的办法,但是依然避免不了加入开机自动启动的脚本,因此在这里可以直接使用 upstart ,简单方便。
description "Ghost service for https://blog.qmz.me"
author "LimeQM"
start on runlevel [2345]
stop on runlevel[016]
respawn
respawn limit 5 60 # respawn max 5 times in 60 seconds
pre-start script
# 等待启动数据库,避免由于未启动数据库而导致的错误
sleep 3
echo "[`date`] (sys) Starting" >> /var/log/ghost.log
end script
pre-stop script
echo "[`date`] (sys) Stoping" >> /var/log/ghost.log
end script
script
export HOME="/root"
echo $$ > /var/run/ghost.pid
exec sudo -u www-data NODE_ENV=production /usr/bin/nodejs /[path-to-Ghost]/index.js >> /var/log/ghost.log 2>&1
end script
以上。