GNU/Linux >> Tutoriales Linux >  >> OpenSuse

Cómo configurar Apache2 con mod_fcgid y PHP5 en OpenSUSE 11.2

Este tutorial describe cómo puede instalar Apache2 con mod_fcgid y PHP5 en OpenSUSE 11.2. mod_fcgid es una alternativa compatible con el antiguo mod_fastcgi. Le permite ejecutar scripts PHP con los permisos de sus propietarios en lugar del usuario de Apache.

1 nota preliminar

Estoy usando un servidor OpenSUSE 11.2 en este tutorial con el nombre de host server1.example.com y la dirección IP 192.168.0.100.

Crearé dos vhosts de Apache en este tutorial, www.example1.com y www.example2.com, para demostrar el uso de mod_fcgid.

2 Instalación de Apache2/mod_fcgi/PHP5

Podemos instalar Apache2, mod_fcgid y PHP5 de la siguiente manera:

yast2 -i apache2 apache2-mod_fcgid php5-fastcgi

Si Apache2 ya estaba instalado con PHP5 como módulo de Apache, desactive el módulo PHP5 ahora:

a2dismod php5

A continuación, habilite los módulos suexec y fcgid:

a2enmod suexec
a2enmod fcgid

Luego creamos los enlaces de inicio del sistema para Apache y lo iniciamos:

chkconfig --add apache2
/etc/init.d/apache2 start

A continuación abrimos /etc/php5/fastcgi/php.ini...

vi /etc/php5/fastcgi/php.ini

... y descomente la línea cgi.fix_pathinfo =1:

Luego reinicie Apache:

/etc/init.d/apache2 restart

3 Creando Vhosts para www.example1.com y www.example2.com

Ahora crearé dos vhosts, www.example1.com (con la raíz del documento /srv/www/web1/web) y www.example2.com (con la raíz del documento /srv/www/web2/web). www.example1.com será propiedad del usuario y grupo web1, y www.example2.com del usuario y grupo web2.

Primero creamos los usuarios y grupos:

groupadd web1
groupadd web2
useradd -s /bin/false -d /srv/www/web1 -m -g web1 web1
useradd -s /bin/false -d /srv/www/web2 -m -g web2 web2
chmod 755 /srv/www/web1
chmod 755 /srv/www/web2

Luego creamos las raíces del documento y hacemos que sean propiedad de los usuarios/grupos web1 resp. web2:

mkdir -p /srv/www/web1/web
chown web1:web1 /srv/www/web1/web
mkdir -p /srv/www/web2/web
chown web2:web2 /srv/www/web2/web

Ejecutaremos PHP usando suExec; La raíz del documento de suExec es /srv/www, como muestra el siguiente comando:

/usr/sbin/suexec2 -V
server1:~ # /usr/sbin/suexec2 -V
 -D AP_DOC_ROOT="/srv/www"
 -D AP_GID_MIN=96
 -D AP_HTTPD_USER="wwwrun"
 -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=96
 -D AP_USERDIR_SUFFIX="public_html"
server1:~ #

Por lo tanto, no podemos llamar al binario de PHP (/usr/bin/php-cgi) directamente porque se encuentra fuera de la raíz del documento de suExec. Como suExec no permite los enlaces simbólicos, la única forma de resolver el problema es crear un script contenedor para cada sitio web en un subdirectorio de /srv/www; la secuencia de comandos contenedora llamará al binario de PHP /usr/bin/php-cgi. El script de contenedor debe ser propiedad del usuario y grupo de cada sitio web, por lo tanto, necesitamos un script de contenedor para cada sitio web. Voy a crear los scripts de envoltura en los subdirectorios de /srv/www/php-fcgi-scripts, p. /srv/www/php-fcgi-scripts/web1 y /srv/www/php-fcgi-scripts/web2.

mkdir -p /srv/www/php-fcgi-scripts/web1
mkdir -p /srv/www/php-fcgi-scripts/web2
vi /srv/www/php-fcgi-scripts/web1/php-fcgi-starter
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]
vi /srv/www/php-fcgi-scripts/web2/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi

La línea PHPRC contiene el directorio donde se encuentra el archivo php.ini (es decir, /etc/php5/fastcgi/ se traduce como /etc/php5/fastcgi/php.ini). PHP_FCGI_MAX_REQUESTS es el número máximo de solicitudes antes de que se detenga un proceso fcgid y se inicie uno nuevo. PHP_FCGI_CHILDREN define el número de elementos PHP secundarios que se lanzarán.

Los scripts php-fcgi-starter deben ser ejecutables, y ellos (y los directorios en los que se encuentran) deben ser propiedad del usuario y grupo del sitio web:

chmod 755 /srv/www/php-fcgi-scripts/web1/php-fcgi-starter
chmod 755 /srv/www/php-fcgi-scripts/web2/php-fcgi-starter
chown -R web1:web1 /srv/www/php-fcgi-scripts/web1
chown -R web2:web2 /srv/www/php-fcgi-scripts/web2

Ahora creamos los vhosts de Apache para www.example1.com y www.example2.com:

vi /etc/apache2/vhosts.d/www.example1.com.conf
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi
vi /etc/apache2/vhosts.d/www.example2.com.conf
<VirtualHost *>
  ServerName www.example1.com
  ServerAlias example1.com
  ServerAdmin [email protected]
  DocumentRoot /srv/www/web1/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web1 web1
    PHP_Fix_Pathinfo_Enable 1
    <Directory /srv/www/web1/web/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /srv/www/php-fcgi-scripts/web1/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>

Asegúrese de completar las rutas correctas (y el usuario y grupo correctos en las líneas SuexecUserGroup).

Abra /etc/apache2/httpd.conf y agregue la línea NameVirtualHost * antes de la línea Incluir /etc/apache2/vhosts.d/*.conf (de lo contrario, solo funcionará el primer vhost):

vi /etc/apache2/httpd.conf
<VirtualHost *>
  ServerName www.example2.com
  ServerAlias example2.com
  ServerAdmin [email protected]
  DocumentRoot /srv/www/web2/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web2 web2
    PHP_Fix_Pathinfo_Enable 1
    <Directory /srv/www/web2/web/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /srv/www/php-fcgi-scripts/web2/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>

Antes de reiniciar Apache, cambiamos los permisos del ejecutable suExec (de lo contrario, verá la siguiente advertencia cuando reinicie Apache:Advertencia:la directiva SuexecUserGroup requiere el envoltorio SUEXEC):

chmod 4755 /usr/sbin/suexec2

Reinicie Apache después:

/etc/init.d/apache2 restart

4 Pruebas

Ahora creamos un pequeño archivo de prueba de PHP, por ejemplo en el sitio web www.example1.com...

vi /srv/www/web1/web/info.php
[...]
### Virtual server configuration ############################################
#
# VirtualHost: If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at
# <URL:http://httpd.apache.org/docs-2.2/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.
#
NameVirtualHost *

Include /etc/apache2/vhosts.d/*.conf
[...]

... y llame a ese archivo en un navegador (http://www.example1.com/info.php). Si todo va bien, el resultado debería ser similar a este y debería ver CGI/FastCGI en la línea de la API del servidor:

5 php.ini personalizados para cada sitio web

Debido a que cada sitio web tiene su propia secuencia de comandos contenedora php-fcgi-starter, es posible definir diferentes archivos php.ini para diferentes sitios web. Para demostrar esto, copiaré el php.ini predeterminado (/etc/php5/fastcgi/php.ini) en el directorio /srv/www/web2/ y haré que www.example2.com use el php.ini de /srv /www/web2/ directorio:

cp /etc/php5/fastcgi/php.ini /srv/www/web2/
chown web2:web2 /srv/www/web2/php.ini

(Ahora puede modificar /srv/www/web2/php.ini a su gusto).

Luego abrimos /srv/www/php-fcgi-scripts/web2/php-fcgi-starter...

vi /srv/www/php-fcgi-scripts/web2/php-fcgi-starter

... y coloque /srv/www/web2/ en la línea PHPRC:

<?php
phpinfo();
?>

Reinicie Apache después:

/etc/init.d/apache2 restart

Crea un nuevo phpinfo(); archivo para www.example2.com...

vi /srv/www/web2/web/info.php
#!/bin/sh
PHPRC=/srv/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi

... y llamarlo en un navegador (http://www.example2.com/info.php). La línea del archivo de configuración cargado ahora debería mostrar /srv/www/web2/php.ini:

6 Cambiar los ajustes de configuración de PHP único

En lugar de pasar un archivo php.ini completamente nuevo a su sitio web, también puede cambiar los ajustes de configuración de PHP individuales en el script contenedor php-fcgi-starter (o usar una combinación de ambos) agregando el interruptor -d al PHP ejecutable. Por ejemplo, si quiero deshabilitar magic_quotes_gpc para el sitio web www.example2.com, lo haría de la siguiente manera:

vi /srv/www/php-fcgi-scripts/web2/php-fcgi-starter
<?php
phpinfo();
?>

Reinicie Apache después:

/etc/init.d/apache2 restart

Luego, vuelva a llamar al script info.php en un navegador (http://www.example2.com/info.php) y busque la línea magic_quotes_gpc; ahora debería mostrarse Off:

7 Enlaces

  • mod_fcgid:http://fastcgi.coremail.cn/
  • Apache:http://httpd.apache.org/
  • PHP:http://www.php.net/
  • OpenSUSE:http://www.opensuse.org/

OpenSuse
  1. Cómo instalar Apache2 con PHP5 y MySQL en Fedora 16 (LAMP)

  2. Instale Apache2 con PHP5 y MySQL (LAMP) en openSUSE 12.1

  3. Cómo instalar Lighttpd con PHP5 FastCGI y MySQL en openSUSE 12.1

  4. Cómo instalar Nginx con PHP-FPM y MySQL en openSUSE 12.1

  5. Cómo instalar y configurar PHP y Apache (pila LAMP) en OpenSUSE Leap 15.3

Cómo configurar Apache2 con mod_fcgid y PHP5 en OpenSUSE 11.3

Cómo configurar Apache2 con mod_fcgid y PHP5 en OpenSUSE 12.2

Cómo configurar Apache2 con mod_fcgid y PHP5 en OpenSUSE 12.3

Cómo configurar Mailman con Debian e ISPConfig

Cómo instalar y configurar una VPN con OpenVPN en Ubuntu 18.04

Cómo instalar y configurar WordPress con Ansible

    #!/bin/sh
    PHPRC=/etc/php5/fastcgi/
    export PHPRC
    export PHP_FCGI_MAX_REQUESTS=5000
    export PHP_FCGI_CHILDREN=8
    exec /usr/bin/php-cgi -d magic_quotes_gpc=off