Получение ошибок «hell.php» и «502 Bad Gateway» после развертывания страницы Node.js на AWS Elastic Beanstalk - PullRequest
0 голосов
/ 28 ноября 2018

Я недавно развернул свое самое первое приложение Node.js на AWS Elastic Beanstalk.Это очень простая страница портфолио.Сайт работал без проблем в течение нескольких часов, но затем экземпляр перешел в состояние «Серьезный», и страница вернула следующее сообщение:

502 Bad Gateway nginx / 1.12.1

Сообщение об ошибке вlog был «Первый аргумент должен быть строкой или буфером».

Я перезапустил сервер приложений, и страница работала без проблем в течение 12 часов, но затем снова отключилась с тем же сообщением.Поэтому я запустил средство устранения неполадок и попробовал следующее:

Версия Node.js в Elastic Beanstalk отличалась от версии, использованной для создания моего приложения, поэтому я изменил ее на ту же версию, с которой был создан сайт (8.12.0).Перезапущен сервер приложений.Та же проблема.

Я подумал, что, возможно, у балансировщика нагрузки возникли проблемы с чтением ответа, поэтому я начал преобразовывать данные, отправленные в ответе, в строку (.toString ()), но это не помогло.И оказывается, что в моей конфигурации даже нет балансировщика нагрузки.

В документации Node для fs.readFile сказано, что метод readFile использует много памяти и вместо этого стоит рассмотреть использование readStream, поэтому я внес это изменение, но я получаю тот же результат с readStream.

Я перестроил среду и попытался снова.На этот раз страница успешно работала в течение двух дней.Затем через два дня он снова допустил ошибку с этим сообщением:

Ошибка: ENOENT: нет такого файла или каталога, откройте «public // hell.php» events.js: 183 throw er;// Необработанное событие 'error' ^

Я не использую ЛЮБОЙ php-код.Почему он ссылается на php-файл под названием «ад»?

Вот мой код в файле server.js:

const http = require("http");
const fs = require("fs");
//use AWS's default port, or if it's not available, use port 8081.
const port = process.env.PORT || 8081;
const server = http.createServer(function (req, res) {

    res.statusCode = 200;

    if (req.url == "/" || req.url == "/index.html" || req.url == "/home") {
        let readStream = fs.createReadStream("public/index.html");

        // When the stream is done being read, end the response
        readStream.on('close', () => {
            res.end();
        })

        // Stream chunks to response
        readStream.pipe(res);
    }
    else {
        let readStream = fs.createReadStream("public/" + req.url);

        // When the stream is done being read, end the response
        readStream.on('close', () => {
            res.end();
        })

        // Stream chunks to response
        readStream.pipe(res);
    }
}).listen(port);

Копия файла «public / index.html»читать fs можно по адресу: https://zurafuse.github.io/index.html

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

0 голосов
/ 30 ноября 2018

Я решил эту проблему.Оказывается, боты часто попадают на сайты AWS, такие как мой, в поисках уязвимостей, и в моем случае они пытались открыть несуществующие страницы (например, страницы Wordpress).Поэтому я изменил свой код, чтобы открыть только те существующие страницы, которые я определил, и если какие-то http-запросы приходят с неожиданностью, я возвращаю ответ «страница не найдена».С тех пор у меня не возникало проблем.

Поскольку на моем сайте постоянно возникали ошибки при попытке открыть несуществующие страницы, это приводило к сбою моего экземпляра AWS Elastic Beanstalk.А так как у меня есть бесплатная версия, она вообще не масштабируется и поэтому не очень проста.

...