前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Node 应用的 Systemd 启动

Node 应用的 Systemd 启动

作者头像
ruanyf
发布2018-04-12 16:37:06
8260
发布2018-04-12 16:37:06
举报

前面的文章介绍了 Systemd 的操作命令基本用法,今天给出一个实例,如何使用 Systemd 启动一个 Node 应用。

本文是独立的,不需要前面的教程作为预备知识。

一、克隆代码

首先,下载示例库

$ git clone https://github.com/ruanyf/node-systemd-demo.git $ cd node-systemd-demo

示例脚本server.js非常简单,就是一个 HTTP 服务器。

var http = require('http'); var hostname = '0.0.0.0'; var port = 5000; http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }).listen(port, hostname, function () { console.log('Server running at http://%s:%s/', hostname, port); });

二、修改配置文件

Systemd 启动上面这个脚本,需要一个配置文件node-server.service。这个文件的文件名可以随便取,但是后缀名必须是.service

Unit Description=node simple server Service ExecStart=/path/to/node/executable/server.js Restart=always User=yourUserName Group=yourUserGroup Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/path/to/node-systemd-demo WantedBy=multi-user.target

上面脚本里面,有五个地方出现了四个占位符。

  • [/path/to/node/executable]:node可执行文件的绝对路径
  • [path/to/node-systemd-demo]:示例库的绝对路径
  • [yourUserName]:你的用户名
  • [yourUserGroup]:你的组名

你需要将上面这四个占位符,改成自己电脑的设置。下面是一个已经改好的例子。

Unit Description=node simple server Service ExecStart=/usr/bin/node /tmp/node-systemd-demo/server.js Restart=always User=nobody Group=nobody Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/tmp/node-systemd-demo Install WantedBy=multi-user.target

如果你不知道这几个占位符的值,下面的命令可以帮你找出来。

node executable path $ which node # your user name $ id -un # your group name $ id -gn

三、配置文件的解释

简单解释一下,上面的配置文件的几个参数。

Unit区块的Description字段,是服务的简单描述。

Service区块的字段含义如下。

  • ExecStart:启动命令
  • Restart:如何重启。always表示如果进程退出,总是重启
  • Environment:环境变量
  • WorkingDirectory:工作目录

Install区块的WantedBy字段指定,设为开机启动时,该服务所在的 Target 是multi-user.target

四、启动服务

现在将配置文件拷贝到 Systemd 之中。

$ sudo cp node-server.service /etc/systemd/system

接着,就启动服务。

重载配置文件 $ sudo systemctl daemon-reload # 启动服务 $ sudo systemctl start node-server

访问 http://0.0.0.0:5000,应该看到网页显示"Hello World"。

五、查看状态

如果启动失败,或者想查看日志,就要执行下面的命令。

查看状态 $ sudo systemctl status node-server # 查看日志 $ sudo journalctl -u node-server # 实时输出最新日志 $ sudo journalctl --follow -u node-server

六、重启服务和停止服务

重启服务 $ sudo systemctl restart node-server # 停止服务 $ sudo systemctl stop node-server

如果想设为开机启动,就要执行systemctl enable

$ sudo systemctl enable node-server

七、Socket 激活

一般情况下,学到这里,应该就够用了。如果你还想体验一下 Systemd 的强大功能,请接着往下读。

我们知道,HTTP服务器启动在那里,终究是耗费资源的。那么能不能做到,只有有人访问时,才启动服务,否则就关闭?

这在 Systemd 里面叫做"Socket 激活"。开发者可以指定 Socket 监听的端口,系统根据有没有收到请求,自动启动或关闭服务。不难想到,只要前面加一层负载均衡器,这就等同于实现了一个简单的云服务,即根据访问量,系统自动扩容或收缩。

下面就是"Socket 激活"的Demo。

八、安装依赖

首先,请确认前面启动的 Node 服务已经被关闭了,5000 端口已经释放出来了。

然后,打开启动脚本socket-server.js,你会发现多出了两个模块:systemdautoquit

require('systemd'); require('autoquit'); var http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }); server.autoQuit({ timeOut: 60 }); server.listen('systemd'); console.log('Server running at http://0.0.0.0:5000/');

上面代码中,systemd模块用于添加"Socket 激活",autoquit模块用于指定多少时间无人访问后,关闭 Node 服务,上面脚本是60秒。另外,还有一个journald模块,用于向 Systemd 日志添加内容,这个例子中没有使用。

现在,安装依赖。

$ npm install

九、改写配置文件

Socket 激活需要两个配置文件。

一个是node-socket-server.socket

Socket ListenStream=5000 Install WantedBy=sockets.target

另一个是node-socket-server.service

Unit Description=node simple server (socket activation) Service ExecStart=/path/to/node/executable/socket-server.js User=yourUserName Group=yourGroupName Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/path/to/node-systemd-demo

上面这个文件需要改写占位符。可以看到,由于不是开机启动,配置文件里面没有Install区块;由于不需要重启,也没有Restart字段。

改写后,将它们拷贝到 Systemd。

$ sudo cp node-socket-server.socket /etc/systemd/system $ sudo cp node-socket-server.service /etc/systemd/system

十、启动 Socket 激活

然后,执行下面两个命令,启动 Socket 激活。

$ sudo systemctl daemon-reload $ sudo systemctl start node-socket-server.socket

这个时候,检查一下状态。

$ sudo systemctl status node-socket-server.socket ● node-socket-server.socket Loaded: loaded (/etc/systemd/system/node-socket-server.socket; disabled) Active: active (listening) since 2016-03-10 20:36:41 CST; 7s ago Listen: :::5000 (Stream) $ sudo systemctl status node-socket-server.service ● node-socket-server.service - node simple server (socket activation) Loaded: loaded (/etc/systemd/system/node-socket-server.service; disabled) Active: inactive (dead)

可以看到,node-socket-server.socket是激活的(active),而node-socket-server.service没有(inactive)。

这时访问 http://0.0.0.0:5000 ,会发现网页可以正常访问。

然后,再检查一下状态。

$ sudo systemctl status node-socket-server.socket ● node-socket-server.socket Loaded: loaded (/etc/systemd/system/node-socket-server.socket; disabled) Active: active (running) since 2016-03-10 20:36:41 CST; 1min 20s ago Listen: :::5000 (Stream) $ sudo systemctl status node-socket-server.service ● node-socket-server.service - node simple server (socket activation) Loaded: loaded (/etc/systemd/system/node-socket-server.service; disabled) Active: active (running) since 2016-03-10 20:37:55 CST; 3min 11s ago Main PID: 1084 (node) CGroup: /system.slice/node-socket-server.service └─1084 node /home/ruanyf/project/node-systemd-demo/socket-server.js

这时,socketservice都激活了。

十一、停止服务

此时,如果手动停止 HTTP 服务器,Systemd 会发出一个警告。

$ sudo systemctl stop node-socket-server.service Warning: Stopping node-socket-server.service, but it can still be activated by: node-socket-server.socket

上面的警告表示,Socket 依然是激活的,因此服务随时可能被重启,所以还需要关闭 Socket 激活。

$ sudo systemctl stop node-socket-server.socket

十二、参考链接

(完)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年3月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、克隆代码
    • 二、修改配置文件
      • 三、配置文件的解释
        • 四、启动服务
          • 五、查看状态
            • 六、重启服务和停止服务
              • 七、Socket 激活
                • 八、安装依赖
                  • 九、改写配置文件
                    • 十、启动 Socket 激活
                      • 十一、停止服务
                        • 十二、参考链接
                        相关产品与服务
                        负载均衡
                        负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档