使用 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 应用的服务化问题,其实也有很多使用 pm2forever 等工具实现后台服务化的办法,但是依然避免不了加入开机自动启动的脚本,因此在这里可以直接使用 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

以上。