node.js - Node : PORT 443 requires elevated privileges error

标签 node.js ssl https pm2

我正在使用 PM2 启动应用程序,并在启动应用程序时将 PORT=443 作为参数传递。但是,它返回错误消息“PORT 443 需要提升的权限”。虽然我已经使用 openssl 生成了证书和 key 并在代码中引用了。感谢您的支持

#!/usr/bin/env node

var app = require('../app');
var debug = require('debug')('ls-templates-server:server');
var https = require('https');
var fs = require('fs');
/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);


var options = {
  key: fs.readFileSync('/home/admin/cert/server.key'),
  cert: fs.readFileSync('/home/admin/cert/server.cert')
};

var httpsServer = https.createServer(options, app);

/* for https (production stage) */

httpsServer.listen(port, "0.0.0.0");
httpsServer.on('error', onError);
httpsServer.on('listening', onListening);


/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}


/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = httpsServer.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

最佳答案

选项 1 .

sudo 运行PM2

如果不行,用authbind实现吧

sudo apt-get install authbind
sudo touch /etc/authbind/byport/443
sudo chown %user% /etc/authbind/byport/443
sudo chmod 755 /etc/authbind/byport/443

编辑~/.bashrc文件并添加

+alias pm2='authbind --deep pm2'

在文件末尾,运行

source ~/.bashrc

最后确保 pm2 使用 authbind 更新:

authbind --deep pm2 update

选项 2

使用不同的 PORT 并使用 Nginx反向代理您的应用程序

例如:将您的端口更改为 3000

在 Nginx 中,创建一个将请求转发到您的应用程序的服务器 block 。

服务器 block 例如:

server {
    #listen [::]:80;

    server_name your-domain.com

    #root /var/www/example.com;
    #index index.html;

        client_max_body_size 20M;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://localhost:3000;
      proxy_redirect off;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_connect_timeout       500000;
      proxy_send_timeout          500000;
      proxy_read_timeout          500000;
      send_timeout                500000;
    }



        listen 443 ssl;
        ssl_certificate /home/admin/cert/server.cert;
        ssl_certificate_key /home/admin/cert/server.key;


        if ($scheme = http) {
        return 301 https://$server_name$request_uri;
        }



}

最好使用Nginx/Authbind 方法,最好尽可能少地以特权用户身份运行,因为你想限制潜在的损害,以防有人利用你的程序。除非万不得已,否则您不想以 root 身份运行 Node 代码。

引用 https://pm2.keymetrics.io/docs/usage/specifics/#listening-on-port-80-w-o-root

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

关于node.js - Node : PORT 443 requires elevated privileges error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59465950/

相关文章:

node.js - 在 sequelize 中通过第三个表连接两个表

javascript - Ajax POST 到 Nodejs 给出空白对象

ruby-on-rails - 使用 HTTPS 时 Rails 服务器错误 "bad Request-Line"

node.js - socket.io 客户端和 socket.io 服务器有什么区别? socket.io 的替代品?

url - Heroku + Node.js : How to use urls with umlauts?

tomcat - 使用 maven 在 tomcat7 上使用 SSL

asp.net-mvc - ASP.NET MVC - 如何重定向安全?

java - 带客户端身份验证的 HTTPS 在 Android 上不起作用

python - python 2.7中的HTTPS请求

java - 同一 Tomcat 服务器上两个应用程序之间的双向 SSL