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 build
postinstall
task.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
의 파scripts
꼭start
에 스립에포가 포함되어 .-p $PORT
.
예package.json
NextJS는 다음과 같습니다.)
{
"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.js
2개의 파일로 나누어져 있습니다. 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
'programing' 카테고리의 다른 글
Java를 사용하여 지정된 Excel에서 특정 행의 열 수 가져오기 (0) | 2023.05.29 |
---|---|
R에서 문자열의 길이를 찾는 방법 (0) | 2023.05.29 |
메인 스토리보드 파일을 신속하게 사용하려면 앱 대리자가 창 속성을 구현해야 합니다. (0) | 2023.05.29 |
핵심 데이터의 모든 항목을 삭제/재설정하시겠습니까? (0) | 2023.05.29 |
선택한 모든 빈 셀을 텍스트로 채우는 방법을 Excel (0) | 2023.05.29 |