Существует много путаницы о том, что такое CGI, Rack и т.д. Как я описываю here, Rack - это API, а FastCGI - это протокол. CGI также является протоколом, но в его узком смысле также реализация, и за то, о чем вы говорите, совсем не то же самое, что и FastCGI. Итак, давайте начнем с фона.
Еще в начале 90-х годов веб-серверы просто читали файлы (HTML, изображения и т. Д.) С диска и отправляли их клиенту. Люди начали делать некоторую обработку во время запроса, и раннее решение, которое появилось, состояло в том, чтобы запустить программу, которая приведет к возврату результата клиенту, а не просто чтению файла. «Протокол» для этого был для того, чтобы веб-серверу был предоставлен URL-адрес, который он был настроен для выполнения в качестве программы (например, /cgi-bin/my-script
), где веб-сервер затем установил набор переменных среды с различной информацией о запросе и запустить программу с телом запроса на стандартном входе. Это упоминалось как «Common Gateway Interface».
Учитывая, что это отклоняет новый процесс для каждого запроса, это явно неэффективно, и вы почти наверняка не хотите использовать этот стиль обработки динамических запросов на высокообъемных веб-сайтах. (Начало всего нового процесса относительно дорого в вычислительных ресурсах.)
Одним из решений для повышения эффективности является то, что вместо запуска нового процесса отправить информацию о запросе в уже существующий процесс. Это то, о чем говорит FastCGI; он поддерживает очень похожий интерфейс с CGI (у вас есть набор переменных с большей частью информации запроса и поток данных для тела запроса). Но вместо того, чтобы устанавливать фактические переменные среды Unix и запускать новый процесс с телом на stdin
, он отправляет запрос, похожий на HTTP-запрос, на сервер FCGI, уже запущенный на машине, где он указывает значения этих переменных и содержимое тела запроса ,
Если веб-сервер может иметь встроенный в него программный код, это становится еще более эффективным, поскольку он просто запускает сам код. Два классических примеров того, как вы могли бы сделать это было бы:
Have PHP встроен в Apache, так что «код сервера Apache» просто называет «код сервера PHP», который является частью одного и того же процесса; и
Не запускайте Apache вообще, но у вас есть веб-сервер в Ruby (или Python или что-то еще), а также загрузите и запустите еще один код Ruby, который был настроен для обработки запроса.
Итак, где же стойка? Rack - это API, который позволяет коду, который обрабатывает веб-запросы, получать его обычным способом, независимо от веб-сервера.Поэтому, учитывая некоторый Ruby, код для обработки запроса, который использует Rack API, веб-сервер может:
- Будьте веб-сервер на Ruby, который просто делает вызовы функций в своем собственном процессе в Rack-совместимый код, который он загружен;
- Быть веб-сервером (написанным на любом языке), который использует протокол FastCGI для разговора с другим процессом с кодом сервера FastCGI, который снова вызывает вызовы функций для совместимого с Rack кода, который обрабатывает запрос; или
- Будьте сервером, который запускает новый процесс, который интерпретирует переменные среды CGI и стандартный ввод, передаваемый ему, а затем вызывает соответствующий Rack-код.
Таким образом, независимо от того, используете ли вы CGI, FastCGI, другой протокол между процессами или протокол внутрипроцесса, не имеет значения; вы можете использовать любой из тех, кто использует стойку, пока сервер знает об этом или разговаривает с процессом, который может понимать CGI, FastCGI или что-то еще, и вызывать Rack-совместимый код на основе этого запроса.
Итак:
Для масштабирования производительности, вы определенно не хотите быть с помощью CGI; вы хотите использовать FastCGI, аналогичный протокол (например, Tomcat) или прямой вызов кода в процессе.
Если вы используете Rack API, вам не нужно беспокоиться на ранних этапах, какой протокол вы используете между вашим веб-сервером и вашей программой, потому что все точки API, такие как Rack, это то, что вы можете изменить его позже ,
+1 Хороший ответ, но стойка + Пассажир действительно проще, чем cgi? Мне кажется, что если вы используете apache, cgi примерно так же прост, как и получается. – pguardiario
Это действительно не проще, чем Rack + Passenger. Вы создаете запись «VirtualHost», у вас есть файл 'config.ru', и вы в основном выполняете. Он запускается, когда это требуется, и быстро выполняет * очень быстро. Почему вы так привязаны к использованию CGI? Это один из наименее эффективных способов решения такого рода вещей. Это похоже на вопрос: «Почему все говорят, что используют USB-накопители? Что не так с гибким диском?» – tadman