gpt4 book ai didi

node.js - 端口 80 上的 linux systemd 服务

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:14 25 4
gpt4 key购买 nike

我尝试在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

当我使用端口8080时,服务启动成功,但是当我将端口更改为80时,服务启动失败。我尝试使用以下命令打开防火墙:

firewall-cmd --zone=public --add-port=80/tcp --permanent

但它仍然不起作用。

最佳答案

查看您在 arkascha 的评论中得到的好建议。

首先 - 错误是什么?

要测试是否是用户无法绑定(bind)到低端口的问题,您可以尝试使用 81、82、83 等端口。如果您仍然无法绑定(bind)到这些端口,则您可能没有权限。如果可以,那么这与权限无关,并且端口已被其他进程使用

要查看该用户是否可以打开给定端口,请尝试运行 netcat:

nc -l 80

其中 80 是端口号。尝试使用低端口(如 80、81、82)和高端口(如 8080、8081、8082)。

要查看是否有任何东西正在监听该端口,请尝试运行:

curl http://localhost:80/

或者:

nc localhost 80

要查看系统上打开的端口,请运行:

netstat -lnt

要查看程序的其他实例是否正在运行,请尝试:

ps aux | grep node
ps aux | grep npm
ps aux | grep server.js

如果所有其他方法均失败,您可以重新启动并查看问题是否仍然存在:

sudo shutdown -r now

这应该会给你一个干净的状态,没有旧进程挂起。

更新

无需以 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);
}
});

优点:除了 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;
}
}

优点:您不需要以 root 身份启动。您可以在同一服务器上托管多个域。您可以直接通过 nginx 提供静态内容,而无需访问 Node 应用程序。

缺点:您需要安装并运行另一个软件(例如 nginx)。

路由表

您可以使用 iptables 将端口 80 上的传入流量重定向到端口 3000:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

(您需要以 root 身份运行它)

优点:无需安装新软件。无需以 root 身份运行 Node 应用程序。

缺点:静态内容由 Node 应用程序提供。每台服务器托管多个应用程序是不切实际的。

参见:

允许非root使用低端口

这并不总是可用,但也是一种选择。您可以使用 Linux 内核中的 CAP_NET_BIND_SERVICE 功能:

CAP_NET_BIND_SERVICE

  • Bind a socket to Internet domain privileged ports (port numbers less than 1024).

优点:无需运行其他软件。无需以 root 身份启动 Node 应用程序。无需弄乱路由表。

缺点:每台服务器托管多个应用程序不切实际。需要使用并非每个系统都可用的功能。

参见:

关于node.js - 端口 80 上的 linux systemd 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40865775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com