Programming

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

procodes 2020. 2. 21. 22:35
반응형

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


첫 번째 node.js 앱 (로컬에서 잘 실행 됨)이 있지만 heroku를 통해 배포 할 수 없습니다 (처음에는 heroku 포함). 코드는 다음과 같습니다. 그래서 너무 많은 코드를 작성할 수 없으므로 네트워크 내에서 로컬로 코드를 실행해도 아무런 문제가 없음을 나타냅니다.

 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는 앱에 포트를 동적으로 할당하므로 포트를 고정 번호로 설정할 수 없습니다. Heroku는 포트를 env에 추가하므로 거기서 끌어 올 수 있습니다. 당신의 말을 들어주세요 :

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

그렇게하면 로컬에서 테스트 할 때 포트 5000을 계속들을 수 있지만 Heroku에서도 작동합니다.

Node.js 에서 Heroku 문서를 확인 하십시오 .


yeoman의 angular-fullstack 생성 프로젝트를 사용하고 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'));
});

Heroku가이 때 오류가 발생 포트 또는 호스트 이름 바인딩 실패 시를 server.listen(port, [host], [backlog], [callback]).

Heroku가 요구하는 것은 .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);
});

코드에서 포트를 지정하지 않으면 프로세스 가 아니web 어야하며 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


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

교체 한 문제를 해결하려면

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

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

내 경우에는 babel-plugin-transform-inline-environment-variables 플러그인 과 함께 Babel을 사용하고 있었습니다. 분명히 Heroku는 배포를 수행 할 때 PORT env 변수를 설정하지 않으므로 process.env.PORT로 대체되며 undefined코드는 Heroku가 알지 못하는 개발 포트로 대체됩니다.


나는 같은 문제가 있었고 청취 포트를 3000에서 (process.env.PORT || 5000)으로 변경하면 문제가 해결되었습니다!


아래 단계는 내 솔루션을 해결했습니다.

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");
});
...

모든 솔루션 중 내가 예상 한대로 아무 작업도 시도하지 않았습니다. 기본적으로 heroku를 공부합니다. 기본적으로 .env 파일은 규칙 PORT를 유지해야합니다. process.env.PORT, heroku는 기본적으로 키워드 PORT를 찾습니다.

APP_PORT =와 같은 이름 바꾸기를 취소하고 대신 env 파일에서 PORT =를 사용하십시오.


'localhost'를 '0.0.0.0'인 IP로 바꾸는 문제를 해결할 수있는 동일한 문제가 있습니다.


고정 번호는 포트에 설정할 수 없으며 heroku는을 사용하여 동적으로 할당합니다 process.env.PORT. 그러나 이것처럼 둘 다 추가 할 수 있습니다 process.env.PORT || 5000. Heroku는 첫 번째를 사용하고 로컬 호스트는 두 번째를 사용합니다.

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

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

heroku bash 프로세스에서 yargs와 같은 옵션 구문 분석기를 사용하여 $ PORT 값을 노드 앱으로 전달하십시오.

다음은 그 방법에 대한 예입니다. scripts 객체의 package.json 내부에 "node server --port $ PORT"시작 방법을 추가하십시오.

서버 파일에서 yargs를 사용하여 start 메소드의 포트 옵션 (--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의 동적 설정 값에 바인딩됩니다.


나처럼 package.json배포시 파일에서 스크립트를 실행하도록 Heroku를 구성하는 경우 해당 스크립트 의 값을 하드 코딩하지 않았는지 확인하십시오 PORT! 그렇게하면 나처럼 끝나고 왜이 오류가 발생했는지 알아 내려고 한 시간을 보낼 것입니다.


나는 같은 문제가 있었지만 급행 및 아폴로 서버와 관련이 있습니다. 여기 에서 해결책 :

Heroku가 서버가 배치 된 포트를 선택할 수있게하는 것이 유일한 특별 고려 사항입니다. 그렇지 않으면 요청 시간 초과와 같은 오류가있을 수 있습니다.

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

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

Procfile을 정의하지 않았기 때문에 같은 문제가 발생했습니다. 파일 확장자없이 Procfile이라는 텍스트 파일을 앱의 루트 디렉토리에 커밋합니다. 이 파일은 Heroku에게 앱을 시작하기 위해 실행할 명령을 알려줍니다.
web: node app.js


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

1) 다른 항목 파일에서 앱을 실행하기 때문에 리스너가 전혀 없으며이 실행 스크립트가 package.json "scripts"에서 삭제되었습니다.

여기에 이미지 설명을 입력하십시오

2) 'sequelize'대신 'Sequelize'의 대소 문자 구분 문제

여기에 이미지 설명을 입력하십시오


I Use ReactJs



If you want upload to heroku add this in your webpack.config.js

Because if not add you will have
error

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

//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”
 })
 ]
};

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



반응형