ron*_*Day 1 linux node.js systemd centos7
我尝试在centos7上创建systemd服务:
[Unit]
Description=Node.js Weeki Server
Requires=After=mongod.service
[Service]
ExecStart=/usr/bin/node /var/node/myapp/bin/www
Restart=always
StandardOutput=syslog # Output to syslog
StandardError=syslog # Output to syslog
SyslogIdentifier=nodejs-weeki
User=weeki
Environment=NODE_ENV=production PORT=80
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
当我使用端口 8080 时,服务启动成功,但是当我将端口更改为 80 时,服务启动失败。我尝试使用以下命令打开防火墙:
firewall-cmd --zone=public --add-port=80/tcp --permanent
Run Code Online (Sandbox Code Playgroud)
但它仍然无法正常工作。
请参阅您在arkascha的评论中得到的好建议。
首先 - 错误是什么?
您可以做些什么来测试用户无法绑定到低端口的问题是尝试使用 81、82、83 等端口。如果您仍然无法绑定到这些端口,那么您可能没有权限. 如果可以,那么这与权限无关,并且该端口已被其他某些进程使用。
要查看您是否可以通过该用户打开给定端口,请尝试运行 netcat:
nc -l 80
Run Code Online (Sandbox Code Playgroud)
其中 80 是端口号。尝试使用 80、81、82 等低端口和 8080、8081、8082 等高端口。
要查看是否有任何内容正在侦听该端口,请尝试运行:
curl http://localhost:80/
Run Code Online (Sandbox Code Playgroud)
或者:
nc localhost 80
Run Code Online (Sandbox Code Playgroud)
要查看系统上的开放端口,请运行:
netstat -lnt
Run Code Online (Sandbox Code Playgroud)
要查看程序的其他实例是否正在运行,请尝试:
ps aux | grep node
ps aux | grep npm
ps aux | grep server.js
Run Code Online (Sandbox Code Playgroud)
如果一切都失败了,您可以重新启动并查看问题是否仍然存在:
sudo shutdown -r now
Run Code Online (Sandbox Code Playgroud)
这应该给你一个干净的状态,没有旧的进程闲逛。
在不以 root 身份运行的情况下,您可以做什么来侦听端口 80。您可以做以下几件事:
您可以以 root 身份启动并在打开端口后立即删除权限:
app.listen(80, function () {
try {
process.setuid('weeki');
process.setgid('weeki');
console.log('Listening on port 80');
console.log('User:', process.getuid(), 'Group:', process.getgid());
} catch (e) {
console.log('Cannot drop privileges');
process.exit(1);
}
});
Run Code Online (Sandbox Code Playgroud)
优点:除了 Node 程序,你不需要使用任何东西。
缺点:您需要以 root 身份启动。
看:
您的 Node 应用程序可以侦听像 3000 这样的高端口,并且您启动 nginx 或其他 Web 服务器来侦听端口 80 并将请求代理到端口 3000。
nginx 配置示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Run Code Online (Sandbox Code Playgroud)
优点:您不需要以 root 身份启动。您可以在同一台服务器上托管多个域。您可以直接通过 nginx 提供静态内容,而无需点击您的 Node 应用程序。
缺点:您需要安装并运行另一个软件(如 nginx)。
您可以使用以下命令将端口 80 上的传入流量重定向到端口 3000 iptables:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
Run Code Online (Sandbox Code Playgroud)
(你需要以root身份运行它)
优点:无需安装新软件。无需以 root 身份运行 Node 应用程序。
缺点:静态内容由您的 Node 应用程序提供。每台服务器托管多个应用程序是不切实际的。
看:
这并不总是可用,但也是一种选择。您可以在 Linux 内核中使用 CAP_NET_BIND_SERVICE 功能:
CAP_NET_BIND_SERVICE
- 将套接字绑定到 Internet 域特权端口(端口号小于 1024)。
优点:无需运行其他软件。无需以 root 身份启动 Node 应用程序。无需弄乱路由表。
缺点:在每台服务器上托管多个应用程序不切实际。需要使用并非在每个系统上都可用的功能。
看:
| 归档时间: |
|
| 查看次数: |
8523 次 |
| 最近记录: |