Apache HTTP Server (Español)

From ArchWiki
Esta traducción de Apache HTTP Server fue revisada el 2020-12-02. Si existen cambios puede actualizarla o avisar al equipo de traducción.

El Servidor HTTP Apache o solamente Apache, es un servidor web muy popular, desarrollado por la Apache Software Foundation.

Este articulo describe como configurar Apache y como integrarlo opcionalmente con PHP.

Instalación

Instale el paquete apache.

Configuración

Los archivos de configuración de Apache están ubicados en /etc/httpd/conf. El archivo de configuración principal es /etc/httpd/conf/httpd.conf, el cual incluye varios otro archivos de configuración. El archivo de configuración por defecto debiera servir para una configuración simple. Por defecto, servirá el directorio /srv/http a cualquiera que visite su pagina.

Para iniciar Apache, inicie el httpd.service usando systemd.

Ahora, Apache debería estar ejecutándose. Pruebelo visitando http://localhost/ en un navegador web. Debería mostrar una pagina simple de indice.

Para una configuración opcional adicional, véase las siguientes secciones.

Opciones avanzadas

Véase la lista completa de directivas de configuración de Apache y la guía rápida de referencias de directivas.

Estas opciones en /etc/httpd/conf/httpd.conf pueden serle de interés:

User http
Por razones de seguridad, tan pronto como es iniciado Apache por el usuario root (directamente o por scripts de inicio) cambia a esta UID (User ID, Identificación de usuario). El usuario por defecto es http, el cual es creado automáticamente durante la instalación.
Listen 80
Este el el puerto en donde Apache va a escuchar. Para acceso desde el internet con un router, tendrá que redirigirlo al puerto.
Si quiere configurar Apache para desarrollo local, puede querer que sea solo accesible desde su computador. Cambie esta linea a Listen 127.0.0.1:80.
ServerAdmin you@example.com
Este el es correo del administrador que puede ser encontrado, p.ej. en paginas de error.
DocumentRoot "/srv/http"
Este es el directorio donde tiene que poner sus paginas web.
Cámbielo, si quiere, pero no olvide de cambiar también <Directory "/srv/http"> al valor de su DocumentRoot, o lo más probable que obtenga un Error 403 (falta de privilegios) cuando intente acceder a la nueva raíz del documento. No olvide cambiar la linea Require all denied a Require all granted, si no, obtendrá un Error 403. Recuerde que el directorio DocumentRoot y sus carpetas padres deben permitir permisos de ejecución por otros (se puede establecer con chmod o+x /path/to/DocumentRoot), sino, obtendrá un Error 403.
AllowOverride None
Esta directiva en las secciones <Directory> provoca que Apache ignore completamente los archivos .htaccess. Tome en cuenta que este es ahora el valor por defecto en Apache 2.4, así que tendrá que permitir explícitamente anulaciones si planea usar los archivos .htaccess. Si tiene la intención de usar mod_rewrite u otras configuraciones en los archivos .htaccess, puede permitir que directivas declaradas en ese archivo pueden anular la configuración del servidor. Para más información, refiérase a la documentación de Apache.
Sugerencia: Si tiene problemas con su configuración, puede hacer que Apache la revise con: apachectl configtest.

Puede encontrar más opciones de configuración en /etc/httpd/conf/extra/httpd-default.conf:

Para desactivar la firma del servidor:

ServerSignature Off

Para ocultar información como las versiones de Apache y PHP:

ServerTokens Prod

Directorios de usuario

Los directorios de usuario están disponibles por defecto a través de http://localhost/~tunombredeusuario/ y muestran los contenidos de ~/public_html (esto puede ser cambiado en /etc/httpd/conf/extra/httpd-userdir.conf).

Si no quiere que los directorios de usuario estén disponibles en la web, comente la siguiente linea en /etc/httpd/conf/httpd.conf:

Include conf/extra/httpd-userdir.conf

Debe asegurarse que los permisos en su directorio home estén correctamente establecidos para que Apache pueda accederlo. Su directorio home y ~/public_html deben ser ejecutables para otros («el resto del mundo»):

$ chmod o+x ~
$ chmod o+x ~/public_html
$ chmod -R o+r ~/public_html

Reinicie httpd.service para aplicar los cambios. Véase también Umask#Set the mask value.

TSL

Advertencia: Si emplea TLS, asegúrese de seguir la guia de weakdh.org para prevenir vulnerabilidades. Para más información véase Server-side TLS.

Primero obtenga un certificado. Si posee un dominio publico, puede usar Let's Encrypt.

En /etc/httpd/conf/httpd.conf, saque las marcas de comentario en las siguientes tres lineas:

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

Si esta usando certbot --apache, la siguiente linea tampoco debe comentarse:

LoadModule rewrite_module modules/mod_rewrite.so

Después de obtener una llave y un certificado, asegúrese que las lineas SSLCertificateFile y SSLCertificateKeyFile en /etc/httpd/conf/extra/httpd-ssl.conf apunten a la llave y el certificado. Si también es generada una cadena concatenada de certificados CA, añada el nombre del archivo a SSLCertificateChainFile.

Finalmente, reinicie httpd.service para aplicar los cambios.

Sugerencia: Mozilla tiene un útil SSL/TLS articulo y una herramienta automatizada para ayudar a crear una configuración más segura.

Hosts virtuales

Nota: Tendrá que añadir una sección aparte de <VirtualHost *:443> para soporte de Virtual Hosts SSL. Véase #Administrar varios hosts virtuales para un archivo de ejemplo.

Si quiere tener más de un host, saque las marcas de comentario en la siguiente linea en /etc/httpd/conf/httpd.conf:

Include conf/extra/httpd-vhosts.conf

Establezca sus hosts virtuales en /etc/httpd/conf/extra/httpd-vhosts.conf. El archivo por defecto contiene un elaborado ejemplo que debería ayudarle al iniciar.

Para probar los hosts virtuales en su maquina local, añada los nombres virtuales a su archivo /etc/hosts:

127.0.0.1 domainname1.dom
127.0.0.1 domainname2.dom

Reinicie httpd.service para aplicar los cambios.

Administrar varios hosts virtuales

Si tiene una gran cantidad de hosts virtuales, puede querer activarlos y desactivarlos fácilmente. Es recomendado crear un archivo de configuración por host virtual y guardarlos en una sola carpeta, ej. /etc/httpd/conf/vhosts.

Primero cree la carpeta:

# mkdir /etc/httpd/conf/vhosts

Y guarde cada archivo de configuración en ella:

# nano /etc/httpd/conf/vhosts/domainname1.dom
# nano /etc/httpd/conf/vhosts/domainname2.dom
...

En el ultimo paso, Include (Incluya) los archivos de configuración en su /etc/httpd/conf/httpd.conf:

#Vhosts permitidos:
Include conf/vhosts/domainname1.dom
Include conf/vhosts/domainname2.dom

Puede activar o desactivar cada host virtual comentándolo o no comentándolo.

Un archivo vhost básico se parecerá a esto:

/etc/httpd/conf/vhosts/domainname1.dom
<VirtualHost *:80>
    ServerAdmin webmaster@domainname1.dom
    DocumentRoot "/home/user/http/domainname1.dom"
    ServerName domainname1.dom
    ServerAlias domainname1.dom
    ErrorLog "/var/log/httpd/domainname1.dom-error_log"
    CustomLog "/var/log/httpd/domainname1.dom-access_log" common

    <Directory "/home/user/http/domainname1.dom">
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@domainname1.dom
    DocumentRoot "/home/user/http/domainname1.dom"
    ServerName domainname1.dom:443
    ServerAlias domainname1.dom:443
    SSLEngine on
    SSLCertificateFile "/etc/httpd/conf/server.crt"
    SSLCertificateKeyFile "/etc/httpd/conf/server.key"
    ErrorLog "/var/log/httpd/domainname1.dom-error_log"
    CustomLog "/var/log/httpd/domainname1.dom-access_log" common

    <Directory "/home/user/http/domainname1.dom">
        Require all granted
    </Directory>
</VirtualHost>

Extensiones

PHP

Primero instale PHP, después, siga alguna de las tres subsecciones siguientes. Finalmente, pruebe la instalación como se describe en la subsección final.

Usando libphp

Este método es probablemente el más fácil, pero el menos escalable: es apropiado para una carga de solicitudes ligera. También requiere que cambie el modulo mpm, lo cual puede causar problemas con otras extensiones (ej. no es compatible con #HTTP2).

Instale php-apache.

En /etc/httpd/conf/httpd.conf comente la linea:

#LoadModule mpm_event_module modules/mod_mpm_event.so

y no comente la linea:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Nota: Lo anterior es necesario, porque libphp.so que esta incluido con php-apache no funciona con mod_mpm_event, pero solo va a funcionar con mod_mpm_prefork. (FS#39218)

Si no, obtendrá el siguiente error:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed
httpd.service: control process exited, code=exited status=1
Como alternativa, puede usar mod_proxy_fcgi (Véase #Utilizando php-fpm y mod_proxy_fcgi más abajo).

Para habilitar PHP, añada estas lineas a /etc/httpd/conf/httpd.conf:

  • Ponga esto al final de la lista LoadModule:
LoadModule php_module modules/libphp.so
AddHandler php-script .php
  • Ponga esto al final de la lista Include:
Include conf/extra/php_module.conf

Reinicie httpd.service usando systemd.

Utilizando apache2-mpm-worker y mod_fcgid

Este método provee un uso de memoria y rendimiento mejorado al servir múltiples peticiones.

Instale mod_fcgidAUR y php-cgi.

Cree el directorio necesario y enlacelo (symlink) a el wrapper de PHP:

# mkdir /srv/http/fcgid-bin
# ln -s /usr/bin/php-cgi /srv/http/fcgid-bin/php-fcgid-wrapper

Cree /etc/httpd/conf/extra/php-fcgid.conf con el siguiente contenido:

/etc/httpd/conf/extra/php-fcgid.conf
# Modulos requeridos: fcgid_module

<IfModule fcgid_module>
    AddHandler php-fcgid .php
    AddType application/x-httpd-php .php
    Action php-fcgid /fcgid-bin/php-fcgid-wrapper
    ScriptAlias /fcgid-bin/ /srv/http/fcgid-bin/
    SocketPath /var/run/httpd/fcgidsock
    SharememPath /var/run/httpd/fcgid_shm
        # Si no permite peticiones más grandes, varias aplicaciones pueden fallar (como el WordPress login)
        FcgidMaxRequestLen 536870912
        # Ruta a php.ini – por defecto en /etc/phpX/cgi
        DefaultInitEnv PHPRC=/etc/php/
        # Numero de hijos de PHP a ejecutar. No lo defina para dejar que PHP decida.
        #DefaultInitEnv PHP_FCGI_CHILDREN 3
        # Peticiones máximas antes que un proceso sea detenido y uno nuevo sea iniciado
        #DefaultInitEnv PHP_FCGI_MAX_REQUESTS 5000
    <Location /fcgid-bin/>
        SetHandler fcgid-script
        Options +ExecCGI
    </Location>
</IfModule>

Edite /etc/httpd/conf/httpd.conf:

  • Quite las marcas de comentario en la carga del modulo actions:
LoadModule actions_module modules/mod_actions.so
  • Cargue el modulo FCGID después de haber cargado el modulo unixd (de el cual es dependiente) — ubiquelo en el bloque <IfModule unixd_module> —:
LoadModule fcgid_module modules/mod_fcgid.so
  • Asegúrese que el Include de la configuración de MPM no este comentado (no esta comentado por defecto en la versión instalada de este archivo):
Include conf/extra/httpd-mpm.conf
  • Incluya su nueva configuración de FCGID:
Include conf/extra/php-fcgid.conf

Reinicie httpd.service.

Utilizando php-fpm y mod_proxy_fcgi

Este método provee «una implementación alternativa al PHP FastCGI con algunas características adicionales (la mayoría) útiles para sitios web con mucho tráfico.» [1].

Nota: A diferencia de la difundida configuración con ProxyPass, el proxy de la configuración con SetHandler respeta otras directivas de Apache como DirectoryIndex. Esto asegura mejor compatibilidad con software diseñado para libphp7, mod_fastcgi y mod_fcgid.

Si aun quiere probar ProxyPass, experimente con una linea como esta:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/srv/http/$1

Instale php-fpm.

Habilite los módulos de proxy:

/etc/httpd/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

Cree /etc/httpd/conf/extra/php-fpm.conf con el siguiente contenido:

DirectoryIndex index.php index.html
<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>

E incluyalo al final de /etc/httpd/conf/httpd.conf:

Include conf/extra/php-fpm.conf
Nota: No esta permitido que la tubería (|) entre sock y fcgi este rodeada por un espacio. localhost puede ser remplazado por cualquier cadena. Mas información here.

Puede configurar PHP-FPM en /etc/php/php-fpm.d/www.conf, pero la configuración por defecto debería funcionar bien.

Inicie y habilite php-fpm.service. Reinicie httpd.service.

Pruebe si PHP funciona

Para probar si PHP fue correctamente configurado, cree un archivo llamado prueba.php en su directorio DocumentRoot de Apache (ej. /srv/http/ o ~<username>/public_html/) con los siguientes contenidos:

<?php phpinfo(); ?>

Y vaya a http://localhost/prueba.php o http://localhost/~<username>/prueba.php.

HTTP2

Para habilitar el soporte a HTTP/2, saque las marcas de comentario de la siguiente linea en httpd.conf:

LoadModule http2_module modules/mod_http2.so

Y añada la siguiente linea:

Protocols h2 http/1.1

Para más información, véase la documentación de mod_http2.

Tome en cuenta que http2_module no es compatible con mpm_prefork_module que es ampliamente usado en la configuración de PHP. Considere usar php-fpm.

Solución de problemas

Estado de Apache y registros

Vea el estado del demonio de Apache con systemctl.

Los registros de Apache pueden ser encontrados en /var/log/httpd/.

Error:PID file /run/httpd/httpd.pid not readable (yet?) after start

Comente la linea unique_id_module en httpd.conf: #LoadModule unique_id_module modules/mod_unique_id.so

/run/httpd no es creado al arrancar

Si al ejecutar systemd-tmpfiles --create como root arroja «unsafe path transition», compruebe la posesión de su directorio raíz.

ls -la /
chown root:root /

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.

Si al cargar php7_module el httpd.service falla, y obtiene un error como este en el journal:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.

Es porque PHP incluye soporte para un modulo que no es threadsafe, y usted esta intentando usar un MPM hilado. Una solución para esto es usar un MPM no hilado. Intente remplazar mpm_event_module con mpm_prefork_module:

/etc/httpd/conf/httpd.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Y reinicie httpd.service.

AH00534: httpd: Configuration error: No MPM loaded.

Puede encontrar este error después de una actualización reciente. Esto es solo el resultado de un cambio reciente en httpd.conf que no ha reproducido en su configuración local. Para arreglarlo, no comente la siguiente linea:

/etc/httpd/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Y reinicie httpd.service.

AH00072: make_sock: could not bind to address

Esto puede ser causado por varias cosas. El problema más común es que algo ya esta escuchando en el puerto dado, compruebe que no este sucediendo con netstat:

# netstat -lnp | grep -e :80 -e :443

Si obtiene alguna salida, detenga el servicio que esta ocupando el puerto o mate el proceso desbocado (runaway) que esta causando que el puerto este ocupado, e intente de nuevo.

Otro problema puede ser que Apache no esta iniciando como root por alguna razón — intente iniciarlo manualmente y vea si aun obtiene el error AH0072 —.

# httpd -k start

Finalmente, también puede tener un error con su configuración y esté escuchando dos veces en el puerto dado. Lo siguiente es un ejemplo de una mala configuración que puede desencadenar este problema:

Listen 0.0.0.0:80
Listen [::]:80

AH01071: Got error 'Primary script unknown

Este error puede ser causado por ProtectHome=true en el archivo de unidad de systemd de php-fpm si esta sirviendo archivos en /home como es un entorno de host virtual. Puede desactivar esta característica con editando el archivo de unidad de php-fpm y reiniciandolo. Alternativamente, mueva su raíz de documento.

Cambiar el valor de max_execution_time en php.ini no tiene efecto

Si cambió el valor de max_execution_time en php.ini a un valor mayor de 30 (segundos), aun puede que obtenga una respuesta de 503 Service Unavailable de Apache después de treinta segundos. Para arreglarlo, añada una directiva ProxyTimeout a su configuración http justo después del bloque <FilesMatch \.php$>:

/etc/httpd/conf/httpd.conf
ProxyTimeout 300

Y reinicie httpd.service.

PHP-FPM: los errores de cada host virtual no son registrados por separado

Si tiene múltiples hosts virtuales, puede ser deseable que cada uno registre sus errores en archivos separados (usando la directiva de Apache ErrorLog). Si esto no le esta funcionando, confirmen que PHP-FPM esta configurado para que registre los errores a syslog:

/etc/php/php-fpm.conf
error_log = syslog

También es posible que la configuración de reserva la haya anulado. Asegúrese que la siguiente linea este comentada:

/etc/php/php-fpm.d/www.conf
;php_admin_value[error_log] = /var/log/fpm-php.www.log

Véase también