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”
})
]
};
'Programming' 카테고리의 다른 글
디버그 정보로 Python 오류를 어떻게 기록합니까? (0) | 2020.02.21 |
---|---|
JavaScript를 사용하여 JSON 속성에 새 속성 (요소) 추가 (0) | 2020.02.21 |
GCC에서`문자열 상수에서 'char *'`경고로 더 이상 사용되지 않는 변환을 제거하는 방법은 무엇입니까? (0) | 2020.02.21 |
Laravel에는 Mcrypt PHP 확장이 필요합니다 (0) | 2020.02.21 |
MySQL에서 하나를 제외한 모든 중복 행을 삭제 하시겠습니까? (0) | 2020.02.21 |