通过设置「uid」和「gid」实现http服务器监听80端口
http默认监听80端口,但是在*nix操作系统下,只有以root权限运行的程序才能监听1~1024范围内的端口。
所以在使用node/express开发web app时,经常指定其他端口,比如3000。跑起来了,很开心是吧。
url中添加上端口号,就可以愉快地进行测试了。
到了部署的时候,我要使用80端口…
使用root,不使用root,这是一个问题。不使用root,出现权限问题,无法监听80端口;使用root,一旦有人侵入…
还能不能愉快的开发了?!
等等,root可以做任何事,修改下「uid」和「gid」就可以了嘛。在命令行下,这事可没少干。
好了,问题解决了。
- 以
root权限运行server,监听80端口 - 修改程序的「uid」和「gid」
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// server.js
'use strict';
const http = require('http');
const cfg = require('./config.json');
http.createServer(function(req, res) {
res.writeHead(200,{
'Content-Type': 'text/plain'
});
res.end('hello port 80');
}).listen(80, function(err) {
if ( err ) {
console.error(err);
}
// 必须先更改gid,因为一旦更改了uid,就没有权限再修改gid了
process.setgid(cfg.gid); // 假定为1111
process.setuid(cfg.uid); // 假定为1111
console.log('uid:', process.getuid()); // => 1111
console.log('gid:', process.getgid()); // => 1111
});
现在使用root权限运行server
1
2
3
4
5
$ sudo node --harmony server.js
# 输出
# uid: 1111
# gid: 1111
现在在浏览器中不需要指明端口号就可以访问了。
另外也可以使用netstat进行检测
1
$ sudo netstat -antp | grep 'node'