Este tutorial describe cómo puede instalar Apache2 con mod_fcgid y PHP5 en OpenSUSE 12.3. 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 12.3 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:
zypper install 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:
systemctl enable apache2.service
systemctl start apache2.service
A continuación abrimos /etc/php5/fastcgi/php.ini...
vi /etc/php5/fastcgi/php.ini
... y descomente la línea cgi.fix_pathinfo =1:
Abra /etc/apache2/conf.d/mod_fcgid.conf...
vi /etc/apache2/conf.d/mod_fcgid.conf
... y agregue la línea PHP_Fix_Pathinfo_Enable 1 (esta línea no debe ir a una sección
[...] ; 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 [...] |
Luego reinicie Apache:
systemctl restart apache2.service
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
[...] PHP_Fix_Pathinfo_Enable 1 </IfModule> |
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 *:80> ServerName www.example1.com ServerAlias example1.com ServerAdmin [email protected] DocumentRoot /srv/www/web1/web/ <IfModule mod_fcgid.c> SuexecUserGroup web1 web1 <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 *:80> ServerName www.example2.com ServerAlias example2.com ServerAdmin [email protected] DocumentRoot /srv/www/web2/web/ <IfModule mod_fcgid.c> SuexecUserGroup web2 web2 <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:
systemctl restart apache2.service
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 *:80 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:
systemctl restart apache2.service
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:
systemctl restart apache2.service
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/
-
Cómo instalar Apache2 con PHP5 y MySQL en Fedora 15 (LAMP)
-
Cómo instalar Nginx con PHP5 y MySQL en Ubuntu 11.10
-
Cómo configurar un servidor SFTP en OpenSUSE Leap 15.3 Server
-
Cómo instalar y configurar PHP y Apache (pila LAMP) en OpenSUSE Leap 15.3
-
Cómo instalar y configurar Nginx como proxy OpenSUSE Leap 15.3
Cómo configurar Apache2 con mod_fcgid y PHP5 en OpenSUSE 11.2
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 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 |