programing

Heroku + node.js 오류(웹 프로세스가 시작 후 60초 이내에 $PORT에 바인딩하지 못함)

megabox 2023. 5. 29. 10:29
반응형

Heroku + node.js 오류(웹 프로세스가 시작 후 60초 이내에 $PORT에 바인딩하지 못함)

첫 번째 node.js 앱(로컬에서 정상적으로 실행됨)이 있지만 herku를 통해 배포할 수 없습니다.코드는 아래와 같습니다. 그래서 제가 코드를 많이 쓸 수 없기 때문에, 제 네트워크 내에서 로컬로 코드를 실행하는 것은 문제가 없다고 말씀드리고 싶습니다.

 var http = require('http');
 var fs = require('fs');
 var path = require('path');

 http.createServer(function (request, response) {

    console.log('request starting for ');
    console.log(request);

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    console.log(filePath);
    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
    }

    path.exists(filePath, function(exists) {

        if (exists) {
            fs.readFile(filePath, function(error, content) {
                if (error) {
                    response.writeHead(500);
                    response.end();
                }
                else {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                }
            });
        }
        else {
            response.writeHead(404);
            response.end();
        }
    });

 }).listen(5000);

 console.log('Server running at http://127.0.0.1:5000/');

감 잡히는 게 없어요?

Heroku는 앱 포트를 동적으로 할당하므로 포트를 고정된 숫자로 설정할 수 없습니다.헤로쿠는 포트를 환경에 추가하므로 거기서 포트를 끌 수 있습니다.듣기를 다음으로 전환합니다.

.listen(process.env.PORT || 5000)

그렇게 하면 로컬에서 테스트할 때 포트 5000을 계속 청취할 수 있지만 Heroku에서도 작동합니다.중요 참고 - PORT 단어는 대문자여야 합니다.

여기에서 Node.js의 Heroku 문서를 확인할 수 있습니다.

코드가 포트를 지정하지 않으면 프로세스가 아니어야 하며 아마도worker대신 처리합니다.

그래서, 당신의 것을 바꾸세요.Procfile다음을 읽습니다(특정 명령을 위한 특정 명령어를 입력합니다.

worker: YOUR_COMMAND

CLI에서도 실행할 수 있습니다.

heroku scale worker=1

포트와 호스트를 모두 통과하는 사용자의 경우 Heroku는 다음에 바인딩되지 않습니다. localhost.

하셔야 합니다. 0.0.0.0주최의

올바른 포트를 사용하고 있는 경우에도 마찬가지입니다.우리는 다음과 같이 조정해야 했습니다.

# port (as described above) and host are both wrong
const host = 'localhost';
const port = 3000;

# use alternate localhost and the port Heroku assigns to $PORT
const host = '0.0.0.0';
const port = process.env.PORT || 3000;

그런 다음 평소와 같이 서버를 시작할 수 있습니다.

app.listen(port, host, function() {
  console.log("Server started.......");
});

자세한 내용은 여기에서 확인할 수 있습니다. https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

오류는 Heroku가 포트 또는 호스트 이름을 바인딩하지 못했을 때 발생합니다.server.listen(port, [host], [backlog], [callback]).

한 것은 헤쿠에게필것은한요로것▁what은▁is..listen(process.env.PORT)또는.listen(process.env.PORT, '0.0.0.0')

따라서 일반적으로 다른 환경을 지원하려면 다음을 사용합니다.

var server_port = process.env.YOUR_PORT || process.env.PORT || 80;
var server_host = process.env.YOUR_HOST || '0.0.0.0';
server.listen(server_port, server_host, function() {
    console.log('Listening on port %d', server_port);
});

yoman의 angular-full stack generated project를 사용하고 IP 파라미터를 제거하는 과정에서 동일한 문제가 발생했습니다.

이 코드를 교체했습니다.

server.listen(config.port, config.ip, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

와 함께

server.listen(config.port, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

저의 경우, https://hapijs.com/ 의 예제를 사용하고 있었습니다.

교체한 문제를 해결하기 위해

server.connection({ 
    host: 'localhost', 
    port: 8000 
});

와 함께

server.connection({
    port: process.env.PORT || 3000 
});

이 라인을 변경합니다.

app.listen(port);

로.

app.listen(process.env.PORT, '0.0.0.0');

그건 작동할 것이다.

여기에 있는 대부분의 답변은 유효하지만, 저에게 문제는 제가 긴 프로세스를 실행하고 있다는 것이었습니다.npm run start시간 초과의 원인이 되었습니다.

저는 여기서 해결책을 찾았고 요약하자면, 저는 단지 이동해야 했습니다.npm run buildpostinstalltask.task.task.

다시 말해, 나는 이것을 바꿨습니다.

"start": "npm run build && node server.js"

대상:

"postinstall": "npm run build",
"start": "node server.js"

생각해보면, 제 앱이 계속 성장하면서 이 오류(간헐적으로 나타나곤 했던)가 점점 더 흔해지고 있었기 때문에 완전히 일리가 있습니다.

에서 3000으로 하는 중(process.env.PORT || 5000)문제를 해결했습니다.

헤로쿠의 모든 다이노스를 다시 시작한 것이 저에게 도움이 되었습니다.

여기에 이미지 설명 입력

저의 경우, 저는 바벨 플러그인 변환 인라인 환경 변수 플러그인과 함께 바벨을 사용하고 있었습니다.Heroku는 배포를 수행할 때 PORT env 변수를 설정하지 않으므로process.env.PORT으로 됩니다.undefined그리고 당신의 코드는 헤로쿠가 아무것도 모르는 개발 포트로 되돌아갈 것입니다.

요청 끝점에서 포트 번호가 필요하지 않다는 것을 깨달았기 때문에 끝점이herokuapp.com그리고 아닌herokuapp.com:5000.

listen()호스트 및 콜백이 없는 콜일 수 있습니다.

server.listen(5000);

나는 ReactJs를 사용합니다. 만약 당신이 herku에 업로드하고 싶다면, 이것을 당신의 webpack.config.js에 추가하세요.

추가하지 않으면 오류가 발생하기 때문입니다.

오류 R10(부팅 시간 초과) -> 웹 프로세스가 시작 후 60초 이내에 $PORT에 바인딩하지 못했습니다.

//webpack.config.js add code like that

const HtmlWebPackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
var server_port = process.env.YOUR_PORT || process.env.PORT || 5000;
var server_host = process.env.YOUR_HOST || "0.0.0.0";

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"]
      }
    ]
  },
  devServer: {
    disableHostCheck: true,
    contentBase: "./ dist",
    compress: true,
    inline: true,
    port: server_port,
    host: server_host

  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "index.html"
    }),
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css"
    })
  ]
};

정의하지 않았기 때문에 동일한 문제가 있었습니다.Procfile을 커밋합니다. 이름은 이커름디텍파밋입니다.Procfile실행해야 이 파일은 Heroku에게 앱을 시작하기 위해 실행할 명령을 알려줍니다.

web: node app.js

package.json:

...
"engines": {
"node": "5.0.0",
"npm": "4.6.1"
},
...

그리고.Server.js:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...

저는 근본 원인을 찾기 위해 많은 시간을 소비했고, 결국 이 제한 시간(60초)을 조정할 수 있다는 것을 알게 되었습니다.여기서 60초를 120초 이상으로 변경할 수 있습니다.그것은 나에게 효과가 있어요, 희망은 다른 누구에게도 도움이 될 거예요!

이 문제를 해결하려면 패키지의 네 가지 간단한 단계를 수행합니다.json 파일:

1 - 기본 필드를 서버 파일로 설정합니다.

"main": "server.js" // <-- here set you server file

2 - host 파라미터를 app.listen 함수에 추가합니다.

const port = process.env.PORT || 3000;
const host = '0.0.0.0'
app.listen(port, host, ()=> connsole.log(`server is running on port ${port}`)

3- 패키지에 설치 후 스크립트를 추가합니다.json 파일

"scripts": {
     "postinstall": "npm run build", // <-- add this line
     "start": "node server.js" // <-- change server.js to you main file
}

4 - 패키지에 엔진 필드를 추가합니다.json 파일

"engines": {
   "node": ">=14.0.O", // <-- change it to your node version. you can "node -v" in you command line
   "npm": ">=7.7.0" // <-- change this to your npm version. you can use "npm -v" in the command line to get your npm version
}

만약 당신이 이것으로 성공한다면 저에게 알려주세요!

사용하다process.env.PORT || 3000당신의 항구를 위하여.

사용 가능한 경우 Heroku의 포트를 사용하거나 사용할 수 없는 경우 포트 3000을 사용합니다(예: 로컬 테스트).

3000을 원하는 대로 변경할 수 있습니다(예: 8080).

의 신의에서.package.json의 파scriptsstart에 스립에포가 포함되어 .-p $PORT.

package.jsonNextJS는 다음과 같습니다.)

{
  "private": true,
  "scripts": {
    "dev": "next dev -p 3001",
    "build": "next build",
    "start": "next start -p $PORT" // make sure to have -p $PORT in here
  },
  "dependencies": {
    "typescript": "^4.3.2"
  },
  "devDependencies": {
    "@next/eslint-plugin-next": "^11.1.2",
    "@types/mongoose": "^5.11.97"
    "typescript": "^4.3.2"
  }
  "license": "MIT"
}

'localhost'를 '0.0.0.0' IP로 교체할 때 해결할 수 있는 동일한 문제가 있었습니다.

저의 경우 포트도 호스트도 문제가 되지 않았습니다.index.js2개의 파일로 나누어져 있습니다. server.js:

//server.js
const express = require('express')
const path = require('path')

const app = express()

app.use(express.static(path.resolve(__dirname, 'public')));
// and all the other stuff
module.exports = app

//app.js
const app = require('./server');
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0', () => {
    console.log('Server is running s on port: ' + port)
});

package.json우리는 달렸습니다.node app.js.

분명히 그것이 문제였습니다.두 가지를 하나의 파일로 결합하자 예상대로 Heroku 앱이 배포되었습니다.

나는 같은 문제를 가지고 있지만 내 환경 변수는 잘 설정되어 있고 npm과 노드의 버전은 package.json에 명시되어 있습니다.저의 경우 헤로쿠가 패키지에 "시작"을 지정해야 하기 때문이라는 것을 알게 되었습니다.json:

  "scripts": {
    "start": "node index.js"
  }

이것을 내 패키지에 추가한 후에.Json 내 노드 앱이 Heroku에 성공적으로 배포되었습니다.

애플리케이션을 개발하는 동안 다음과 같은 방법으로 PORT를 정의해야 합니다.

const port = process.env.PORT || 4000; // PORT must be in caps

그리고 앱을 서버에 배포하는 동안 다음 방법을 추가합니다.

app.listen(port, () => {
 console.info("Server started listening.");
});

호스트 이름을 로컬에서 실행하는 동안 두 번째 매개 변수로 전달할 수 있습니다.그러나 서버에 배포하는 동안 호스트 이름 매개 변수를 제거해야 합니다.

app.listen(port, hostName, () => {
  console.info(`Server listening at http://${hostName}:${port}`);
});

시작할 때 데이터베이스 스크립트를 실행하고 있어서 시간이 오래 걸린 경우입니다.는 이것을 수동으로 실행하여 해결했습니다.npm start배포가 완료된 후에

된 숫자를 수 없습니다. herku는 포트에 고정된 를 사용하여 동적으로 합니다.process.env.PORT 둘 다 수요, 요.process.env.PORT || 5000헤로쿠는 첫 번째 것을 사용하고 로컬 호스트는 두 번째 것을 사용합니다.

콜백 기능도 추가할 수 있습니다.아래 코드를 보십시오.

app.listen(process.env.PORT || 5000, function() {
    console.log("Server started.......");
});

제가 시도한 모든 솔루션 중 아무도 예상대로 작동하지 않습니다. 저는 기본적으로 herku를 연구합니다. .env File은 convention PORT인 process.env를 유지해야 합니다.PORT. 기본적으로 herku가 키워드 PORT를 찾습니다.

APP_PORT=와 같은 이름 변경을 취소하고 대신 env 파일에서 PORT=를 사용합니다.

herkubash 프로세스에서 yarg와 같은 옵션 파서를 사용하여 $PORT의 값을 노드 앱에 전달합니다.

여기 당신이 그것을 하는 방법의 예가 있습니다.스크립트 개체의 패키지 내부.json, "node server --port $PORT" 시작 방법을 추가합니다.

서버 파일에서 yarg를 사용하여 시작 방법의 포트 옵션(--port $PORT)에서 값을 가져옵니다.

const argv = require('yargs').argv;
const app = require('express')();

const port = argv.port || 8081;

app.listen(argv.port, ()=>{
    console.log('Probably listening to heroku $PORT now ', argv.port); // unless $PORT is undefined, in which case you're listening to 8081.
});

이제 앱이 시작되면 동적으로 설정된 $PORT 값에 바인딩됩니다.

만약, 나처럼, 당신이 Heroku가 당신의 컴퓨터에서 스크립트를 실행하도록 구성하고 있다면,package.json때 하지 않았는지 확인하십시오.PORT그대서에! 만약 저처럼 발생하는지 입니다.만약 그렇다면, 여러분은 저처럼 되고 왜 이런 오류가 발생하는지 알아내기 위해 한 시간을 보내게 될 것입니다.

저는 익스프레스와 아폴로 서버와 같은 문제가 있었습니다.여기서 제공하는 솔루션:

특별히 고려해야 할 사항은 herku가 서버가 배포되는 포트를 선택할 수 있도록 하는 것입니다.그렇지 않으면 요청 시간 초과와 같은 오류가 발생할 수 있습니다.

런타임에 Heroku가 정의한 포트를 사용하도록 Apollo-server를 구성하려면 PORT 환경 변수에 의해 정의된 포트를 사용하여 설정 파일의 수신 기능을 호출할 수 있습니다.

> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });

제 경우에는 두 가지 문제가 있었습니다.

다른 항목 파일에서 앱을 실행하고 있기 때문에 수신기가 전혀 없으며 이 실행 스크립트가 패키지에서 삭제되었습니다.json "sun"

여기에 이미지 설명 입력

'Sequelize'가 아닌 'Sequelize'에 대한 대소문자 구분 문제

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/15693192/heroku-node-js-error-web-process-failed-to-bind-to-port-within-60-seconds-of

반응형