Быстрый старт - lmovsesjan/Fastcgi-Daemon GitHub Wiki

В этом разделе будет рассмотрена установка FastCGI-демона в связке с nginx. Также будет разработан модуль обработки запроса и описан способ его подключения к демону.

Установка nginx

Установим nginx командой:

$ sudo apt-get install nginx

Конфигурационный файл, который будет направлять запросы ко всем ресурсам сервера в FastCGI-демон, будет выглядеть следующим образом:

$ cat /etc/nginx/sites-enabled/fastcgi-daemon.conf

server {
  listen 80;

  location / {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    fastcgi_pass unix:/tmp/fastcgi_daemon.sock;
  }
}

fastcgi_pass должен указывать на тот же сокет, который будет использоваться FastCGI-демоном.

Перезапустим NGINX командой:

$ service nginx restart

Установка FastCGI-демона

Для установки FastCGI-демона воспользуемся командой:

$ sudo apt-get install fastcgi-daemon2-init libfastcgi-daemon2-dev libfastcgi2-syslog

Пусть компонент (<component>), который будет разработан далее, называется csimple, а размещаться он будет в модуле (<module>) csimple_module, который в свою очередь будет находиться в библиотеке libcsimple.so. Пусть также этот компонент будет обработчиком (<handler>) запросов, направляемых к ресурсу /csimple_res. Компонент будет реализован классом SimpleClass, который будет предоставляться демону как фабрика simple_factory. В этом случае конфигурационный файл FastCGI-демона будет выглядеть следующим образом:

<?xml version="1.0"?>
<fastcgi xmlns:xi="http://www.w3.org/2001/XInclude">
<pools>
    <pool name="main" threads="1" queue="1"/>
</pools>
<handlers>
    <handler pool="main" url="/simple_res">
        <component name="csimple"/>
    </handler>
</handlers>
<components>
    <component name="csimple" type="csimple_module:simple_factory"/>
    <component name="daemon-logger" type="logger:logger">
       <level>INFO</level>
        <ident>fastcgi-test</ident>
    </component>
</components>
<modules>
    <module name="csimple_module" path="/fastcgi/csimple/libcsimple.so"/>
    <module name="logger" path="/usr/lib/fastcgi2/fastcgi2-syslog.so"/>
</modules>
<daemon>
    <logger component="daemon-logger"/>
    <endpoint>
        <backlog>128</backlog>
        <socket>/tmp/fastcgi_daemon.sock</socket>
        <threads>1</threads>
    </endpoint>
    <pidfile>/tmp/fastcgi_daemon.pid</pidfile>
    <monitor_port>20011</monitor_port>
</daemon>
</fastcgi>

Модуль logger (компонент daemon-logger) необходим для логгирования и подключается всегда. Сохраним этот конфигурационный файл как csimple.conf.

Разработка приложения

Пусть приложение на любой запрос отвечает пакетом с заголовком Simple-Header. Код этого обработчика будет выглядеть следующим образом:

#include <fastcgi2/component.h>
#include <fastcgi2/component_factory.h>
#include <fastcgi2/handler.h>
#include <fastcgi2/request.h>

#include <iostream>

class SimpleClass : virtual public fastcgi::Component, virtual public fastcgi::Handler {

public:
        SimpleClass(fastcgi::ComponentContext *context) :
                fastcgi::Component(context) {
        }
        virtual ~SimpleClass() {
        }

public:
        virtual void onLoad() {
        }
        virtual void onUnload() {
        }
        virtual void handleRequest(fastcgi::Request *request, fastcgi::HandlerContext *context) {

                //Здесь размещается код обработки запроса

                request->setHeader("Simple-Header", "Reply from csimple");
        }

};

FCGIDAEMON_REGISTER_FACTORIES_BEGIN()
FCGIDAEMON_ADD_DEFAULT_FACTORY("simple_factory", SimpleClass)
FCGIDAEMON_REGISTER_FACTORIES_END()

Сохраним в файле SimpleClass.cpp и скомпилируем:

$ g++ SimpleClass.cpp -fPIC -lfastcgi-daemon2 -shared -o libcsimple.so

Разместим libcsimple.so в каталоге /fastcgi/csimple И запустим FastCGI-Daemon командой:

$ fastcgi-daemon2 --config=csimple.conf

Проверим работоспособность примера:

$ curl -v "http://localhost/simple_res"

> GET /simple_res HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.2.1
< Date: Wed, 28 Nov 2012 07:02:04 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
< Simple-Header: Reply from csimple

В ответе присутствует заголовок "Simple-Header: Reply from csimple", который говорит об успешности проверки.

⚠️ **GitHub.com Fallback** ⚠️