[megoldva] FastCGI + apache2 hogy megy C nyelvű CGI vel?

Sziasztok!

Próbálnám beállítani az apache2 (sajnos ez adott) hogy FastCGI ként futtasson C nyelvű CGI programokat. Sajnos hosszu cumizás után sem sikerült futásra bírnom ezt a kombót, ezért kérnék egy kis segítséget/tanácsot.

A cél/okok: SSE (Server Sent Event) forrásnak szeretném használni az apache-ot, amiatt sok kliens csatlakozna rá és tartaná fent a kapcsolatot, így jó lenne ha nem kellene kapcsolatonként egy-egy külön szálnak döcögnie a szerveren. Elvileg a FastCGI-t lehetne erre használni ezért gondoltam C ben írok rá egy kis event providert.

Ami nem megy: Frissen teleíptett stable debian alatt lefordítottam ezt a kis C progit "gcc -lfcgi hello.c -o hello.fcgi" ként.
Telepített cuccok:
aptitude install apache2
aptitude install libfcgi
aptitude install libapache2-mod-fcgid
aptitude install fcgiwrap (Ez kell ebben a szituban?)

A leírás szerint egy .fcgi suffixal mennie kellene a proginak a "Options +ExecCGI" val ellátott helyeken,
mégsem megy. Vagy Forbiddent-t kapok vagy ezt:
"
mod_fcgid: error reading data, FastCGI server closed connection
Premature end of script headers: hello.fcgi
[debug] mod_deflate.c(700): [client 192.168.1.210] Zlib: Compressed 618 to 382 : URL /cgi-bin/hello.fcgi
[error] mod_fcgid: process /usr/lib/cgi-bin/hello.fcgi(11875) exit(communication error), get unexpected signal 11
"
vagy volt olyan hogy a bináris fájlt megkaptam a böngészőben.
Modul be van töltve:
root@debian:~# apache2ctl -M|grep fcgi
fcgid_module (shared)
Syntax OK

mods-enabled/fcgid.conf benne van:

AddHandler fcgid-script .fcgi
FcgidConnectTimeout 20

Valakinek van valami tapasztalata ezzel kapcsolatban, hogy kellene ennek működnie, azaz mit hagyok ki?

Alternatív (mentőkérdés), hogy ha nem ezt, akkor mit használnátok SSE provider-nek egy meglévő apache2+php site mellé ha sok kliensre lehet számítani?

Hozzászólások

Ha már C-ben írod, akkor nem lenne jobb apache modult írnod?

Bevallom nem is gondolkodtam apache modul írásban, mert úgy gondoltam, hogy a probléma megoldása logikailag nem a webszerver feladata hanem egy programé ami mögötte fut.
Másrészről nem hittem el, hogy egy fastcgi beizzítása ilyen lehetetlen feladat lenne...
Mint lentebb kiderült nem az, csak valami más dolog jött közbe.

probald mar ki ezt:

apache conf:
SetHandler fcgid-script
Options +ExecCGI

# service apache2 restart

# apt-get install libfcgi-dev


# cat > fastcgi_test.c
#include "fcgi_stdio.h"
#include <stdlib.h>

void main(void)
{
    int count = 0;
    while(FCGI_Accept() >= 0)
        printf("Content-type: text/html\r\n"
               "\r\n"
               "<title>FastCGI Hello!</title>"
               "<h1>FastCGI Hello!</h1>"
               "Request number %d running on host <i>%s</i>\n", 
                ++count, getenv("SERVER_NAME"));
}

CTRL+d

# gcc $INPUT.c -o $OUTPUT -lfcgi

cp $OUTPUT /var/www

Köszönöm! Bár nem úgy ahogy gondoltad (szerintem) de hozzásegítettél a probléma megoldásához!
Szkeptikus voltam az általod megadott konfig működésével kapcsolatban, mivel ezt már próbáltam, de ennek ellenére ki akartam próbálni mindent úgy ahogy leírtál egy teljesen tiszta telepítésen. És ment!

Nyomoztam, hogy akkor mégis mi lehetett a gond...
A csavar a dologban az volt, hogy az átalam használt fastcgi-s "hello world" amit fentebb linkeltem a témanyitó hozzászólásomban, és ami mellesleg az fastcgi oldaláról származik (azaz hivatalosnak tekinthető) az továbbra sem ment! Hoppá!
Ezekszerint nem a konfogom volt rossz, hanem a példaprogram!
Mivel nagyon hasonlit a tiedre nem értettem a különbséget, de mindent átírva kiderült, hogy a getenv("SERVER_HOSTNAME") -el volt a baj. Ha ez van benne a kódban az általad használt getenv("SERVER_NAME") helyett akkor internal server error van! Ez az ami engem c**ztatott végig.
Úgyhogy köszönöm szépen, és más aki így jár vigyázzon a getenv("SERVER_HOSTNAME")-el :-)

ha a problema olyan, akkor esetleg egy nem forkolo demonban is szoba johet az apache helyett (mas IP-n vagy mas porton) ...

--
"Pont attól akartam megkímélni magam, hogy gondolkodni kelljen ;)" (lajos22)

Pontosan ez lett a végső megoldás (Annak ellenére, hogy a fastcgi-t sikerült beizzítani)
Született egy C ben írt egy szálon futó aszinkron kapcsolatokat kezelő démon ami az üzenetszórást a lehető legnagyobb teljesítménnyel megoldja a befutó SSE kéréseken. Ha a külön tcp port nem játszik akkor apache2_proxy modul rádobja a kapcsolatot a megfelő portra.

Nem akarom csökkenteni az érdemeidet, de már előtte is gondolkodtam azon, hogy így csinálom meg. Amiért nem volt szimpatikus a megoldás hogy így CORS -t kellett alkalmazni vagy az apache-on átproxizni a kapcsolatokat. De végül megbarátkoztam a gondolattal/sikerült beállítani. Lehet a végleges megoldás az lesz, hogy megy a CORS külön portra, és ha nem jön össze a kapcsolat akkor fallback-el az apache-os proxira.

subscribe

* Én egy indián vagyok. Minden indián hazudik.