连接到上游时,NodeJS connect() 失败(111:连接被拒绝)
NodeJS connect() failed (111: Connection refused) while connecting to upstream
我 运行 今天遇到一个问题,我的 Elastic Beanstalk 应用程序突然将我转到 502 Bad Gateway
页面。现在我已经 运行 解决了这个问题,发生这种情况的原因是 Node 命令无法启动我的服务器。我通过输入 Node command: node main.js
解决了这个问题,直到今天早上 运行domly,我才 运行 解决这个问题。突然它停止工作,我在错误日志中收到此错误:
2015/03/31 13:07:17 [error] 697#0: *519 connect() failed (111: Connection refused) while connecting to upstream, client: 54.146.12.189, server: , request: "HEAD / HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "54.152.12.19"
2015/03/31 13:07:17 [error] 697#0: *521 connect() failed (111: Connection refused) while connecting to upstream, client: 54.146.18.189, server: , request: "GET /clientaccesspolicy.xml HTTP/1.1", upstream: "http://127.0.0.1:8081/clientaccesspolicy.xml", host: "54.152.12.19"
2015/03/31 13:16:02 [error] 697#0: *523 connect() failed (111: Connection refused) while connecting to upstream, client: 69.204.65.1321, server: , request: "GET /blog/the-differences-in-segmenting-your-data-by-users-and-sessions HTTP/1.1", upstream: "http://127.0.0.1:8081/blog/the-differences-in-segmenting-your-data-by-users-and-sessions", host: "www.mywebsite.com"
我应该如何解决这个问题?
这是我的 main.js
文件:
//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser'); // configure app to use bodyParser()
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var aws = require('aws-sdk');
app.use(bodyParser.urlencoded({ extended: true})); // get data from a POST method
app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(cookieParser());
var port = process.env.PORT || 8080; // set the port
var DB_CONFIG = process.env.DB_CONFIGURATION;
var AWS_ACCESS_KEY = process.env.AWS_ACCESS_KEY;
var AWS_SECRET_KEY = process.env.AWS_SECRET_KEY;
var S3_BUCKET = process.env.S3_BUCKET;
var blogDB = require('./config/blogDB.js');
mongoose.connect(blogDB.url);
require('./config/passport.js')(passport);
app.set('view engine', 'ejs'); // set ejs as the view engine
app.use(express.static(__dirname + '/public')); // set the public directory
app.use(session({ secret: 'thisisatest' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
var routes = require('./app/routes');
app.use(routes); // use routes.js
app.listen(port);
console.log('magic is happening on port' + port);
502 Bad Gateway
错误通常表明代理(在 NodeJS 的情况下为 Nginx)无法找到将流量路由到的目的地。
查看您的原始错误日志,看起来 nginx 正在尝试转到 http://127.0.0.1:8081
。但是你的 main.js
有端口 8080 作为后备,除非设置了 ENV 变量 PORT
。
我不知道您是否正在设置该变量,但请尝试将您的 NodeJS 应用程序切换为侦听端口 8081,看看是否有帮助。
此外,我写了这个解释 NodeJS 流量设置的答案,这可能会有所帮助:elastic beanstalk weird nginx configuration
如果仍有问题,您可能需要提供更多有关设置的信息。
回答
这些都指向没有 http 服务器响应,这意味着您的 http 服务器没有响应请求。
日志中指出这一点的确切部分如下。
connect() failed (111: Connection refused) while connecting to upstream
server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:
确保您已采取措施启动它,并确保在生成错误时它当前 运行。
它也可能指向 http 服务器 js 文件本身的配置错误。
要获得更好的想法,请查看 /var/log/nginx/error.log 中的错误日志。如果您看到与代理后端的连接错误,如上所示,则可能是这种情况。
查看它是否在连接到已定义的代理时遇到问题。确保节点进程管理器是 运行 并在该代理端口上正确配置。例如如果您的 运行 节点应用程序,请查找 pm2 或您用来启动 http 服务器的任何节点模块。
pm2 show
OA 假设您的支持只是配置错误,并且不清楚它背后是否需要一个完整的 http 服务器。一些用户正在尝试启动包含任务管理器的应用程序,这些任务管理器正在尝试启动已完成的事情,并且没有意识到不需要整个后端或 运行,就像我当时一样。
upstream: "http://[::1]:5555/uploads/logo/df0944721b740b98c10a652ce0dd8296-640.jpg",
如果您在将上游设置为 ipv6 时遇到错误 --> [::1],请在您的 nginx conf 中将 localhost 替换为 127.0.0.1。
server {
listen 80;
server_name mydomain.com;
location / {
client_max_body_size 20M;
client_body_buffer_size 128k;
#proxy_pass http://localhost:5552;
proxy_pass http://127.0.0.1:5552;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
我知道这是一个超级旧的 post,但我的节点服务器正在被我的托管服务提供商重新启动时遇到了同样的问题。当服务器重置时,它也会导致 mongoDB 关闭。
当使用 forever 尝试重启节点服务器时:
2018/04/12 06:49:32 [error] 23434#23434: *27 connect() failed (111: Connection refused) while connecting to upstream, client:
日志文件并未指出 mongo 是一个错误,但如果您尝试手动启动服务器:
node /server/server.js
Connection fails: MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
一旦 mongoDB 重新启动,服务器就可以重新启动:
sudo mongod &
然后只需重新启动服务器即可。
在 beantalk 应用程序的配置修改软件部分添加节点命令很重要,如果您的应用程序正在使用命令启动,请将其用作节点命令,"npm start" 这将正确启动您的应用程序,当使用文件夹和文件 bin/www 启动 Nodejs 服务器时也会发生这种情况。
在 beantalk 下,进入配置,然后进入软件,在节点命令上添加 npm start。这将是您的默认设置。 Nginx 在默认设置下工作正常
我 运行 今天遇到一个问题,我的 Elastic Beanstalk 应用程序突然将我转到 502 Bad Gateway
页面。现在我已经 运行 解决了这个问题,发生这种情况的原因是 Node 命令无法启动我的服务器。我通过输入 Node command: node main.js
解决了这个问题,直到今天早上 运行domly,我才 运行 解决这个问题。突然它停止工作,我在错误日志中收到此错误:
2015/03/31 13:07:17 [error] 697#0: *519 connect() failed (111: Connection refused) while connecting to upstream, client: 54.146.12.189, server: , request: "HEAD / HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "54.152.12.19"
2015/03/31 13:07:17 [error] 697#0: *521 connect() failed (111: Connection refused) while connecting to upstream, client: 54.146.18.189, server: , request: "GET /clientaccesspolicy.xml HTTP/1.1", upstream: "http://127.0.0.1:8081/clientaccesspolicy.xml", host: "54.152.12.19"
2015/03/31 13:16:02 [error] 697#0: *523 connect() failed (111: Connection refused) while connecting to upstream, client: 69.204.65.1321, server: , request: "GET /blog/the-differences-in-segmenting-your-data-by-users-and-sessions HTTP/1.1", upstream: "http://127.0.0.1:8081/blog/the-differences-in-segmenting-your-data-by-users-and-sessions", host: "www.mywebsite.com"
我应该如何解决这个问题?
这是我的 main.js
文件:
//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser'); // configure app to use bodyParser()
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var aws = require('aws-sdk');
app.use(bodyParser.urlencoded({ extended: true})); // get data from a POST method
app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(cookieParser());
var port = process.env.PORT || 8080; // set the port
var DB_CONFIG = process.env.DB_CONFIGURATION;
var AWS_ACCESS_KEY = process.env.AWS_ACCESS_KEY;
var AWS_SECRET_KEY = process.env.AWS_SECRET_KEY;
var S3_BUCKET = process.env.S3_BUCKET;
var blogDB = require('./config/blogDB.js');
mongoose.connect(blogDB.url);
require('./config/passport.js')(passport);
app.set('view engine', 'ejs'); // set ejs as the view engine
app.use(express.static(__dirname + '/public')); // set the public directory
app.use(session({ secret: 'thisisatest' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
var routes = require('./app/routes');
app.use(routes); // use routes.js
app.listen(port);
console.log('magic is happening on port' + port);
502 Bad Gateway
错误通常表明代理(在 NodeJS 的情况下为 Nginx)无法找到将流量路由到的目的地。
查看您的原始错误日志,看起来 nginx 正在尝试转到 http://127.0.0.1:8081
。但是你的 main.js
有端口 8080 作为后备,除非设置了 ENV 变量 PORT
。
我不知道您是否正在设置该变量,但请尝试将您的 NodeJS 应用程序切换为侦听端口 8081,看看是否有帮助。
此外,我写了这个解释 NodeJS 流量设置的答案,这可能会有所帮助:elastic beanstalk weird nginx configuration
如果仍有问题,您可能需要提供更多有关设置的信息。
回答
这些都指向没有 http 服务器响应,这意味着您的 http 服务器没有响应请求。
日志中指出这一点的确切部分如下。
connect() failed (111: Connection refused) while connecting to upstream
server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:
确保您已采取措施启动它,并确保在生成错误时它当前 运行。
它也可能指向 http 服务器 js 文件本身的配置错误。
要获得更好的想法,请查看 /var/log/nginx/error.log 中的错误日志。如果您看到与代理后端的连接错误,如上所示,则可能是这种情况。
查看它是否在连接到已定义的代理时遇到问题。确保节点进程管理器是 运行 并在该代理端口上正确配置。例如如果您的 运行 节点应用程序,请查找 pm2 或您用来启动 http 服务器的任何节点模块。
pm2 show
OA 假设您的支持只是配置错误,并且不清楚它背后是否需要一个完整的 http 服务器。一些用户正在尝试启动包含任务管理器的应用程序,这些任务管理器正在尝试启动已完成的事情,并且没有意识到不需要整个后端或 运行,就像我当时一样。
upstream: "http://[::1]:5555/uploads/logo/df0944721b740b98c10a652ce0dd8296-640.jpg",
如果您在将上游设置为 ipv6 时遇到错误 --> [::1],请在您的 nginx conf 中将 localhost 替换为 127.0.0.1。
server {
listen 80;
server_name mydomain.com;
location / {
client_max_body_size 20M;
client_body_buffer_size 128k;
#proxy_pass http://localhost:5552;
proxy_pass http://127.0.0.1:5552;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
我知道这是一个超级旧的 post,但我的节点服务器正在被我的托管服务提供商重新启动时遇到了同样的问题。当服务器重置时,它也会导致 mongoDB 关闭。
当使用 forever 尝试重启节点服务器时:
2018/04/12 06:49:32 [error] 23434#23434: *27 connect() failed (111: Connection refused) while connecting to upstream, client:
日志文件并未指出 mongo 是一个错误,但如果您尝试手动启动服务器:
node /server/server.js
Connection fails: MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
一旦 mongoDB 重新启动,服务器就可以重新启动:
sudo mongod &
然后只需重新启动服务器即可。
在 beantalk 应用程序的配置修改软件部分添加节点命令很重要,如果您的应用程序正在使用命令启动,请将其用作节点命令,"npm start" 这将正确启动您的应用程序,当使用文件夹和文件 bin/www 启动 Nodejs 服务器时也会发生这种情况。
在 beantalk 下,进入配置,然后进入软件,在节点命令上添加 npm start。这将是您的默认设置。 Nginx 在默认设置下工作正常