FastCGI mit Lazarus

Alle Fragen zur Netzwerkkommunikation

FastCGI mit Lazarus

Beitragvon Warf » 26. Jun 2017, 12:26 FastCGI mit Lazarus

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?
Warf
 
Beiträge: 920
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon m.fuchs » 26. Jun 2017, 12:56 Re: FastCGI mit Lazarus

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
m.fuchs
 
Beiträge: 1960
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Warf » 26. Jun 2017, 13:26 Re: FastCGI mit Lazarus

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
Warf
 
Beiträge: 920
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon mschnell » 26. Jun 2017, 15:19 Re: FastCGI mit Lazarus

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
mschnell
 
Beiträge: 3216
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Devstructor » 26. Jun 2017, 16:56 Re: FastCGI mit Lazarus

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
Devstructor
 
Beiträge: 32
Registriert: 7. Sep 2016, 17:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Warf » 26. Jun 2017, 18:10 Re: FastCGI mit Lazarus

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.
Warf
 
Beiträge: 920
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Soner » 27. Jun 2017, 23:57 Re: FastCGI mit Lazarus

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.
Soner
 
Beiträge: 411
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

• Themenende •

Zurück zu Netzwerk



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried