configure FastCGI of fpWeb lazarus / 38-Networking and Web Programming ---------------------------------------------------------------------- motaz · 2011-04-14 10:00 Is there any documentation about how to configure and deploy FastCGI application that is written using fpWeb. Now I'm using Windows and Apache 2 Thanks ---------------------------------------------------------------------- Leledumbo · 2011-04-14 13:50 Err... same as any other FastCGI app? Read one from ExtPascal wiki ---------------------------------------------------------------------- motaz · 2011-04-14 15:40 I can not open that link, it is forbidden: Quote403. That’s an error. Your client does not have permission to get URL /p/extpascal/wiki/GettingStarted from this server. That’s all we know. ---------------------------------------------------------------------- Leledumbo · 2011-04-14 17:10 Well, that sucks. I can access it from here. So, I just download and attach that page instead. ---------------------------------------------------------------------- motaz · 2011-04-14 18:19 Thanks ---------------------------------------------------------------------- bobo · 2011-04-15 00:41 It is fpweb, not fbweb... I will work on the fpweb examples of Lazarus as time permits to include FCGI demos next to the CGI and Apache module ones... but for now, here are the steps I came up with: ====================== FCGI ---------- http:////func1call should start the example if everything is set up properly. ex: http://127.0.0.1:8080/myfcgi/func1call if in Apache configuration (httpd.conf) it was set up as: Code: [Select]LoadModule fastcgi_module "/mod_fastcgi-2.4.6-AP22.dll"  AddHandler fastcgi-script .fcgi  ScriptAlias /myfcgi "/cgi- bin/no_matter_whats_here.fcgi"  FastCgiExternalServer "/cgi- bin/no_matter_whats_here.fcgi" -host 127.0.0.1:2015 -idle-timeout 30 -flush Note: The compiled FCGI application must be running on the system before any requests can be handled, and it can have any executable file name (ex: abc.exe). The mod_fastcgi-2.4.6-AP22.dll needs to be replaced with the latest FCGI apache  mod available for the OS platform, for example on Linux it is mod_fastcgi.so (downloads are at http://www.fastcgi.com/dist/ , you need to compile it on Linux from the sources) The port number specified at the "-host" parameter must be matched in the FCGI application to listen on. For example, to use port 9999 we can do ... -host 127.0.0.1:9999 ... in the Apache config and Code: [Select]  <...snip...>   Application.Initialize;   Application.Port := 9999;   Application.Run;   <...snip...> in the FCGI project main .lpr file. ====================== ---------------------------------------------------------------------- motaz · 2011-04-24 06:45 I couldn't find mod_cgi.so, I'm using Apache 2 on Ubuntu I found fcgid.conf file in /etc/apache2/mods-available directory it contains: Code: [Select]   AddHandler fcgid-script .fcgi   IPCConnectTimeout 20 I believe that Apache2 might have different configuration for Fast CGI any one successes on running it in Apache2 in Linux? ---------------------------------------------------------------------- kodok_buncit · 2011-04-24 09:47 i have sucess configuring fcgi on apache and nginx on windows  i think on linux it can be easier too ---------------------------------------------------------------------- motaz · 2011-04-24 12:25 could you please describe how to configure it in Apache2 in Linux? ---------------------------------------------------------------------- cpalx · 2011-04-24 13:45 read this page, Can help you http://ubuntuforums.org/showthread.php?t=169891 ---------------------------------------------------------------------- kodok_buncit · 2011-04-24 14:10 here example : first download mod_fastcgi http://www.fastcgi.com/dist/  != mod_fcgid ,compile the lib if necessary.. Code: [Select]// load your module , for example in my windows env LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll //... //... declare it somewhere  AddHandler fastcgi-script .fcgi  ScriptAlias /fcgi/ "D:/pas/"  FastCgiExternalServer "D:/pas/" -host 127.0.0.1:9090 -idle-timeout 30 -flush     AllowOverride None     Options None     Order allow,deny     Allow from all restart your apache http://localhost/fcgi/ hope it help you ---------------------------------------------------------------------- motaz · 2011-04-24 17:17 I'm using Apache2 it fails to restart and it gives me this error: Code: [Select]... waiting .apache2: Syntax error on line 32 of /etc/apache2/apache2.conf: Can't locate API module structure `fastcgi_module' in file /usr/lib/apache2/modules/mod_fcgid.so: /usr/lib/apache2/modules/mod_fcgid.so: undefined symbol: fastcgi_module                                                                        [fail] I've installed fcgi module using this command: sudo apt-get install libfcgi-dev my fast CGI application is running in /home/motaz/projects/ffcgi and it's name is ffcgi This is my configuration file: /etc/apache2/apache2.conf: Code: [Select]# # Based upon the NCSA server configuration files originally by Rob McCool. # # This is the main Apache server configuration file.  It contains the # configuration directives that give the server its instructions. # See http://httpd.apache.org/docs/2.2/ for detailed information about # the directives. # # Do NOT simply read the instructions in here without understanding # what they do.  They're here only as hints or reminders.  If you are unsure # consult the online docs. You have been warned.  # # The configuration directives are grouped into three basic sections: #  1. Directives that control the operation of the Apache server process as a #     whole (the 'global environment'). #  2. Directives that define the parameters of the 'main' or 'default' server, #     which responds to requests that aren't handled by a virtual host. #     These directives also provide default values for the settings #     of all virtual hosts. #  3. Settings for virtual hosts, which allow Web requests to be sent to #     different IP addresses or hostnames and have them handled by the #     same Apache server process. # # Configuration and logfile names: If the filenames you specify for many # of the server's control files begin with "/" (or "drive:/" for Win32), the # server will use that explicit path.  If the filenames do *not* begin # with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log" # with ServerRoot set to "" will be interpreted by the # server as "//var/log/apache2/foo.log". # LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fcgid.so ### Section 1: Global Environment # # The directives in this section affect the overall operation of Apache, # such as the number of concurrent requests it can handle or where it # can find its configuration files. # # # ServerRoot: The top of the directory tree under which the server's # configuration, error, and log files are kept. # # NOTE!  If you intend to place this on an NFS (or otherwise network) # mounted filesystem then please read the LockFile documentation (available # at ); # you will save yourself a lot of trouble. # # Do NOT add a slash at the end of the directory path. # ServerRoot "/etc/apache2" # # The accept serialization lock file MUST BE STORED ON A LOCAL DISK. # # # LockFile /var/lock/apache2/accept.lock # # # # PidFile: The file in which the server should record its process # identification number when it starts. # This needs to be set in /etc/apache2/envvars # PidFile ${APACHE_PID_FILE} # # Timeout: The number of seconds before receives and sends time out. # Timeout 300 # # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On # # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 100 # # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 15 ## ## Server-Pool Size Regulation (MPM specific) ## # prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # MaxClients: maximum number of server processes allowed to start # MaxRequestsPerChild: maximum number of requests a server process serves     StartServers          5     MinSpareServers       5     MaxSpareServers      10     MaxClients          150     MaxRequestsPerChild   0 # worker MPM # StartServers: initial number of server processes to start # MaxClients: maximum number of simultaneous client connections # MinSpareThreads: minimum number of worker threads which are kept spare # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: constant number of worker threads in each server process # MaxRequestsPerChild: maximum number of requests a server process serves     StartServers          2     MaxClients          150     MinSpareThreads      25     MaxSpareThreads      75     ThreadsPerChild      25     MaxRequestsPerChild   0 # These need to be set in /etc/apache2/envvars User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} # # AccessFileName: The name of the file to look for in each directory # for additional configuration directives.  See also the AllowOverride # directive. # AccessFileName .htaccess # # The following lines prevent .htaccess and .htpasswd files from being # viewed by Web clients. #     Order allow,deny     Deny from all # # DefaultType is the default MIME type the server will use for a document # if it cannot otherwise determine one, such as from filename extensions. # If your server contains mostly text or HTML documents, "text/plain" is # a good value.  If most of your content is binary, such as applications # or images, you may want to use "application/octet-stream" instead to # keep browsers from trying to display binary files as though they are # text. # DefaultType text/plain # # HostnameLookups: Log the names of clients or just their IP addresses # e.g., www.apache.org (on) or 204.62.129.132 (off). # The default is off because it'd be overall better for the net if people # had to knowingly turn this feature on, since enabling it means that # each client request will result in AT LEAST one lookup request to the # nameserver. # HostnameLookups Off # ErrorLog: The location of the error log file. # If you do not specify an ErrorLog directive within a # container, error messages relating to that virtual host will be # logged here.  If you *do* define an error logfile for a # container, that host's errors will be logged there and not here. # ErrorLog /var/log/apache2/error.log # # LogLevel: Control the number of messages logged to the error_log. # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. # LogLevel warn # Include module configuration: Include /etc/apache2/mods-enabled/*.load Include /etc/apache2/mods-enabled/*.conf # Include all the user configurations: Include /etc/apache2/httpd.conf # Include ports listing Include /etc/apache2/ports.conf # # The following directives define some format nicknames for use with # a CustomLog directive (see below). # If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i # LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User- Agent}i\"" vhost_combined LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User- Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent # # Define an access log for VirtualHosts that don't define their own logfile CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined # # Customizable error responses come in three flavors: # 1) plain text 2) local redirects 3) external redirects # # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /missing.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" #ErrorDocument 402 http://www.example.com/subscription_info.html # # # Putting this all together, we can internationalize error responses. # # We use Alias to redirect any /error/HTTP_.html.var response to # our collection of by-error message multi-language collections.  We use # includes to substitute the appropriate text. # # You can modify the messages' appearance without changing any of the # default HTTP_.html.var files by adding the line: # #   Alias /error/include/ "/your/include/path/" # # which allows you to create your own set of files by starting with the # /usr/share/apache2/error/include/ files and copying them to /your/include/path/, # even on a per-VirtualHost basis.  The default include files will display # your Apache version number and your ServerAdmin email address regardless # of the setting of ServerSignature. # # The internationalized error documents require mod_alias, mod_include # and mod_negotiation.  To activate them, uncomment the following 30 lines. ScriptAlias /cgi-bin/ "/usr/lib/cgi-bin/"   AllowOverride None   Options ExecCGI   Order allow,deny   Allow from all #    Alias /error/ "/usr/share/apache2/error/" # #    #        AllowOverride None #        Options IncludesNoExec #        AddOutputFilter Includes html #        AddHandler type-map var #        Order allow,deny #        Allow from all #        LanguagePriority en cs de es fr it nl sv pt-br ro #        ForceLanguagePriority Prefer Fallback #    # #    ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var #    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var #    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var #    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var #    ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var #    ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var #    ErrorDocument 410 /error/HTTP_GONE.html.var #    ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var #    ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var #    ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var #    ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var #    ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var #    ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var #    ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var #    ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var #    ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var #    ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var # Include of directories ignores editors' and dpkg's backup files, # see README.Debian for details. # Include generic snippets of statements Include /etc/apache2/conf.d/ # Include the virtual host configurations: Include /etc/apache2/sites-enabled/  AddHandler fastcgi-script .fcgi  ScriptAlias /fcgi/ "/home/motaz/projects/ffcgi/ffcgi"  FastCgiExternalServer "/home/motaz/projects/ffcgi/ffcgi" -host 127.0.0.1:9090 -idle-timeout 30 -flush     AllowOverride None     Options None     Order allow,deny     Allow from all ---------------------------------------------------------------------- motaz · 2011-04-24 18:00 when I disabled this line, apache started: Code: [Select]LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fcgid.so It looks like Fast CGI is already loaded: Code: [Select]# Include module configuration: Include /etc/apache2/mods-enabled/*.load Include /etc/apache2/mods-enabled/*.conf in mods-enabled there are two files related to fcgid: Code: [Select]fcgid.conf      fcgid.load Their contents: Code: [Select]fcgi.conf:   AddHandler fcgid-script .fcgi   IPCConnectTimeout 20 fcgi.load: LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so ---------------------------------------------------------------------- kodok_buncit · 2011-04-24 18:16 hmm i see , you use different module with a module that I mean try this : Code: [Select]// load your module LoadModule fcgid_module modules/ //... //... declare it somewhere  AddHandler fastcgi-script .fcgi  ScriptAlias /fcgi/ "/home/motaz/projects/ffcgi "  FastCgiExternalServer "/home/motaz/projects/ffcgi " -host 127.0.0.1:9090 -idle-timeout 30 -flush     AllowOverride None     Options None     Order allow,deny     Allow from all your module : http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html module that i use : http://www.fastcgi.com/dist/ be sure your main lazarus project(.lpr) is follow what @bobo suggest replace fpCGI ==> fpFCGI and add application.port := 9090; its clear to add FCGI protocol to your freespider project ---------------------------------------------------------------------- motaz · 2011-04-24 18:49 I get this error when restarting apache: Code: [Select]Invalid command 'FastCgiExternalServer', perhaps misspelled or defined by a module not included in the server configuration and this is my application's main source: Code: [Select]program ffcgi; {$mode objfpc}{$H+} uses   fpFCGI, main; {$R *.res} begin   Application.Title:='fcgiproject1';   Application.Initialize;   Application.Port:= 9090;   Application.Run; end.                    Quoteits clear to add FCGI protocol to your freespider project CheesyMy big challenge now is to run Hello world Fast CGI. I think this configuration takes time more than understanding and testing successfully CGI protocol before developing FreeSpider ---------------------------------------------------------------------- kodok_buncit · 2011-04-24 19:08 Quote from: motaz on April 24, 2011, 08:49:07 pmI get this error when restarting apache: Code: [Select]Invalid command 'FastCgiExternalServer', perhaps misspelled or defined by a module not included in the server configuration as I said before we use a different module,so the configuration is also different mod_fcgi and mod_fcgid is also different read this for reference http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html Quote from: motaz on April 24, 2011, 08:49:07 pmMy big challenge now is to run Hello world Fast CGI.I think this configuration takes time more than understanding and testing successfully CGI protocol before developing FreeSpider haha..dont worry we will help you. ---------------------------------------------------------------------- bobo · 2011-05-17 03:59 To compile the FCGI module on Ubuntu Linux, here are the steps: (Note, this is NOT the mod_fcgid module that comes with apache or with the distribution you have but compiled directly from the fascgi.com website sources) Code: [Select]1. if the Apache development package is not installed, then: sudo apt-get install apache2-dev 2. get the fcgi module sources (get the latest SNAP or highest version stable release from http://www.fastcgi.com/dist/) wget http://www.fastcgi.com/dist/mod_fastcgi-...tar.gz 3. unpack them tar -xzf mod_fastcgi-...tar.gz 4. configure the makefile cd mod_fastcgi-* cp Makefile.AP2 Makefile #edit the copied Makefile and set top_dir to the proper apache source dir (/usr/share/apache2 for Ubuntu containing the .mk file) 5. compile and install make sudo make install #now we should have a mod_fastcgi.so in /usr/lib/apache2/modules 6. configure Apache2 #put in the Apache2 conf file (/etc/apache2/apache2.conf on Ubuntu): LoadModule fastcgi_module "/usr/lib/apache2/modules/mod_fastcgi.so"  #Needs full paths  AddHandler fastcgi-script .fcgi  ScriptAlias /myfcgi "/path_to/your_fcgi"  FastCgiExternalServer "/path_to/your_fcgi" -host 127.0.0.1:2015 -idle-timeout 30 -flush 7. restart apache2 ---------------------------------------------------------------------- motaz · 2011-05-17 04:47 I've done all that steps successfully, and apache2 has restarted. This is my configuration: Code: [Select]LoadModule fastcgi_module "/usr/lib/apache2/modules/mod_fastcgi.so"  #Needs full paths  AddHandler fastcgi-script .fcgi  ScriptAlias /myfcgi "/home/motaz/projects/ffcgi/ffcgi"  FastCgiExternalServer "/home/motaz/projects/ffcgi/ffcgi" -host 127.0.0.1:9090 -idle-timeout 30 -flush When I tried to access it from firefox using: http://localhost/myfcgi/test or http://localhost/myfcgi/ it gives me: Code: [Select]Forbidden You don't have permission to access /myfcgi/test on this server. Apache/2.2.16 (Ubuntu) Server at localhost Port 80 ---------------------------------------------------------------------- bobo · 2011-05-17 05:18 That is just some Apache configuration or Linux access rights problem. You could try to move the fcgi program to the /usr/lib/cgi-bin/ directory and make it readable and executable to everyone, then update the paths in the Apache conf file. Or, maybe /home/motaz/projects/ffcgi/  is not allowed in the Apache config to execute scripts. You could try to add to the apache conf file something like:     AllowOverride None     Options None     Order allow,deny     Allow from all not sure. ---------------------------------------------------------------------- motaz · 2011-05-17 06:07 - I've changed befor permission of /home/motaz/projects/ffcgi folder to 777 - Adding Directory configuration does not solve it - I copied ffcgi to /usr/lib/cgi-bin and run it, but it gives the same permission denied error - Normal CGI applications running fine in /usr/lib/cgi-bin directory ---------------------------------------------------------------------- bobo · 2011-05-17 08:37 Try to give .fcgi extension to your fcgi program -> /home/motaz/projects/ffcgi/ffcgi.fcgi It is working on my Linux without all these, but theoretically AddHandler fastcgi-script .fcgi defines it that way. ---------------------------------------------------------------------- motaz · 2011-05-17 15:05 still not working. This is the source of my application it might help ---------------------------------------------------------------------- bobo · 2011-05-17 22:56 motaz, it is not your application that is the problem (BTW, it works here),  it is a configuration problem on your computer. Are you sure the fcgi module is loaded into Apache? Do you see it in your Apache response headers? something like "Apache/2.2.9 (blahblah) PHP/5.3.1 mod_fastcgi/2.4.6" Comment out the instructions? For example: Code: [Select]     Options +ExecCGI     Order allow,deny     Allow from all ---------------------------------------------------------------------- motaz · 2011-05-19 06:15 it is still forbidden, could you please send to me your apache2.conf ---------------------------------------------------------------------- bobo · 2011-05-19 07:46 I am not sure it will help much, but attached both Windows and Linux conf... ---------------------------------------------------------------------- motaz · 2011-05-19 15:32 It is almost the same configuration. If I were a web server I would not care about fast CGI executable file directory and path, I would care about socket only. when I connect to fast CGI application using telnet localhost 9090 and typed GET HTTP 1.1 I get this resposne when means that the Fast CGI application is running: Code: [Select] Topic Related Searching at HTTP.COM.   <body bgcolor="#FFFFFF"> Please visit <a href="http://domains.googlesyndication.com/apps/domain park/domainpark.cgi?cid=ca-dp-og03&s=HTTP.com">this link</a> since your browser does not support frames. </body> ---------------------------------------------------------------------- motaz · 2011-05-19 15:55 It works !! I have created an empty directory in /var/www/fcgi and I run my Fast CGI application from /home/motaz/ffcgi and I've changed the configuration to: Code: [Select]  #Needs full paths  AddHandler fastcgi-script .fcgi  ScriptAlias /myfcgi "/var/www/fcgi"  FastCgiExternalServer "/var/www/fcgi" -host 127.0.0.1:9090 -idle- timeout 30 -flush but I got only the default action handler, if I typed http://localhost/myfcgi or http://localhost/myfcgi/test or http://localhost/myfcgi/action1 I got the same : This is my hello world CGI application ---------------------------------------------------------------------- motaz · 2011-05-19 16:05 Could you please post here your Fast CGI code with multiple actions. thanks ---------------------------------------------------------------------- kodok_buncit · 2011-05-20 15:38 here sample fastcgi multiple action and multiple module read the readme first. enjoy! ooh i've edited  DefaultStartDelimiter and DefaultEndDelimiter on fptemplate unit. so you must replace {+name+} on template/header.html with just { name } or modify my templatecfg.pas. ---------------------------------------------------------------------- motaz · 2011-05-20 17:01 Thanks