Pytanie 502 Bad Gateway Wdrażanie szablonu generatora ekspresowego na elastycznej faswie


Użyłem generatora ekspresowego, aby stworzyć prostą aplikację ekspresową, która po uruchomieniu na dev działa dobrze na localhost: 3000.

Kiedy popycham to do elastycznej fasoli za pomocą polecenia eb - git aws.push, dostaję błąd 502 na serwerze produkcyjnym.

Patrząc na logi, pojawia się błąd:

2014/04/01 19:29:40 [error] 24204#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.2.178, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "macenvexp-env-hqv9ucmzev.elasticbeanstalk.com"
2014/04/01 19:29:40 [error] 24204#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.2.178, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:8081/favicon.ico", host: "macenvexp-env-hqv9ucmzev.elasticbeanstalk.com"

Używam domyślnej konfiguracji nginx. Po uruchomieniu przykładowej aplikacji node.js bez Expressa działa poprawnie. Oto kod ekspresowy w app.js:

var express = require('express');
var http = require('http');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes');
var users = require('./routes/user');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);

app.get('/', routes.index);
app.get('/users', users.list);

/// catch 404 and forwarding to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.render('error', {
        message: err.message,
        error: {}
    });
}); 


module.exports = app;

A oto plik package.json:

{
  "name": "macEnvExp",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "DEBUG=macEnvExp node bin/www"
  },
  "dependencies": {
    "express": "~3.4.8",
    "static-favicon": "~1.0.0",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.1",
    "body-parser": "~1.0.0",
    "debug": "~0.7.4",
    "jade": "~1.3.0"
  }
}

A tutaj jest bin / www:

#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');
app.configure(function(){
app.set('port', process.env.PORT || 3000);
});
console.log(app.get('port'));
var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

56
2018-04-01 19:39


pochodzenie


Rozwiązany. Wydaje mi się, że problem polegał na tym, że AWS robiło app.js w węźle PRZED rozpoczęciem npm. node app.js nie daje błędu, ale nie otwiera żadnych portów. Rozwiązaniem była zmiana nazwy pliku app.js na cokolwiek innego (użyłem main.js) i odniesienie do bin / www. Teraz działa poprawnie. - user3486588
To rozwiązanie było niezwykle przydatne (spędziłem na tym kilka godzin). Wielkie dzięki. Proszę wyjaśnić, jak się dowiesz "AWS robił app.js węzła PRZED TYM start" - Kaya Toast
Korzystanie z ekspresu za pośrednictwem samouczka AWS docs.aws.amazon.com/elasticbeanstalk/latest/dg/... Nie tylko musiałem zmienić nazwę app.js na coś innego, ale musiałem również wskazać w pliku / bin / www: "var app = require (" ../ app "); do 'var app = require (' ../ main ');' - i2097i
Dzięki temu pomogło tona! Zrobiłem kolejny wielki i głupi błąd, gdy próbowałem to naprawić ... Używałem git aws.push, by popchnąć moje zmiany, ale nie popełniłem moich zmian w git / github. Więc naciskałem stary kod bez żadnych zmian. : / Anyways w końcu to naprawiłem z twoją pomocą. - Czy możesz zamiast tego zrobić tylko oficjalną odpowiedź? - Federico


Odpowiedzi:


Dla jasności określę odpowiedź z komentarzy.

Działa AWS ELB node app.js PRZED npm start. node app.js nie daje błędu, ale nie otwiera żadnych portów.

Rozwiązaniem jest po prostu zmienić nazwę app.js do czegokolwiek innego oprócz server.js (to znaczy main.js) i odniesienie do bin / www przez wskazanie go w pliku / bin / www: var app = require('../app'); do var app = require('../main');

To powinno działać poprawnie!


Dla jasności, oto, jak wygląda mój katalog:

The package.json plik zostanie wywołany przez ELB po uruchomieniu serwera aplikacji. Tutaj ma instrukcję uruchomienia skryptu startowego node bin/www enter image description here

To jest bin/www plik, który zostanie uruchomiony. Widzimy potrzebę ../main i app.set('port'...) enter image description here

A później main.js plik uruchamiający routing i wszystkie: enter image description here

Kiedy stworzyłem projekt, main.js plik został nazwany app.js. Przyczyną tego problemu były pierwsze sekwencje startowe ELB. ELB uruchomi aplikację i najpierw sprawdzi, czy app.js istnieje - jeśli istnieje, działa node app.js, w przeciwnym razie sprawdzi, czy package.json istnieje i próbuje uruchomić npm start. Kiedy main.js miał imię app.js ELB próbował uruchomić całą aplikację, uruchamiając ją. Jednak ten plik nie otwiera żadnych portów.


83
2017-08-15 18:04



gdzie jest ten plik / bin / www? w instancji ex2? - ovatsug25
odkryłem strukturę ekspresową 4. dosłownie w pustym folderze "test" i zaktualizowałem mój / bin / www po zmianie nazwy. wciąż nie ma kości: / - ovatsug25
Aktualizuję odpowiedź, aby pokazać strukturę katalogów. Walczyłem z tym przez jakiś czas. Używasz ELB (Elastic Beanstalk) w prawo? Katalog, który pokazuję, to wszystko, co przesyłasz do ELB. Czy przesyłasz przez github lub plik zip? W przypadku zip możesz spróbować dwóch rzeczy: zip cały folder recibelw moim cas, LUB zapakuj zawartość wewnątrz recibel. - Federico
Zmiana mojego głównego pliku z app.js na main.js rozwiązała wszystkie moje problemy. Poważnie ... dziękuję !!! - Benjamin Solum
Dziękuję za szczegółową odpowiedź. Wydaje mi się, że mam ten sam problem i postępuję zgodnie z Twoimi instrukcjami dotyczącymi konfiguracji aplikacji, ale w moim przypadku otrzymuję komunikat "Odmowa pozwolenia" podczas uruchamiania skryptu startowego "serwer / bin / www". folder główny dystrybucji pakietowej zawiera powyższy katalog serwera. Dodałem również uprawnienia exec na skrypcie www. Jakieś pomysły, dlaczego mógłbym dostać ten błąd? - lje


Alternatywa do zmiany nazwy app.js jest utworzenie elastycznego pliku konfiguracyjnego beanstalk. Dodać .config plik do .ebextensions folder, na przykład .ebextensions/34.config. Zmienić NodeCommand ustawienie w przestrzeni nazw aws:elasticbeanstalk:container:nodejs do dowolnego polecenia, które chcesz uruchomić, aby uruchomić serwer. Na przykład jest to minimalne .config plik do uruchomienia npm start zamiast app.js:

option_settings:
  - namespace: aws:elasticbeanstalk:container:nodejs
    option_name: NodeCommand
    value: "npm start"

Widzieć http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_custom_container.html i http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html#command-options-nodejs po więcej informacji.

Edytować: Jeszcze łatwiejszy sposób - używając konsoli AWS, konfiguracja / oprogramowanie ma opcję "Węzeł polecenie" - po prostu ustaw to na npm start.


27
2018-06-09 21:41



Nie chciałem zmieniać mojej ekspresyjnej struktury, więc ostateczna edycja w tej odpowiedzi była idealnym lekarstwem. Szkoda, że ​​nie jest to podkreślone w samouczkach EBS EB. - Emile
Konsola AWS, Konfiguracja / Oprogramowanie, "Polecenie Node" ustawione na "npm start" sprawdziło się doskonale! - Travis Nelson


Właściwie jest inna opcja.

Na konsoli Elastic Beanstalk w sekcji środowisko aplikacji znajduje się Konfiguracja element menu po lewej stronie (po prawej stronie opcja menu Pulpit nawigacyjny). Jeśli klikniesz tam, znajdziesz wiele opcji konfiguracji. Kliknij na Konfiguracja oprogramowania a następnie określ, który jest twój polecenie węzła. Wyjaśnia kolejność poleceń, które faktycznie próbuje: "Polecenie, aby uruchomić aplikację Node.js.Jeśli podany jest pusty ciąg, używany jest app.js, a następnie serwer.js, a następnie" npm start "w tej kolejności"

Mój błąd był w moim skrypcie poleceń startowych. Zaczął nodemon:

"scripts": {
    "start": "NODE_ENV=production && nodemon ./bin/www"

Potem zmieniłem na węzeł i zadziałało:

"scripts": {
    "start": "NODE_ENV=production && node ./bin/www"

Mam nadzieję, że pomogłem komuś.


3
2017-07-16 12:11





Ustaw port operacyjny na 8081

app.set('port', 8081);

3
2017-12-30 21:39



Pracował. Każdy pomysł, dlaczego to działa? - Zach Saucier


Na wypadek, gdyby ktoś zrobił głupią rzecz, którą zrobiłem, upewnij się, że twój folder "bin" zostanie zatwierdzony, jeśli używasz ekspresu. Miałem swój plik ".gitignore" i dlatego dostałem błąd 502.

Po prostu usuń "/ bin" z ".gitignore", commit i wdróż zmiany w EB.


2
2017-07-25 16:38





Jeśli używasz portu 8081 do uruchomienia twojej ekspresowej aplikacji i użycia sudo dla działającego serwera węzłowego, twoja aplikacja będzie dostępna bezpośrednio z adresu URL elasticbean bez numerów portów, w przeciwnym razie wyświetli 502 błąd bramki z nginx.

Domyślnie serwer proxy Nginx 8081 dla aplikacji węzła na elastibeanstalk.

Utwórz plik -.ebextensions/nodecommand.config i ustawienia opcji put poniżej -

option_settings:
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: sudo pm2 start server.js (server command with sudo ie. sudo node /bin/www)

Możesz utworzyć kolejny plik dla poleceń kontenera -.ebextensions/01_init.config i umieść żądane komendy, które będą uruchamiane przed wdrożeniem. Na przykład -

container_commands:
  01_node_v6_install:
    command: sudo curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
  02_install_node:
    command: sudo yum -y install nodejs
  03_npm_install_gulp_webpack:
    command: sudo npm install -g gulp webpack pm2
  04_npm_install:
    command: sudo npm install
  05_webpack_run:
      command: sudo webpack

2
2017-12-09 11:07





Uwaga: wpadłem na ten problem i żadne z rozwiązań nie działało dla mnie.

Moim rozwiązaniem było upewnienie się, że devDependencies w package.json były w rzeczywistości zależnościami.

Na przykład:

{
  "name": "whaler-test",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "create-db": "cd dynamodb && node createDonorsTable.js && cd ..",
    "delete-db": "cd dynamodb && node deleteDonorsTable.js && cd ..",
    "load-data": "cd dynamodb && node loadDonorsData.js && cd ..",
    "read-data": "cd dynamodb && node readDataTest.js && cd .."
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0",
    "nodemon": "1.17.5",
    "cors": "2.8.4",
    "aws-sdk": "^2.270.1"
  }
}

Nie:

{
  "name": "whaler-test",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "create-db": "cd dynamodb && node createDonorsTable.js && cd ..",
    "delete-db": "cd dynamodb && node deleteDonorsTable.js && cd ..",
    "load-data": "cd dynamodb && node loadDonorsData.js && cd ..",
    "read-data": "cd dynamodb && node readDataTest.js && cd .."
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0",
    "nodemon": "1.17.5"
  },
  devDependencies {
    "cors": "2.8.4",
    "aws-sdk": "^2.270.1"
  }
}

0
2017-07-09 08:26