Jump to content

# 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.

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_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

- 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

Categories:

- Web server (Español)
- Apache (Español)

Apache HTTP Server (Español)
Add topic