Seite 2 von 2

Re: Startschwierigkeiten mit FastCgi

Verfasst: 09.09.2015 19:10
von TroaX
Sooo ich habe eben mal einen Test mit NGINX gemacht und die FastCGI-Geschichte hat noch echt penetrante Bugs. Aber erst einmal zur Beruhigung. Das Delay von einer Sekunde gibt es bei NGINX nicht. Wenn der Request durchgeht, zeigt mir die Netzwerkanalyse zwischen 1 und 4 ms an. Das nenne ich mal einen Unterschied. Blöd nur, das über NGINX leider nur genau jeder zweite Request durchgeht. Bei den anderen Request bekommt der Browser keine Antwort von NGINX. Im Accesslog von NGINX steht der Statuscode 499, weil man die Requests abbrechen muss. Die laden nämlich ewig. Das ganze FastCGI-Gedöhns ist aktuell also nicht brauchbar. Es bleibt also abzuwarten, ob bis zur Releaseversion das ganze vernünftig läuft.

BIG UPDATE: Das Rätsel vom störrischen Apache und dem zickigen NGINX ist tatsächlich gelöst. Nach dem umstellen des Error.logs bei Apache auf Debug flüssterte er mir, das er den Zielcomputer net erreicht. Ich habe es dann mal mit der IP unter ProxyPass statt localhost getestet. Und weder der Apache noch NGINX zicken jetzt rum. In beiden Fällen bei allen Request laut FF-Netzwerkanalyse 0-1 ms. Damit kann man also dann doch arbeiten. :)

Re: Startschwierigkeiten mit FastCgi

Verfasst: 10.09.2015 21:42
von Kiffi
TroaX hat geschrieben:Damit kann man also dann doch arbeiten. :)
finde ich auch. :D

Meine Ergebnisse:

CGI: ~ 14ms
FastCGI: ~ 2ms

Gute Arbeit, Sherlock! :allright:

Danke & Grüße ... Peter

Re: Startschwierigkeiten mit FastCgi

Verfasst: 10.09.2015 23:23
von TroaX
Das mit den POST und GET-Daten muss ich jetzt nur noch herausfummeln. Das sollte aber kein Thema sein. Bleibt aber noch die Frage nach dem Multithreading. Und tatsächlich ist auch das kein Problem. Man kann mehrere Threads erstellen und alle können die gleiche Art von Schleife abarbeiten. Und dadurch, das die Prozeduren ja private sind, sollte es auch da keine Probleme mit dem ganzen geben. Einzig für z.B. globale Datenbankverbindung müsste man etwas tricksen, da man die durchaus auch global definieren kann. Aber vom einfachen Grundsatz her kann man es so machen:

Code: Alles auswählen

OpenConsole()

Procedure WriteCGIConstant(Constant$)
  WriteCGIString(Constant$ + ": " + CGIVariable(Constant$)+"<br>")
EndProcedure

If Not InitCGI()
  End
EndIf
  
If Not InitFastCGI(5600) ; Create the FastCGI program on port 5600
  End
EndIf
  
  
  
Procedure goon()
  While WaitFastCGIRequest()
    PrintN("Incomming Request!")
    If ReadCGI()
      WriteCGIHeader(#PB_CGI_HeaderContentType, "text/html", #PB_CGI_LastHeader) ; Write the headers to inform the browser of the content format
      WriteCGIString("<html><title>PureBasic CGI</title><body>")  
      WriteCGIConstant(#PB_CGI_AuthType)
      WriteCGIConstant(#PB_CGI_ContentLength)
      WriteCGIConstant(#PB_CGI_HeaderContentType)
      WriteCGIConstant(#PB_CGI_DocumentRoot)
      WriteCGIConstant(#PB_CGI_GatewayInterface)
      WriteCGIConstant(#PB_CGI_PathInfo)
      WriteCGIConstant(#PB_CGI_PathTranslated)
      WriteCGIConstant(#PB_CGI_QueryString)
      WriteCGIConstant(#PB_CGI_RemoteAddr)
      WriteCGIConstant(#PB_CGI_RemoteHost)
      WriteCGIConstant(#PB_CGI_RemoteIdent)
      WriteCGIConstant(#PB_CGI_RemotePort)
      WriteCGIConstant(#PB_CGI_RemoteUser)
      WriteCGIConstant(#PB_CGI_RequestURI)
      WriteCGIConstant(#PB_CGI_RequestMethod)
      WriteCGIConstant(#PB_CGI_ScriptName)
      WriteCGIConstant(#PB_CGI_ScriptFilename)
      WriteCGIConstant(#PB_CGI_ServerAdmin)
      WriteCGIConstant(#PB_CGI_ServerName)
      WriteCGIConstant(#PB_CGI_ServerPort)
      WriteCGIConstant(#PB_CGI_ServerProtocol)
      WriteCGIConstant(#PB_CGI_ServerSignature)
      WriteCGIConstant(#PB_CGI_ServerSoftware)
      WriteCGIConstant(#PB_CGI_HttpAccept)
      WriteCGIConstant(#PB_CGI_HttpAcceptEncoding)
      WriteCGIConstant(#PB_CGI_HttpAcceptLanguage)
      WriteCGIConstant(#PB_CGI_HttpCookie)
      WriteCGIConstant(#PB_CGI_HttpForwarded)
      WriteCGIConstant(#PB_CGI_HttpHost)
      WriteCGIConstant(#PB_CGI_HttpPragma)
      WriteCGIConstant(#PB_CGI_HttpReferer)
      WriteCGIConstant(#PB_CGI_HttpUserAgent)
      
      WriteCGIString("</body></html>")
    EndIf
    FinishFastCGIRequest()
    PrintN("Request Finished!")
  Wend     
EndProcedure

th1 = CreateThread(@goon(),0)
th2 = CreateThread(@goon(),0)
th3 = CreateThread(@goon(),0)
th4 = CreateThread(@goon(),0)

WaitThread(th4)
Eine weitere Möglichkeit wäre es auch, das ganze einfach den Webserver machen zu lassen. Und zwar durch den Loadbalancer. Man kann den Server ja mit unterschiedlichen Netzwerkports laufen lassen und die dem Webserver als target für das Loadbalancing angeben. Der Webserver verteilt dann die Request auf die einzelnen Instanzen.

Re: Startschwierigkeiten mit FastCgi

Verfasst: 11.09.2015 12:14
von HeX0R
Vergiss nie einer Thread-Prozedur noch den obligatorischen Parameter mitzugeben.
Sonst verknisknaddelst Du Dir über kurz oder lang den Stack und es kracht.

Re: Startschwierigkeiten mit FastCgi

Verfasst: 24.09.2015 14:07
von Kiffi
Noch ein Verständnisproblem:

Kann man einen laufenden FastCGI-Server auch direkt ansprechen? Oder bedarf es immer eines Webservers über den dann die Anfrage an FastCGI weitergeleitet wird?

Danke & Grüße ... Peter

Re: Startschwierigkeiten mit FastCgi

Verfasst: 24.09.2015 15:15
von TroaX
Wenn die anfragende Anwendung das fastCGI Protokoll implementiert hat, geht das. PureBasic hingegen hat allerdings keine Libs für einen FastCGI Client, soweit ich das gesehen habe.

Re: Startschwierigkeiten mit FastCgi

Verfasst: 25.09.2015 12:53
von dige
Hat schon jemand fastCGI mit einem Microsoft IIS Server zum laufen bekommen?
Hab zumindest schon herausgefunden, dass man als erstes die Programm Parameter
auswerten muss, über die man den Port mitgeteilt bekommt.

Leider passiert dann bei WaitFastCGIRequest() nix... Ist das nicht IIS kompatibel?

Re: Startschwierigkeiten mit FastCgi

Verfasst: 25.09.2015 13:43
von TroaX
Hmmm gute Frage. Ich persönlich ziehe auf Windows Nginx vor. Gibt es Fehler in den Logs?

Re: Startschwierigkeiten mit FastCgi

Verfasst: 25.09.2015 14:03
von Kiffi
TroaX hat geschrieben:Wenn die anfragende Anwendung das fastCGI Protokoll implementiert hat, geht das. PureBasic hingegen hat allerdings keine Libs für einen FastCGI Client, soweit ich das gesehen habe.
Danke für die Info! Dachte schon, ich hätte da was übersehen.
dige hat geschrieben:Hat schon jemand fastCGI mit einem Microsoft IIS Server zum laufen bekommen?
nee, da stehe ich wie'n Ochs vorm Berg.

Grüße ... Peter