FastCGI mit Lazarus

Alle Fragen zur Netzwerkkommunikation
Antworten
Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

FastCGI mit Lazarus

Beitrag von Warf »

Hey ho Leute,

ich arbeite aktuell an einem kleineren Projekt was einen HTTP Server beinhaltet, und da ich PHP überhaupt nicht leiden kann wollte ich einfach mal FastCGI probieren. Dafür habe ich das Package WebLaz installiert, und ein neues Projekt von dem CustomFastCGI Template erstellt:

Code: Alles auswählen

program fcgiproject1;
 
{$mode objfpc}{$H+}
 
uses
  Classes,SysUtils,httpDefs,custfcgi;
 
Type
  TFCGIApp = Class(TCustomFCGIApplication)
  Public
    Procedure HandleRequest(ARequest : Trequest; AResponse : TResponse); override;
  end;
 
Procedure TFCGIApp.HandleRequest(ARequest : Trequest; AResponse : TResponse);
 
begin
  // Your code here
end;
 
begin
  With TFCGIApp.Create(Nil) do
    try
      Initialize;
      Run;
    finally
      Free;
    end;
end.


Nur meckert der jetzt dass die funktion HandleRequest in der Superklasse nicht exsistiert.

Die andere Option ist das Template FastCGI application, aber sobald ich eine solche Anwendung starte bekomme ich die Exception Failed to open input-handle passed from server.

Da zu diesem Thema praktisch keine Dokumentation existiert, wollte ich mal fragen ob sich einer von euch eventuell damit auskennt, und mir eventuell sagen könnte wie zur Hölle dieser Spaß funktioniert. (Kleine Information, ich verwende Nginx, und würde gerne Sockets im Dateisystem verwenden statt einer IP und Port)

Außerdem, wie schaut es aus mit Threading? So wie es auschaut unterstützt die CustomFastCGI Lösung kein Multithreading, wie schaut es mit der FastCGI Application Lösung aus.

Oder gibt es eventuell eine Dokumentation und ich bin nur zu blöd sie zu finden?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: FastCGI mit Lazarus

Beitrag von m.fuchs »

Warf hat geschrieben:Die andere Option ist das Template FastCGI application, aber sobald ich eine solche Anwendung starte bekomme ich die Exception Failed to open input-handle passed from server.

Das muss auch so sein, du sollst die Applikation auch nicht selber starten. Das macht der Webserver und baut dabei gleich die passenden Streams zu dem FCGI-Prgramm auf.

Zum lokalen Testen würde ich eine HTTP-Server-Applikation bauen und danach die Module in eine FCGI-Applikation transferieren.

Warf hat geschrieben:Oder gibt es eventuell eine Dokumentation und ich bin nur zu blöd sie zu finden?

Hier zum Beispiel: http://wiki.freepascal.org/fcl-web
FCGI ist dort nicht beschrieben, aber da programmiert man genauso wie eine CGI -Anwednung und tauscht nur die eine Unit aus.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FastCGI mit Lazarus

Beitrag von Warf »

Danke für die Antwort, eventuell könnte man den Wiki Eintrag ein wenig ergänzen, zumindest mit der Information das CGI, FastCGI und Webserver einfach austauschbar sind.

ich habe mittlerweile auch Rausgefunden das ich mit Application.Port den Port setze das meine Anwendung als Standalone laufen kann (wie es nginx benötigt). Das ist in dem Projekttemplate von Lazarus 1.9 beschrieben (in 1.6.4 stand davon nichts drin), und jetzt funktioniert es auch ganz gut.

Dennoch bleibt die Frage, kann ich irgendwie statt einem Port einen socket im Filesystem verwenden wie das z.B. php-fpm macht?

Und zu der HTTP Server Idee, ich bekomme da den Fehler: Error: No action name and no default action, mit dem selben code der mit FastCGI mittlerweile funktioniert. Aber naja solange es mit nginx mit FastCGI funktioniert ist das nicht das größte Problem

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: FastCGI mit Lazarus

Beitrag von mschnell »

m.fuchs hat geschrieben:Das muss auch so sein, du sollst die Applikation auch nicht selber starten. Das macht der Webserver und baut dabei gleich die passenden Streams zu dem FCGI-Prgramm auf.


Wenn ich mich recht erinnere, kann FastCGI sowohl über eine DLL bzw so - Schnittstelle als auch über einen TCP/IP Port (oder eine auch Pipe ? ) laufen.

Bei DLL/so startet der Server das CGI-Programm, über TCP/IP muss (oder kann) es schon laufen.

Ich würde DLL/so nicht machen, weil es schwierig sein kann, ein Library Objekt zu debuggen.

-Michael

Devstructor
Beiträge: 32
Registriert: Mi 7. Sep 2016, 18:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: FastCGI mit Lazarus

Beitrag von Devstructor »

Hi,

probiere doch erstmal CGI. CGI wird von einer großen Auswahl an Webservern unterstützt und ist für den Anfang einfacher einzurichten, bei Apache wird das CGI-Modul default installiert.

Zu dem Thema Multithreading:
* Bei CGI ist Mutlithreading gegeben, da für jede Anfrage ein eigener Prozess gestartet wird. Das klingt im ersten Sinne schlimm, doch das ganze passiert schnell.
* Bei FastCGI ist Multithreading ab einer gewissen Größe gegeben. Obwohl eine FastCGI-Anwendung geöffnet bleibt und mehrere Anfragen bearbeitet, werden mehrere Instanzen dieser Anwendung ausgeführt. Beispielsweise könnte man den Webserver konfigurieren, max. 10 FastCGI Instanzen parallel auszuführen. Das hat den Grund, dass der Webserver sonst keine Anfragen beantworten kann, wenn eine einzelne FastCGI Anwendung z.B. gerade auf eine Datenbank wartet.

Nach meiner Erfahrung lässt sich CGI einfacher als FastCGI einrichten, lässt sich gut auf verschiedenen Plattformen ausführen und ist trotzdem schnell genug. Ich habe zwar noch nicht so viel mit CGI gemacht, weil ich ansonsten datenbankbasierte Webseiten direkt in der DB über PSQL generiere und für komplexere Web Applications habe ich sonst Node.JS genutzt, da ich PHP über alles verachte. In der Vergangenheit habe ich paar Mechanismen, APIs und ein Captcha Modul mit CGI entwickelt.

Bei CGI wird häufig eingewandt, dass es zu langsam wäre, aber für meine vergangenen Zwecke war das vollkommen gut. In einem Projekt hatte ich weine Web-API mit Lazarus programmiert, die Operationen in der Datenbank ausführt. Das bedeutet: Anfrage auswerten -> DB Clientlib laden -> DB-Verbindung aufbauen -> DB-Query ausführen -> Anwortdokument in JSON generieren -> Dokument übermitteln. Überwiegend wartet die Anwendung auf die Datenbank, daher ist CGI etwa so schnell wie PHP. Hier Performance-Messungen, bei der die Anzahl der Nutzer inkrementiert wurde:
Bild
www.devstructor.com Devstructor.com - Lazarus Tutorials and more

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FastCGI mit Lazarus

Beitrag von Warf »

CGI wollte ich nicht verwenden da FPC Executeables recht groß sind (im vergleich zu gcc) und daher habe ich gedacht um Memory usage zu sparen, sowie die entsprechenden Ladezeiten, dass ich dafür das FCGI verwende, wenn es mit weblaz anscheinend recht einfach sein soll.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: FastCGI mit Lazarus

Beitrag von Soner »

Ich bin keine Experte bei fpWEb aber ich habe im Winter bißchen damit gespielt und ich habe auch nginx verwendet.
Wenn du dein fcgi-programm aufrufst und eine Meldung wie "Error: Could not determine HTTP module for request "" " bekommst, dann ist der Aufruf falsch. Man muss etwa so aufrufen:
http://127.0.0.1:8080/dein_fcgi/DeinModulActionName
aber das funktioniert bei mir nicht, weil ich nginx ist für einen anderen Aufruf eingestellt habe.
Siehe für Beispiele in:
fpc\3.0.2\source\packages\fcl-web\examples\

Das einfachste Besipiel ist echo, das Funktioniert immer, wenn fcgi-Version von echo bei dir nicht läuft, dann hast du nginx nicht richtig eingestellt.

Ich habe damals PascalScript-FastCGI-Bespiel erstellt. Das war so wie php.exe und .php-Dateien. Mein fcgi-Programm hat psp-Dateien(Pascalscript-Dateien) ausgeführt, alles lief über nginx.

Antworten