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


447

첫 번째 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/');

어떤 아이디어?


여기에 코드를 게시 할 수 있습니까? http 서버를 시작하는 경우 .listen () 부분이 좋습니다.
Benjamin Gruenbaum

답변:


989

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

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

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

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


97
process.env.port가 아니라 process.env.PORT를 사용해야합니다.
gprasant

아름다운! 'websocket'모듈로 저를 위해 일했습니다.
philx_x

2
Pablo

2
고마워, 나도 일 했어 이것이 Heroku 문서에서 명확하지 않은 것에 놀랐습니다.
sidarcy

@redhotvengeance thank you .. 대소 문자를 구분하고 하루를 저장하십시오 :)
Mahendran

34

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

6
app.listen (serverPort, "localhost", function (err) {Heroku 실패. "localhost"를 "0.0.0.0"으로 전환하는데 도움이되었습니다. 감사합니다!
pubsy

31

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

따라서 Procfile특정 명령을 입력하여 읽도록 변경하십시오 .

worker: YOUR_COMMAND

CLI에서 실행하십시오.

heroku scale worker=1

1
나는 'localhost'를 IP로 '0.0.0.0'으로 대체하는 문제를 해결할 수있는 같은 문제가 있었다
Damith Asanka

2
Heroku에서 Discord 봇을 실행 중이며 루프가 발생했습니다. 슬랙, 힙챗 등의 봇에는 비슷한 문제가있을 수 있습니다.
Skylar

1
이 경로로 이동하면 리소스 탭으로 이동하여 웹 프로세스를 끄고 작업자 프로세스를 켜십시오. 그렇게하면 Heroku는 포트 바인딩을 기대하지 않습니다.
Isaac Lyman

1
오 고마워 나는 이것을 찾으려고 노력했다. Heroc에서 Procfile 측면에서 웹 및 작업자 응용 프로그램이 다르다는 것을 몰랐습니다. 그들이 start내 스크립트 를 추가해야한다고 언급 할 가치가 있습니다.package.json
Rishav

1
제 경우에는 procfile을 웹에서 작업자로 변경했습니다. 효과가 있었다 !! Thkns
rodrigorf 2016

27

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'));
});

25

포트와 호스트를 모두 통과하는 사람들에게는 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


3
이 답변은 더 완전 할뿐만 아니라 두 가지 가능한 문제를 목표로 한 유일한 답변입니다. 필자의 경우 포트 구성은 정확하지만 수신 주소는 정확하지 않습니다. 이것이 정답입니다.
Danielo515

나는 아래와 같이 변경으로 내 경우에는 그것을 작동 const port = 3000;const port = process.env.PORT || 3000; 이 Heroku가 작동
vpgodara

사실 나를 위해 일한 유일한 것은, 감사
이브라힘 모하메드

10

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

교체 한 문제를 해결하려면

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

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

그리고 process.env.PORT올바르게 지정 하지만 host매개 변수 를 사용하는 사람들은 다음과 같이 할 수 없습니다 :) 여기를 참조하십시오 : stackoverflow.com/a/34956330/626369
Dominick


2

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


1

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

내 경우에는의 일부를 꺼 냈습니다 package.json. 업데이트하면이 문제도 해결해야한다고 생각합니다.
Mark

1

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

web: node app.js

고마워, 나는 이것을하는 것을 잊었다. 이 파일이 없으면 heroku는 파일을 완전히 무시합니다.
Vladimir Despotovic


0

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

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

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

0

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

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


0

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의 동적 설정 값에 바인딩됩니다.


0

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


0

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

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

런타임시 Heroku가 정의한 포트를 사용하도록 아폴로 서버를 구성하려면 PORT 환경 변수로 정의 된 포트를 사용하여 설정 파일의 청취 기능을 호출 할 수 있습니다.

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

0

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

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

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

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

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


0

ReactJs를 사용합니다. heroku에 업로드하려면 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
 })
 ]
};

0

제 경우에는 포트도 호스트도 문제가되지 않았습니다. 는 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 앱이 예상대로 배포되었습니다.


0

내 문제는 heroku에 배포 할 때 오류가 발생한다는 것입니다.

시작 후 60 초 내에 웹 프로세스가 $ PORT에 바인딩하지 못했습니다.

heroku logs --tail터미널에서 실행할 때 . 그러나 서버를 로컬로 실행하면 응용 프로그램이 예상대로 실행됩니다.

index.js파일 (서버 파일)에 이것을 가지고 있습니다.

const PORT = process.env.port || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

그러나 이것을 가지고 있어야했다

const PORT = process.env.PORT || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

와 동일하지 않기 때문에 process.env.PORT, not을 사용하십시오 .process.env.portportPORT

gprasant에 대한 크레딧 .


0

요청 엔드 포인트에 포트 번호가 필요하지 않다는 것을 알았으므로 엔드 포인트는 herokuapp.com아니 었습니다 herokuapp.com:5000.

listen()호출은 호스트와 콜백없이 할 수 있습니다 :

server.listen(5000);

기본 포트를 사용하는 경우 URL에 포트 번호가 필요하지 않습니다. 그러면 어떻게 문제가 해결됩니까?
RalfFriedl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.