【问题标题】:linux systemd service on port 80linux systemd 服务在 80 端口
【发布时间】:2017-04-13 10:37:40
【问题描述】:

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

但还是不行。

【问题讨论】:

  • 好吧,要么您没有绑定到该端口的权限,要么它已被其他服务使用。
  • 我是 root,当我运行节点服务器而不是从端口 80 上的服务时,它的工作..
  • 所以剩下我命名的另一个选项,不是吗?或者root没有有权限绑定到那个端口,如果使用 SELinux 扩展可能就是这种情况。
  • 我会说首先找出另一个服务是否已经在使用该端口。通过查明该系统是否使用 SELinux 扩展。另一种简单的方法是查看日志文件。如果您手动启动该服务,我希望这些日志文件甚至会被提及。 你调查过这些吗?他们说什么?
  • 在您对我提到的其他方面做出反应之前,没有进一步的评论。

标签: node.js linux centos7 systemd


【解决方案1】:

查看 arkascha 在 cmets 中获得的好建议。

首先 - 有什么错误?

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

要查看该用户是否可以打开给定端口,请尝试运行 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

  • 将套接字绑定到 Internet 域特权端口(端口 小于 1024 的数字)。

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

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

见:

【讨论】:

  • 我尝试使用用户 weeki 而不是 root 运行该服务。现在我用root运行服务并且成功了。我怎样才能让用户 weeki 在端口 80 上运行服务?
  • @rontoDay 我添加了一些使用用户“weeki”监听端口 80 的方法 - 请参阅我的更新答案。
【解决方案2】:

用户应该有root权限才能打开1024以下的端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2012-09-09
    • 2021-10-11
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多