Apache HTTP Server (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
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 [email protected]
- 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 suDocumentRoot
, 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 lineaRequire all denied
aRequire all granted
, si no, obtendrá un Error 403. Recuerde que el directorioDocumentRoot
y sus carpetas padres deben permitir permisos de ejecución por otros (se puede establecer conchmod 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 usarmod_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.
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
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.
Hosts virtuales
<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 [email protected] 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 [email protected] 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).
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
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=1Como 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].
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
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
|
) 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.soLoadModule 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