Система: Debian GNU/Linux 9.2 (stretch)
1) apt-get install libfcgi-dev - Устанавливаем необходимую библиотеку
2) Код приложения
#include <pthread.h>
#include <stdio.h>
//#include <fcgi_config.h>
#include <fcgiapp.h>
#define THREAD_COUNT 8
#define SOCKET_PATH "127.0.0.1:47777"
static int socketId; //хранит дескриптор открытого сокета
static void *doit(void *a) {
int rc, i;
FCGX_Request request;
char *server_name;
if(FCGX_InitRequest(&request, socketId, 0) != 0) { //ошибка при инициализации структуры запроса
printf("Can not init request\n");
return NULL;
}
printf("Request is inited\n");
for(;;) {
static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
printf("Try to accept new request\n"); //попробовать получить новый запрос
pthread_mutex_lock(&accept_mutex);
rc = FCGX_Accept_r(&request);
pthread_mutex_unlock(&accept_mutex);
if(rc < 0) { //ошибка при получении запроса
printf("Can not accept new request\n");
break;
}
printf("request is accepted\n");
server_name = FCGX_GetParam("SERVER_NAME", request.envp); //!!!!Разобраться с объектом request
char str[]="<html><head><title>FCGI C-бэкенд</title></head><body><h1 style=\"color:navy;\">Привет, Сайт работает на Си, библиотека libfcgi-dev.</h1></body></html>";
//вывести все HTTP-заголовки (каждый заголовок с новой строки)
FCGX_PutS("Content-type: text/html; charset=UTF-8\r\n", request.out);
FCGX_PutS("X-Powered-By: C lang + FCGI \r\n", request.out);
FCGX_PutS("Server: Noname \r\n", request.out);
FCGX_PutS("\r\n", request.out); //между заголовками и телом ответа нужно вывести пустую строку
FCGX_PutS(str, request.out);
FCGX_Finish_r(&request); //закрыть текущее соединение
//завершающие действия - запись статистики, логирование ошибок и т.п.
}
return NULL;
}
int main(void) {
int i;
pthread_t id[THREAD_COUNT];
FCGX_Init(); //инициализация библилиотеки
printf("Lib is inited\n");
socketId = FCGX_OpenSocket(SOCKET_PATH, 20); //открываем новый сокет
if(socketId < 0) { //ошибка при открытии сокета
return 1;
}
printf("Socket is opened\n");
for (i = 0; i < THREAD_COUNT; i++) { //создаём рабочие потоки
pthread_create(&id[i], NULL, doit, NULL);
}
for(i = 0; i < THREAD_COUNT; i++) { //ждем завершения рабочих потоков
pthread_join(id[i], NULL);
}
return 0;
}
3) Компилируем приложение:
gcc -o web -lfcgi -lpthread web.c
web - приложение, web.c - файл с иходным кодом
4) Запускаем приложение (помним про разрешение на запуск)
./web
5) Конфиг nginx
server {
listen 80;
server_name testc;
location / {
include fastcgi_params;
fastcgi_pass 127.0.0.1:47777;
}
}
6)
Наслаждаемся выводом нашего приложения:
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Sat, 14 Oct 2017 21:43:18 GMT
Server: Noname
Transfer-Encoding: chunked
X-Powered-By: C lang + FCGI
"Литература"
https://habrahabr.ru/post/216181/
https://habrahabr.ru/post/154187/
http://cppcms.com/wikipp/en/page/main
http://www.webtoolkit.eu/wt
https://github.com/lmovsesjan/Fastcgi-Daemon