Wenn der nodejs-Dienst unter Linux gestartet wird, ist Port 3000 bereits verwendet.

Heute habe ich das von mir entwickelte NodeJS-Projekt auf einem Linux-Server bereitgestellt und es ist ein Fehler aufgetreten, dass Port 3000 bereits verwendet wird. Dann wurde das Programm beendet. Dann habe ich netstat -anop | grep 3000 ausgeführt und festgestellt, dass kein Prozess Port 3000 belegte. Dies ist sehr verwirrend, da ich bei der Entwicklung unter Windows noch nie ein solches Problem hatte.

Die Startdatei wird mithilfe von Express-Scaffolding generiert. Der Code lautet wie folgt und der Fehler wird hier abgefangen:

#!/usr/bin/env node
/**
 * Module dependencies.
 */

import app from '../app';
// const {app} = require('../app.ts');
var debug = require('debug')('mine-field:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

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

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port,'0.0.0.0', () => {
  console.log('Server is running on port 3000');
});
server.on('error', onError);
server.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 "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

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

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

Deshalb haben wir den internen Port für den Start auf 3001 geändert. Unerwarteterweise war der Start erfolgreich!

Dies macht die Leute noch verwirrter. Egal 3000 oder 3001, es ist kein Prozess belegt. Eine weitere Untersuchung des Codes ergab, dass es neben der Startdatei noch eine weitere Stelle gibt, die Port 3000 überwacht, um nach dem vollständigen Start des Dienstes den nächsten Schritt zu unternehmen.

// 在应用启动后运行定时器
app.listen(3000, () => {
  setInterval(modifyRouteInstanceStatus, 10000);
  syncTradeAmount()
});

Ich habe den Überwachungsport der Startdatei geändert, sodass der gesamte Dienst zwei verschiedene Ports überwacht. Könnte es sein, dass Linux nicht erlaubt, denselben Port zweimal abzuhören?
Dies ist tatsächlich der Fall. Auf Linux-Systemen ist die Überwachung der Ports durch den Kernel exklusiv, das heißt, derselbe Port kann nur von einem Prozess überwacht werden. Unsere Anwendung verwendet app.listenMethoden, um den Webserver zu starten und an Port 3000 zu binden. Dann haben wir mit http.createServerdieser Methode einen HTTP-Server erstellt und ihn an Port 3000 gebunden. Dies entspricht zwei Prozessen, die denselben Port überwachen.

Die Lösung ist auch sehr einfach: Entfernen Sie einfach einen der Listener. Ich habe hier folgenden Code gelöscht:

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port,'0.0.0.0', () => {
  console.log('Server is running on port 3000');
});

An diesem Punkt ist das Problem gelöst!
 

Acho que você gosta

Origin blog.csdn.net/gambool/article/details/135205042
Recomendado
Clasificación