Что именно представляет собой модель веб-сервера до форка?

100

Я хочу знать, что именно означает, когда веб-сервер описывает себя как веб-сервер до форка. У меня есть несколько примеров, таких как unicorn для рубина и gunicorn для питона.

В частности, это вопросы:

  • Какую проблему решает эта модель?
  • Что происходит при первоначальном запуске веб-сервера до форка?
  • Как он обрабатывает запрос?

Также более конкретный вопрос для единорога / пулеметчика:

Допустим, у меня есть веб-приложение, которое я хочу запустить с (g) unicorn. При инициализации веб-приложение выполнит некоторые действия по инициализации (например, внесет дополнительные записи в базу данных). Если я настрою (g) unicorn с несколькими рабочими, будет ли инициализация запускаться несколько раз?

Hery
источник

Ответы:

105

Предварительный форк в основном означает, что мастер создает форки, которые обрабатывают каждый запрос. Форк - это совершенно отдельный процесс * nix.

Обновите согласно комментариям ниже. preВ pre-forkозначает , что эти процессы раздвоенными перед приходит запрос. Они могут , однако , как правило , увеличивается или уменьшается , поскольку нагрузка идет вверх и вниз.

Предварительный форк можно использовать, когда у вас есть библиотеки, которые НЕ являются потокобезопасными. Это также означает, что проблемы в запросе, вызывающие проблемы, будут влиять только на процесс, которым они обрабатываются, а не на весь сервер.

Инициализация выполняется несколько раз, все зависит от того, что вы развертываете. Однако обычно пулы соединений и тому подобное существуют для каждого процесса.

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

С такими инструментами, как Nginx, Apache 2.4 Event MPM или gevent (которые можно использовать с Gunicorn), они являются асинхронными, что означает, что процесс может обрабатывать сотни запросов, не блокируя их.

Джо Доэрти
источник
29
У меня было такое же сомнение по поводу значения слова «prefork». Я предположил, что это означало какое-то разветвление, естественно, но часть «до» сбивала меня с толку. Я обнаружил здесь abbreviations.com/prefork, что часть «pre» на самом деле означает, что рабочие процессы создаются заранее, поэтому время не тратится на разветвление только тогда, когда требуется рабочий. Для меня это имеет большой смысл :)
El Ninja Trepador
1
//, @ElNinjaTrepador, почему бы не добавить отдельный ответ? По крайней мере, для меня это было намного понятнее, и это может больше помочь другим, если этот комментарий займет более заметное место.
Натан Басанезе,
2
Я обновил ответ, чтобы добавить немного больше информации о пре в пре-форке. @ElNinjaTrepador спасибо, что указали на это, я не понимал, что это не было хорошо известно
Джо Доэрти,
1
@NathanBasanese, сэр;)
El Ninja Trepador
4
@JoeDoherty, может быть, это хорошо известно, я просто не знал об этом до того времени: Д. Я собирался добавить еще один ответ (согласно запросу Натана), но, поскольку вы добавили то, что я сказал, к вашему, в этом больше нет необходимости: )
Эль Ниндзя Трепадор