Приклад простого fastcgi-сервера і fastcgi-кліентаperl, assembler, сі - блог програміста, perl,
FastCGI-сервер на основі POE :: Component :: FastCGI і FastCGI-клієнт на основі FCGI :: Client
Що таке CGI
CGI - це стандарт, який описує, як сервер повинен запускати CGI-скрипт, як повинен передавати йому параметри HTTP-запиту, як CGI-скрипт повинен передавати результати своєї роботи сервера.
При роботі з CGI, web-сервер для обробки кожного запиту створює новий процес.
Щоб передати CGI-скрипту інформацію про надійшов запиті, web-сервер перед запуском скрипта створює для нього спеціальні змінні оточення і записує в них всю інформацію про поточний запиті.
CGI-скрипт отримує доступ до значень всіх змінних через функції операційної системи, тим самим CGI-скрипт отримує вичерпну інформацію про запит. Тіло запиту (якщо воно є) надходить на STDIN (стандартний потік введення) скрипта і має розмір - CONTENT_LENGTH байт.
Якщо CGI-скрипт хоче послати щось у відповідь, то він відправляє всі дані, що виводяться в STDOUT скрипта. Необхідно обов'язково вказати CGI-заголовок (поля Content-Type. Location. Status), порожній рядок, яка відділяє заголовок від тіла відповіді, і саме тіло відповіді, тип якого був вказаний в Content-Type.
Web-сервер, отримавши через STDOUT відповідь від CGI-скрипта, формує HTTP-відповідь і відправляє його клієнту.
Що таке FastCGI
На відміну від CGI, FastCGI використовує постійно запущені процеси для обробки безлічі запитів.
CGI-програми взаємодіють з сервером через STDIN і STDOUT запущеного процесу.
FastCGI-процеси використовують для зв'язку з сервером Unix Domain Sockets або TCP / IP. Це дає наступне перевагу над звичайними CGI-програмами: FastCGI-програми можуть бути запущені не тільки на цьому ж сервері, але і де завгодно в мережі. Також можлива обробка запитів кількома FastCGI-процесами, що працюють паралельно. Можна використовувати кілька FastCGI-серверів, розподіляючи навантаження між ними за допомогою nginx або lighttpd.
Після встановлення з'єднання FastCGI-процесу з web-сервером, між ними починається обмін даними, з використанням простого протоколу, вирішального два завдання: організація двонаправленого обміну в рамках одного з'єднання (для емуляції STDIN, STDOUT, STDERR) і організація декількох незалежних FastCGI-сесій в рамках одного з'єднання.
Всі дані, що передаються обертаються в FastCGI-записи - одиницю даних протоколу. FastCGI-записи служать для організації двонаправленого обміну і мультиплексування декількох сесій в рамках одного з'єднання.
FastCGI-запис складається з заголовка фіксованої довжини, наступного за ним вмісту і вирівнюють даних змінної довжини. Кожен запис містить 7 елементів.
Приклад простого FastCGI-сервера на основі POE-компоненти - POE :: Component :: FastCGI
Що робить FastCGI-сервер? Він постійно слухає заданий порт на предмет отримання нових запитів від web-сервера, розпаковує запис і обробляє запит. Потім відправляє відповідь назад. Web-сервера залишається тільки додати http-заголовки і відправити відповідь клієнту.