¿Configurando Lighttpd y FastCGI para mi propia aplicación web?

2

Estoy ejecutando Gentoo Linux, y estoy tratando de que Lighttpd + PHP + FastCGI funcione. yo descubierto que Lighttpd no tiene un administrador de procesos FastCGI. Entonces, se supone que debes usar spawn-fcgi. Tengo Lighttpd y PHP trabajando. Mi problema es que no sé cómo configurar spawn-fcgi y lighttpd para usar mi aplicación web.

Esto es lo que he instalado:

  • Lighttpd
  • PHP (con CGI USE flag)
  • spawn-fcgi

La aplicación con la que estoy tratando de comunicarme es solo el ejemplo de fcgi docs, tiny.c:

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

Lo tengo compilado y funcionando desde la consola:

nick@blozup ~/zwave $ ./tiny.fcgi

Content-type: text/html <title>FastCGI Hello!</title>
<h1>FastCGI Hello!</h1>Request number 1 running on host <i>(null)</i>

Tenga paciencia conmigo aquí, no tengo idea de lo que estoy haciendo ...

Primero intenté simplemente colocando el compilado tiny.fcgi en un directorio web ( cgi-bin, específicamente, que no funcionó, entonces solo en el directorio web raíz). Lo más cercano que obtuve fue un mensaje de error 403 prohibido. Me aseguré de que los permisos fueran liberales, no hubo suerte.

Después de leer un poco más, me di cuenta de que necesitaba usar spawn-fcgi. Así que lo instalé y vinculé mi aplicación, copié la configuración predeterminada y edité para mi aplicación:

ln -s /etc/init.d/spawn-fcgi /etc/init.d/spawn-fcgi.fcgi
cp /etc/conf.d/spawn-fcgi /etc/conf.d/spawn-fcgi.fcgi

Expediente /etc/conf.d/spawn-fcgi.fcgi :

# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/www-servers/spawn-fcgi/files/spawn-fcgi.confd,v 1.6 2009/09/28 08:38:02 bangert Exp $

# DO NOT MODIFY THIS FILE DIRECTLY! CREATE A COPY AND MODIFY THAT INSTEAD!

# The FCGI process can be made available through a filesystem socket or
# through a inet socket. One and only one of the two types must be choosen.
# Default is the inet socket.

# The filename specified by
# FCGI_SOCKET will be suffixed with a number for each child process, for
# example, fcgi.socket-1.
# Leave empty to use an IP socket (default). See below. Enabling this,
# disables the IP socket.
#
FCGI_SOCKET=/var/run/fcgi.socket

# When using FCGI_PORT, connections will only be accepted from the following
# address. The default is 127.0.0.1. Use 0.0.0.0 to bind to all addresses.
#
FCGI_ADDRESS=127.0.0.1

# The port specified by FCGI_PORT is the port used
# by the first child process. If this is set to 1234 then subsequent child
# processes will use 1235, 1236, etc.
#
#FCGI_PORT=1234

# The path to your FastCGI application. These sometimes carry the .fcgi
# extension but not always. For PHP, you should usually point this to
# /usr/bin/php-cgi.
#
#FCGI_PROGRAM=/usr/bin/php-cgi
FCGI_PROGRAM=/home/nick/zwave/tiny.fcgi

# The number of child processes to spawn. The default is 1.
#
FCGI_CHILDREN=1

# If you want to run your application inside a chroot then specify the
# directory here. Leave this blank otherwise.
#
FCGI_CHROOT=

# If you want to run your application from a specific directiory specify
# it here. Leave this blank otherwise.
#
FCGI_CHDIR=

# The user and group to run your application as. If you do not specify these,
# the application will be run as root:root.
#
FCGI_USER=
FCGI_GROUP=

# Additional options you might want to pass to spawn-fcgi
#
#FCGI_EXTRA_OPTIONS=

# If your application requires additional environment variables, you may
# specify them here. See PHP example below.
#
ALLOWED_ENV="PATH"

Entonces empecé el proceso, y se está ejecutando ahora:

blozup zwave # /etc/init.d/spawn-fcgi.fcgi start
Starting....                                                     [OK]
blozup zwave # ps aux | grep tiny root
5809  0.0  0.0   2236   504 ?        Ss   17:47   0:00 /home/nick/zwave/tiny.fcgi

y se ha creado un socket en: /var/run/lighttpd/tiny.socket-1

¿Ahora que?

¿Cómo consigo que lighttpd se conecte a esto? ¿Y cómo accedo a eso desde una URL?

Sé que lighttpd necesita usar ese socket, pero cuando edito el mod_fastcgi.conf expediente:

fastcgi.server += (".fcgi" =>
        ( "localhost" =>
            (
                "socket" => "/var/run/lighttpd/fcgi.socket-1",
                "bin-path" => "/usr/bin/cgi-fcgi",
                "max-procs" => 1
        ))
)

Me sale este error:

2012-06-13 18:50:18: (mod_fastcgi.c.1389) --- fastcgi spawning
port: 0
socket /var/run/lighttpd/fcgi.socket-1
current: 0 / 1
2012-06-13 18:50:18: (mod_fastcgi.c.1103) the fastcgi-backend /usr/bin/cgi-fcgi failed to start:
2012-06-13 18:50:18: (mod_fastcgi.c.1107) child exited with status 1 /usr/bin/cgi-fcgi
2012-06-13 18:50:18: (mod_fastcgi.c.1110) If you're trying to run your app as a FastCGI backend, make sure you're using the FastCGI-enabled version.
If this is PHP on Gentoo, add 'fastcgi' to the USE flags.
2012-06-13 18:50:18: (mod_fastcgi.c.1397) [ERROR]: spawning fcgi failed.

No sé a dónde ir desde aquí. No pude encontrar mucho sobre cómo configurar el servidor web lighttpd para generar nada más que PHP. ¿Todo esto sería mucho más fácil con Apache?

Nick
fuente
Debe hablar el protocolo FCGI a lighttpd a través de un socket Unix. No veo dónde está sucediendo esto aquí.
Keith
Bueno, hay un zócalo en /var/run/lighttpd/tiny.socket-1, mi aplicación FCGI ha creado eso. Simplemente no sé cómo conseguir que Lighttpd "abra" ese socket. Pensé que estaba en el archivo de configuración y tenía algo que ver con cgi-fcgi. En mod_fcgi.conf especificé ese mismo socket: "socket" => "/var/run/lighttpd/fcgi.socket-1", pero o cgi-fcgi es el programa incorrecto al que llamar, o lo estoy llamando mal.
Nick
He quitado el bin-path en linea mod_fastcgi.conf, manteniendo el zócalo, y se inicia el servidor. La única indicación que tengo de que ha abierto ese socket en los registros es: "todos los controladores para /tiny.fcgi? En tiny.fcgi están inactivos". Ahora estoy recibiendo 500/503 errores en lighttpd.
Nick

Respuestas:

1

Bueno, fue el bin-path configurando que me estaba quedando colgado. Mi solicitud reside ahora en:

/var/www/localhost/cgi-bin/tiny.fcgi

El socket se crea en:

/var/run/lighttpd/tiny.socket-1 (el '-1' es creado por spawn-fcgi, y es chmod'd, por lo que lighttpd puede r / w)

los mod_fcgi.conf expediente:

server.modules += ("mod_fastcgi")

fastcgi.debug = 1

fastcgi.server = ( ".php" =>
    ((
        "socket" => "/var/run/lighttpd/lighttpd-fastcgi-php-" + PID + ".socket",
        "bin-path" => "/usr/bin/php-cgi",
    )), 
    "/cgi-bin/" =>
    ((
        "socket" => "/var/run/lighttpd/tiny.socket-1",
#       "bin-path" => "/home/nick/zwave/tiny.fcgi",
        "check-local" => "disable",
        "max-procs" => 1
    ))
)

¡Y ahora está funcionando!

Por lo tanto, no hay bin-path si está llamando a sus propias aplicaciones que ya tienen un socket. El spawn-fcgi inicia esos procesos, no Lighttpd.

Nick
fuente