Node应用的Systemd启动(转)
作者: 阮一峰
日期: 2016年3月12日
本文是独立的,不需要前面的教程作为预备知识。
一、克隆代码
首先,下载示例库。
$ 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] [path/to/node-systemd-demo]/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] [Install]
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,你会发现多出了两个模块:systemd 和 autoquit。
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 激活需要两个配置文件。
[Socket]
ListenStream=5000 [Install]
WantedBy=sockets.target
另一个是node-socket-server.service。
[Unit]
Description=node simple server (socket activation) [Service]
ExecStart=[/path/to/node/executable] [path/to/node-systemd-demo]/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
这时,socket和service都激活了。
十一、停止服务
此时,如果手动停止 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
十二、参考链接
- Ruben Vermeersch, Deploying Node.js with systemd
- Mike MacCana, How to deploy your node app on Linux, 2016 edition
参考:
http://www.ruanyifeng.com/blog/2016/03/node-systemd-tutorial.html(以上内容钻子此篇文章)
Node应用的Systemd启动(转)的更多相关文章
- 走进Linux之systemd启动过程
Linux系统的启动方式有点复杂,而且总是有需要优化的地方.传统的Linux系统启动过程主要由著名的init进程(也被称为SysV init启动系统)处理,而基于init的启动系统被认为有效率不足的问 ...
- node.js安装和启动
在Windows上安装 Node.js十分方便,我们只需要访问node.js官网http://www.nodejs.org/,点击Download链接,然后选择Windows Installer(32 ...
- Node之Express服务器启动安装与配置
首先安装express-generator cnpm i -g express-generator 使用express --version查看express版本 生成express服务 express ...
- Dockerfile 构建前端node应用cnpm命令启动nodejs服务
cat Dockerfile.node FROM centos MAINTAINER zha*****ch.cn ENV LANG en_US.UTF-8 RUN /bin/cp /usr/share ...
- systemd启动多实例
最近用了centos7,启动管理器用的是systemd,感觉很好玩. 1.开机自动启动 新建一个service文件放到/usr/lib/systemd/system/ 比如: [Unit] Descr ...
- Systemd启动图形界面过程
1 启动命令 systemctl isolate graphical.target 2 启动过程: 文件:/etc/systemd/system/graphical.target 来自:systemd ...
- node.js中pm2启动应用出错
在将公司的应用容器化时,遇到的问题. 之前,同事使用node.js 6版本运行,pm2启动js文件,一切正常. 但我一样将node.js 6版本安装,然后npm install pm2完成. 运行pm ...
- node——简单的服务器启动+乱码问题解决,响应报文头
这个是一个比较简单的代码 // 1.加载hrrp模块 var http=require('http'); // 2.创建一个http服务对象 var server=http.createServer( ...
- node整个环境的启动
1.启动mongodb服务 在 下载 / mongodb-osx- / 文件夹 新建终端窗口 ,输入命令,启动mongodb服务: mongod --dbpath data --logpath log ...
随机推荐
- springbootDay03 cookie和session 购物车技术
一.会话技术 1. 什么是会话 在计算机术语中,会话指的是客户端和服务器交互通讯的过程.简单的理解,大家可以看成是两个普通的人在打电话.一次电话从通话开始到挂断,可以看成是会话. 会话的特征 会话能够 ...
- django的F和Q对象
F表达式和Q表达式: # 示例模型如下 class Book(models.Model): """图书模型""" name = models ...
- 【bzoj3685】普通van Emde Boas树 权值zkw线段树
原文地址:http://www.cnblogs.com/GXZlegend/p/6809743.html 题目描述 设计数据结构支持:1 x 若x不存在,插入x2 x 若x存在,删除x3 输 ...
- 【BZOJ 2809 dispatching】
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4393 Solved: 2246[Submit][Status][Discuss] Descript ...
- server reached pm.max_children setting (5), consider raising it
先查看日志 /data1/server/php-cgi/var/log/php-fpm.log[19-Dec-2012 11:41:13] WARNING: [pool www] server rea ...
- vue(三)
一.vue的特点 1.响应式的数据绑定(一旦修改了数据,立马更新视图) 数据驱动思想 (数据到视图的映射.操作数据改变视图.简化对DOM的操作) 追踪依赖变化 ( Object.defineProp ...
- HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015年百度之星程序设计大赛 - 初赛(1)
题目链接 题意:给出n个矩形,求能覆盖所有矩形的最小的矩形的面积. 题解:对所有点求凸包,然后旋转卡壳,对没一条边求该边的最左最右和最上的三个点. 利用叉积面积求高,利用点积的性质求最左右点和长度 ...
- [ CodeVS冲杯之路 ] P1220
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1220/ 一个标准的DAG上的DP,设 f[i][j] 为在第 i 行第 j 最大分数 因为这个状态是无后效性的,所以可 ...
- JSP中的:request.getScheme()+"://"+request.getServerName()+":"+request.getServer
String path = request.getContextPath(); String basePath = request.getScheme()+"://"+reque ...
- 合唱队形(DP)
原题传送门 这道题目就是裸的DP题, 我们所需要得到的是一个倒V形的数列 即一个上升子序列与下降子序列的合体.. 所以我们只需要做一遍从1到n的最长上升子序列和从n到1的最长上升子序列即可 时间复杂度 ...