Используйте приложение ExpressJS через FastCGI


Только что начал работать с веб-приложениями NodeJS и у меня есть фундаментальный вопрос.

Так как я пришел из области PHP, я знаю, что в PHP есть встроенный HTTP-сервер, но на самом деле его никто не использует, и мы использовали nginx и в доисторических проектах Apache в качестве HTTP-сервера, когда я пришел в ExpressJS, я обнаружил, что все примеры, говорящие о прослушивании HTTP-сервера, который ExpressJS открывает (конечно, через модуль http NodeJS), но никто не говорит об использовании его через FastCGI (nginx -> FastCGI (например, узел-fastcgi) ->мое приложение ExpressJS) как я делал с PHP (nginx-> PHP-fpm ->мой PHP env) и мне интересно, почему?

Насколько я понял, приложение NodeJS очень быстрое, неблокирующее ввод-вывод и так далее, но в приложении есть дыра в безопасности, как показывают все, так как запущенная служба имеет одинаковые общие ресурсы в среде JavaScript, например, один пользователь может по ошибке (или нет) поделиться конфиденциальной информацией с другими. давайте предположим, что разработчик допустил такую ошибку, как это:

router.post('/set-user-cc', function(res){
    global.user = new User({
        creditCard: req.param('cc')
    });
});

И другой пользователь запрашивают так:

router.get('/get-user-cc', funciton(req, res){
    res.json(global.user);
});

На этом этапе каждый пользователь получит информацию о CC пользователя.

Использование моего приложения ExpressJS через FastCGI откроет чистую среду JavaScript для каждого HTTP-запроса, и пользователи не причинят вреда друг другу.

Будет приятно услышать от опытных разработчиков приложений для NodeJS (web), почему никто не предлагает использовать решение FastCGI (поискал в Google и почти ничего не нашел), и если да, то почему это так плохо?

(п.с. пример просто для того, чтобы продемонстрировать проблему, это не то, что кто-то на самом деле сделал, но, как мы знаем, во вселенной существует много глупых людей:)

Спасибо вам!

Author: Shlomi Sasson, 2014-05-21

1 answers

Вы не будете делать подобных ошибок, если вы напишете свой код, запускайте в строгом режиме и не используйте глобальные переменные подобным образом.

Также в веб-приложениях nodejs обычно требуется сделать сервер без состояния и сохранить все данные в базах данных. Это также сделало бы его более масштабируемой архитектурой.

В приложениях, которые очень важны с точки зрения безопасности, вы также можете провести тщательное нечеткое тестирование, чтобы найти подобные проблемы.

Если вы сделаете все это, плюс строгий процесс проверки кода, вам вообще не придется беспокоиться об этом.

В основном используя FastCGI, хотя в его названии есть fast, сравнивая его с использованием http-сервера узла, это будет очень медленно.

В решении FastCGI количество одновременных подключений, которые мы можем обрабатывать, равно количеству процессов nodejs. Из документов nodejs:

Предположим, что для каждого нового узла требуется не менее 30 мс запуска и 10 Мб памяти. То есть вы не можете создать много тысяч из них.

Таким образом, имея 1 ГБ оперативной памяти, вы можете иметь только менее 100 подключений.

На узле обычным способом http-сервера у вас не будет этой проблемы, каждое соединение займет менее 1 МБ.

Также я бы сказал, что дополнительная сложность асинхронного программирования в node.js при наличии только одного соединения на процесс это может не стоить того, потому что

Весь смысл создания узла и асинхронного ввода-вывода заключается в обработке нескольких соединений в одном процессе для эффективности, но использование FastCGI просто отбрасывает большинство преимуществ.

Единственное преимущество node с FastCGI заключается в том, что он написан на javascript. Если вы знаете только javascript или любите его так сильно и должны интегрировать его с существующим сервером FastCGI, то nodejs может быть жизнеспособным решением, иначе я не предлагаю этого делать.

И вы ошибаетесь в этом:

Использование моего приложения ExpressJS через FastCGI откроет чистую среду JavaScript для каждого HTTP-запроса и пользователи не причинят вреда друг другу.

Как вкурчаткин указано, как только процесс завершит запрос, он получит следующий запрос для обработки. Эта ошибка может произойти с помощью метода FastCGI. Я немного почитал, и весь смысл быстрой работы FastCGI заключается в том, что он повторно использует процессы, а не создает их для каждого запроса.

 3
Author: Farid Nouri Neshat, 2017-05-23 12:02:11