端口80上的linux systemd服务

时间:2016-11-29 12:20:57

标签: node.js linux centos7 systemd

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

但它仍无效。

2 个答案:

答案 0 :(得分:0)

请参阅 arkascha 在评论中提出的好建议。

首先 - 错误是什么?

您可以做些什么来测试用户无法绑定到低端口的问题是尝试使用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);
  }
});

优点:除了节点程序之外,您不需要使用任何其他内容。

缺点:你需要以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应用程序。无需弄乱路线表。

缺点:每个服务器托管多个应用程序不实用。需要使用每个系统可能无法使用的功能。

请参阅:

答案 1 :(得分:0)

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