Apache HTTP Server (Español)

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
.
Artículos relacionados
XAMPP (Español)
/mod_perl (Español)
/mod_fcgid (Español)
/mod_gnutls (Español)
/mod_python (Español)
/mod_wsgi (Español)
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_fcgid
AUR
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
Pagina oficial de Apache
Documentación en español de Apache
Apache Wiki
Documentacion de Apache - Consejos de seguridad
Apache Wiki - Solución de problemas
Apache
en wiki.debian.org