Apache httpd 2.x en sistemas Unix

Esta sección contiene las notas y consejos de instalación de PHP con el servidor Apache HTTP Server 2.x en sistemas Linux y similares a Unix.

Advertencia

Usar PHP-FPM en su lugar

No utilice mod_php para nuevas instalaciones. Las instrucciones de esta página se mantienen como referencia histórica y para los casos excepcionales en que se requiere incrustar PHP directamente en el proceso de Apache httpd.

Para todos los despliegues modernos, use PHP-FPM (FastCGI Process Manager) con el módulo mod_proxy_fcgi de Apache httpd. PHP-FPM ofrece una mejor gestión de recursos, aislamiento de procesos, reinicio independiente de PHP sin reiniciar Apache httpd, y compatibilidad con el MPM event de Apache httpd (el predeterminado desde Apache httpd 2.4). Las principales distribuciones Linux lo incluyen como configuración por defecto.

El método mod_php incrusta PHP directamente en cada proceso worker de Apache httpd. A menos que PHP se compile con seguridad de hilos (--enable-zts), mod_php requiere el MPM prefork, lo que limita significativamente la concurrencia. Si se procede con mod_php, se deben comprender plenamente las implicaciones de rendimiento y seguridad.

La » Documentación Apache es la mejor fuente de información sobre el servidor Apache httpd 2.x. La mayoría de la información sobre las opciones de instalación de Apache httpd puede encontrarse allí.

La versión más reciente de Apache httpd puede obtenerse desde la » página de descarga de Apache, y una versión adaptada de PHP desde los enlaces anteriores. Esta guía cubre únicamente las bases de funcionamiento de Apache httpd 2.x con PHP. Para más información, leer la » documentación Apache. Los números de versión se omiten aquí, para asegurarse de que las instrucciones no sean incorrectas. En los ejemplos a continuación, 'NN' deberá ser reemplazado por la versión específica de Apache httpd a utilizar.

Estas instrucciones se aplican a Apache httpd 2.4, que es la única rama de versión compatible de Apache httpd. Las versiones anteriores (2.2 y anteriores) están en fin de vida y no deben utilizarse.

Nota:

A partir de PHP 8.4.0, la SAPI apache2handler requiere al menos Apache 2.4; el soporte de Apache 2.0 y 2.2, que están en fin de vida, ha sido eliminado.

  1. Descargue Apache httpd desde el sitio anterior y descomprímalo:

    tar -xzf httpd-2.x.NN.tar.gz
    
  2. De la misma manera, descargue y descomprima las fuentes de PHP:

    tar -xzf php-NN.tar.gz
    
  3. Compile e instale Apache httpd. Consulte la documentación sobre la instalación de Apache httpd para más detalles sobre la compilación de este software. Tenga en cuenta que mod_php requiere el MPM prefork a menos que PHP sea compilado con seguridad de hilos (--enable-zts). Si tiene intención de usar PHP-FPM (recomendado), puede usar el MPM event predeterminado y pasar directamente a las instrucciones de instalación de PHP-FPM.

    cd httpd-2_x_NN
    ./configure --enable-so --with-mpm=prefork
    make
    make install
    
  4. Ahora que se tiene Apache httpd 2.x.NN disponible bajo /usr/local/apache2, configurado con soporte para la carga de módulos y el MPM prefork. Para probar la instalación, utilice el procedimiento normal para iniciar el servidor Apache httpd, es decir:

    /usr/local/apache2/bin/apachectl start
    
    y deténgalo para continuar con la configuración de PHP:
    /usr/local/apache2/bin/apachectl stop
    
  5. Ahora, configure y compile PHP. Será en este momento cuando se podrá personalizar PHP con las diversas opciones disponibles, como la lista de extensiones a activar. Ejecute ./configure --help para obtener la lista de opciones disponibles. En nuestro ejemplo, realizaremos una configuración simple, con Apache httpd y soporte MySQL.

    Si se ha construido Apache httpd desde las fuentes, tal como se describe anteriormente, el siguiente ejemplo debería ser correcto en cuanto a las rutas hacia apxs, pero si se ha instalado Apache httpd de otra manera, se deberán tener en cuenta las especificidades y ajustar las rutas apxs en consecuencia. Tenga en cuenta que, según las distribuciones, podría ser necesario renombrar apxs a apxs2.

    cd ../php-NN
    ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
    make
    make install
    

    Si se decide modificar las opciones de configuración después de la instalación, se deberán ejecutar nuevamente las etapas configure, make y make install. Entonces solo se necesitará reiniciar Apache para que el nuevo módulo surta efecto. Una recompilación de Apache httpd no es necesaria.

    Tenga en cuenta que, salvo indicaciones contrarias, make install también instalará » PEAR, así como diversas herramientas PHP como phpize, PHP CLI y mucho más.

  6. Configurar el archivo php.ini

    cp php.ini-development /usr/local/lib/php.ini
    

    Se debe editar el archivo .ini para definir las opciones PHP. Si se prefiere colocar php.ini en otro directorio, utilice la opción --with-config-file-path=/some/path en la etapa 5.

    Si se elige el archivo php.ini-production, asegúrese de leer la lista de modificaciones correspondiente ya que puede afectar considerablemente la forma en que PHP funcionará.

  7. Edite el archivo httpd.conf para cargar el módulo PHP. La ruta especificada a la derecha de la cadena LoadModule, debe corresponder a la ruta del sistema del módulo PHP. El comando make install anterior debería haber realizado esta operación por usted, pero una simple verificación permitirá asegurarse.

    LoadModule php_module modules/libphp.so
  8. Indique a Apache httpd que analice ciertas extensiones como scripts PHP. Por ejemplo, deje que Apache httpd pase a PHP los archivos cuya extensión es .php. En lugar de utilizar solo la directiva AddType de Apache, se desea evitar cualquier riesgo potencialmente peligroso, cuando se descarga y crea un archivo como exploit.php.jpg, de ejecución PHP. Utilizando este ejemplo, se puede tener cualquier extensión analizada por PHP. Se ha añadido .php para el ejemplo.

    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

    O, si se desea permitir que los archivos .php, .php2, .php3, .php4, .php5, .php6, y .phtml sean analizados por PHP, pero nada más, se utilizará esto:

    <FilesMatch "\.(php[2-6]?|phtml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>

    Y para permitir que los archivos .phps sean manejados por el filtro del código fuente de PHP, y así, ser mostrados como código fuente con coloración sintáctica, utilice esto:

    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>

    Para permitir el uso de un archivo PHP como manejador por defecto cuando no se encuentra ningún otro manejador, por ejemplo al utilizar un motor de enrutamiento, se puede usar la directiva FallbackResource.

    Dado que la directiva SetHandler se aplica tanto si el archivo existe como si no, y FallbackResource solo se aplica si aún no se ha definido un manejador, puede ser necesario utilizar la directiva If para asegurarse de que el manejador solo se aplique si el archivo existe. Esto permite que FallbackResource gestione las rutas que terminan en .php pero que no existen, lo que puede resultar útil para el manejo de errores y el enrutamiento.

    <FilesMatch "\.php$">
        <If "-f %{REQUEST_FILENAME}">
            SetHandler application/x-httpd-php
        </If>
    </FilesMatch>
    FallbackResource /index.php

    mod_rewrite puede ser utilizado para permitir que cualquier archivo .php sea mostrado como código fuente con coloración sintáctica, sin necesidad de renombrarlo o copiarlo con una extensión .phps:

    RewriteEngine On
    RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]

    El filtro de código fuente PHP no debería estar activo en sistemas de producción, ya que puede exponer código confidencial o información sensible contenida en el código fuente.

  9. Utilice el procedimiento normal para iniciar el servidor Apache httpd, es decir:

    /usr/local/apache2/bin/apachectl start
    

    O

    service httpd restart
    

Si se han seguido los pasos anteriores, ahora se tiene un servidor web Apache httpd funcional con soporte PHP como módulo SAPI. Por supuesto, hay una multitud de otras opciones de configuración disponibles con Apache httpd y PHP. Para más información, introduzca el comando ./configure --help en el árbol de fuentes correspondiente.

Nota: Compatibilidad MPM

A menos que PHP sea compilado con Zend Thread Safety (--enable-zts), mod_php requiere el MPM prefork. Para más información, leer la entrada FAQ correspondiente sobre el uso de Apache httpd con un MPM multi-hilo.

La mayoría de los paquetes de distribución de mod_php no se compilan con ZTS, por lo que prefork suele ser necesario. Si se necesita un MPM multi-hilo (recomendado para mejor rendimiento bajo carga), use PHP-FPM con mod_proxy_fcgi en su lugar.

Nota:

La FAQ Apache MultiViews trata sobre el uso de MultiViews con PHP.

add a note

User Contributed Notes 2 notes

up
13
nmmm at nmmm dot nu
17 years ago
When I upgrade to apache 2.2, this:

AddType application/x-httpd-php .php5
AddType application/x-httpd-php .php42
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtm
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .asp

...does not worked for me, so I did this:

<FilesMatch "\.(php*|phtm|phtml|asp|aspx)$">
SetHandler application/x-httpd-php
</FilesMatch>

Another interesting point with Apache 2.2 is following.
Let suppose we installed PHP as module. But for some directory, we need to use PHP as CGI (probably because of custom configuration). This can be done using:

<FilesMatch "\.(php*|phtm|phtml|asp|aspx)$">
SetHandler none
</FilesMatch>

AddType application/x-httpd-php-custom .php
Action  application/x-httpd-php-custom  /cgi-bin/php-huge

Note type must be different than "application/x-httpd-php" and also you need to deactivate the handler on sertain extention. You can do mixed configuration:

<FilesMatch "\.(php)$">
SetHandler none
</FilesMatch>

AddType application/x-httpd-php-custom .php
Action  application/x-httpd-php-custom  /cgi-bin/php-huge

in such case files like *.php5 and so on will be parsed via module, but *.php will go to php-huge executable.
up
7
Morning Star
3 years ago
I had just installed php8.1.12 on a machine used for writing C code. 

Below are some libraries that I needed to download on a debian-based OS. 

apt-get install libpcre3 libpcre3-dev 
apt-get install apache2-dev
apt-get install libxml2-dev
apt-get install libsqlite3-dev

These were the missing packages that I required. 
If you get an error regarding a missing package or library, for example when I needed sqlite3, run the command: 

apt search sqlite3

And you'll be able to see if there's any dev or lib packages. 

The apache2 instructions worked flawlessly at the time of php8.1.12; and in order to get certain requirements for an application, I had to run the php configure file like so:

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql --with-mysqli --with-zip --enable-gd

The extra flags allowed me to use both types of mysql, allowed me to utilize PHP zip archiving, and allowed me to use Gnatt stuff.