См.также
В отличие от 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 элементов.
Nginx
Примечание
Nginx доступен по адресу http://localhost:8080/
1 2 3 4 5 6 7 8 9 10 11 | # default.nginx
server {
listen 80 default_server;
root /usr/share/nginx/html;
index index.html index.htm;
include includes/fcgi.nginx;
include includes/static.nginx;
} |
1 2 3 4 5 6 7 | # fcgi.nginx
location /fastcgi_hello {
# host and port to fastcgi server
include fastcgi.conf;
fastcgi_pass 172.17.0.89:5000;
} |
fastcgi_param
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
С
Примечание
Компиляция gcc -o hello.fcgi hello.cpp -lfcgi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /*
* hello.cpp
* Copyright (C) 2015 uralbash <root@uralbash.ru>
*
* Distributed under terms of the MIT license.
*/
#include "fcgi_stdio.h"
#include <stdlib.h>
int main(void)
{
while(FCGI_Accept() >= 0)
{
printf("Content-type: text/html\r\nStatus: 200 OK\r\n\r\nHello World!");
}
return 0;
} |
Запуск fcgi сервера на 5000 порту
spawn-fcgi -p 5000 -n hello.fcgi
Примечание
Пример доступен по адресу http://localhost:8080/fastcgi_hello