Cómo instalar Apache en CentOS 8

En esta entrada veremos cómo instalar Apache en CentOS 8 / CentOS Stream 8 paso a paso, de modo que al final de esta guía podrás utilizar el servidor web más popular en tu servidor o VPS CentOS, con seguridad SSL y todos los servidores virtuales que necesites.

Antes de instalar Apache en CentOS 8

Si quieres completar esta guía de instalación de Apache en CentOS 8 / CentOS Stream 8 necesitas cumplir unos mínimos requerimientos:

  • Un sistema CentOS 8 actualizado.
  • Acceso a terminal de comandos con root o un usuario con permisos de sudo.
  • Conexión a Internet.

Si estás leyendo este artículo es porque seguramente ya cumples todo esto, así que ve abriendo una consola y empezamos.

Cómo instalar Apache en CentOS 8

Para instalar Apache en CentOS 8 usaremos los paquetes presentes en los propios repositorios, así que la primera acción será actualizar las listas de paquetes y el software instalado:

~$ sudo yum update

El paquete que necesitamos es httpd, así que lo descargamos con yum:

~$ sudo yum install -y httpd

Tras la descarga e instalación de Apache y sus dependencias, se habrá creado un nuevo servicio en nuestro sistema CentOS 8, el sistema httpd.service, aunque también podemos usar el nombre corto, httpd.

Hay que tener en cuenta que en este momento el servicio httpd.service no está en ejecución ni configurado para arrancar automáticamente junto con CentOS 8.

En primer lugar, vamos a iniciar Apache con el comando systemctl:

~$ sudo systemctl start httpd

Si además quieres que Apache arranque automáticamente con CentOS 8, debes habilitar el servicio:

~$ sudo systemctl enable httpd

Puedes comprobar el estado del servicio Apache con el comando systemctl status httpd:

como instalar el servidor web apache en centos 8

¿Qué versión tengo instalada?

Si quieres averiguar la versión de Apache instalada en CentOS 8, sólo tienes que usar el comando httpd en consola:

~$ httpd -v
Server version: Apache/2.4.37 (centos)
Server built:   May 20 2021 04:33:06

Pasamos de la versión 2.4.6 de la versión anterior de CentOS a la actual 2.4.37.

Configurar el firewall de CentOS 8 para Apache

Para poder acceder al servicio web Apache desde la red es necesario configurar el firewall de CentOS 8, ya que por defecto suele estar activado.

Si quieres permitir el acceso estándar (HTTP) y el acceso seguro (HTTPS), tendrás que añadir ambos servicios a la configuración del firewall:

~$ sudo firewall-cmd --permanent --add-service={http,https}

Si sólo necesitas el acceso HTTP entonces basta con especificar únicamente este protocolo:

~$ sudo firewall-cmd --permanent --add-service=http

Y recargamos la configuración del firewall para que tenga en cuenta las nuevas reglas:

~$ sudo firewall-cmd --reload

Desde este momento tu servidor web Apache ya es accesible desde fuera de la máquina CentOS 8.

Puedes acceder a la página web por defecto mediante un navegador especificando la dirección IP, nombre de máquina, dominio, etc.

Por ejemplo, la máquina CentOS 8 sobre la que hemos redactado este artículo es accesible en el subdomino centos8.local.lan, por lo que podemos usar http://centos8.local.lan como URL:

instalar apache en centos 8

Cómo configurar Apache en CentOS 8

Para configurar Apache en CentOS 8 debemos trabajar sobre sus archivos de configuración, organizados bajo la ruta /etc/httpd/.

El archivo principal es /etc/httpd/conf/httpd.conf que, entre otras cosas, configura la página web por defecto de CentOS 8.

~$ sudo nano /etc/httpd/conf/httpd.conf

Si buscas la directiva DocumentRoot verás la ruta sobre la que puedes alojar los archivos de la página web por defecto:

...
DocumentRoot "/var/www/html"
...

También se cargan configuraciones desde otros archivos que son incluidos desde el principal httpd.conf. Por ejemplo, las configuraciones de los módulos de Apache se incluyen con esta directiva Include:

...
Include conf.modules.d/*.conf
...

Y otras configuraciones adicionales se cargan con esta directiva IncludeOptional:

...
IncludeOptional conf.d/*.conf
...

Como ves, se trata de rutas relativas. Para construir la ruta completa a estos archivos se añaden al valor de la directiva ServerRoot:

...
ServerRoot "/etc/httpd"
...

Cualquier cambio de configuración de Apache exigirá recargar o reiniciar el servidor web.

Para recargar la configuración de Apache, sin detener el servicio, usaremos este comando:

~$ sudo systemctl reload httpd

Y para reiniciar Apache, es decir, detener el servicio y volver a iniciarlo, usaremos este otro comando:

~$ sudo systemctl restart httpd

Cómo añadir módulos de Apache

Para añadir ciertas funcionalidades de Apache es necesario cargar los correspondientes módulos. Si quieres saber qué módulos carga la configuración actual de Apache basta con usar el comando httpd:

~$ httpd -M

Puedes comprobar si determinado módulo está cargado filtrando el comando anterior. Por ejemplo, si quieres saber si el módulo Rewrite está cargado:

~$ httpd -M |grep -i rewrite
rewrite_module (shared)

Los módulos instalados residen en la ruta /usr/lib64/httpd/modules/. Si quieres instalar un módulo nuevo, tendrás que averiguar el nombre del paquete del repositorio (suelen llamarse mod_*).

Por ejemplo, si quieres añadir soporte SSL para usar el protocolo seguro HTTPS, tendrías que instalar el paquete mod_ssl:

~$ sudo yum install -y mod_ssl

Se instala el correspondiente archivo mod_ssl.so en la ruta /usr/lib64/httpd/modules/, junto con el resto de módulos ya instalados.

También se instala un archivo ssl.conf en /etc/httpd/conf.d/. Se instala en conf.d/ en lugar de en conf.modules.d/ porque es una configuración muy concreta para la página web por defecto.

Normalmente deberías reiniciar el servicio httpd para que la nueva configuración entre en funcionamiento, pero este módulo concreto necesita configuración previa.

Protocolo SSL HTTPS con Apache en CentOS 8

Para activar el protocolo HTTPS con seguridad SSL en Apache sobre CentOS 8 acabamos de ver que es necesario instalar el módulo SSL, mod_ssl.

También necesitaremos claves y certificados SSL para cifrar y verificar las conexiones, en caso de un servicio disponible en Internet es muy importante que dichos certificados y claves estén firmados o generados por alguna autoridad certificadora profesional como Namecheap:

SSL Certificate for just $8.88 with Namecheap

Para redes locales o simples pruebas, como las de este tutorial, podemos utilizar certificados y claves autofirmados que generaremos nosotros mismos.

Editaremos el archivo de configuración del módulo, ssl.conf:

~$ sudo nano /etc/httpd/conf.d/ssl.conf

El protocolo HTTPS necesita usar certificados para cifrar la conexión, por lo que en la configuración del módulo SSL hay que especificar la localización de los archivos del certificado que quieras usar.

Al instalar el módulo SSL, su archivo de configuración indica unos certificados normalmente inexistentes que deben ser modificados por los que realmente vayas a usar:

...
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
...
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
...

Si ya tienes los archivos del certificado, modifica estas rutas. En este ejemplo usaremos un certificado autofirmado que crearemos enseguida. Cambiaremos las rutas para este certificado:

...
SSLCertificateFile /etc/pki/tls/certs/centos8.local.lan.crt
...
SSLCertificateKeyFile /etc/pki/tls/private/centos8.local.lan.key
...

Guardamos los cambios y cerramos el archivo.

Ahora crearemos el certificado con el nombre que hayamos decidido y especificado antes:

~$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/centos8.local.lan.key -out /etc/pki/tls/certs/centos8.local.lan.crt

Puedes contestar en blanco a las preguntas que se hacen sobre la información de la entidad, pero en «Common Name» debes contestar con el nombre del servidor (centos8.local.lan en este ejemplo).

Se generan un archivo .crt y un archivo .key que quedan almacenados en la ruta suministrada como parámetro.

Hecho esto, podemos comprobar que el módulo SSL está instalado:

~$ httpd -M |grep -i ssl
ssl_module (shared)

Para que la configuración haga efecto habrá que recargar el servicio httpd:

~$ sudo systemctl reload httpd

Si no lo hiciste anteriormente, añade la excepción del firewall para el puerto 443/tcp (servicio HTTPS):

~$ sudo firewall-cmd --permanent --add-service=https
~$ sudo firewall-cmd --reload

Listo, ya podemos acceder a la página web por defecto de Apache en CentOS 8 mediante cifrado SSL, indicando https:// en la URL.

Siguiendo con el ejemplo de este tutorial, ahora sería https://centos8.local.lan la nueva URL:

como configurar apache en centos 8

Al tratarse de un certificado autofirmado el navegador nos advierte de que no es posible verificar su autenticidad. En el caso de Google Chrome pulsamos en «Configuración avanzada» y nos mostrará un enlace para ir de todas formas al sitio que queremos visitar:

configurar apache en centos 8

Y finalmente accederemos al sitio con conexión cifrada, aunque todos los navegadores, de un modo u otro, nos advertirán del problema con el certificado:

instalacion y configuracion de apache en centos 8

Obviamente si instalas un certificado creado para el dominio de tu máquina y firmado por una autoridad certificadora, no tendrás ninguno de estos inconvenientes.

En estos casos puede que necesites incluir un tercer archivo de certificado, un archivo «chain«, para lo cual tienes una directiva SSLCertificateChainFile que tendrías que descomentar y ajustar la ruta del archivo:

...
#   certificate for convenience.
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
...

Servidores virtuales de Apache en CentOS 8

Para configurar servidores virtuales de Apache en CentOS 8 será necesario disponer de dominios o subdominios adicionales al domino principal configurados y apuntando al servidor. En el caso de un VPS CentOS 8 en Internet necesitaremos registrar y configurar estos dominios en algún servicio profesional como Namecheap (el servicio que usamos para este blog, por ejemplo):

En caso de trabajar en ambientes domésticos, redes locales, etc. será necesario disponer de un servicio DNS local en el que registrar nuestros propios dominios y subdominios locales.

Para este ejemplo voy a configurar el subdominio blog.centos8.local.lan y los dominios mundocentos8.local.lan y otrodominio.local.lan.

En primer lugar crearemos un directorio específico donde guardar los archivos de configuración de cada servidor virtual con el que trabajemos, por supuesto colgando de la ruta de configuración de Apache:

~$ sudo mkdir /etc/httpd/sites.d/

Ahora editaremos el arhivo principal de Apache:

~$ sudo nano /etc/httpd/conf/httpd.conf

Al final del archivo incluiremos esta línea:

...
IncludeOptional sites.d/*.conf

De esa forma se incluirán los archivos de configuración con extensión .conf que estén presentes en el directorio /etc/httpd/sites.d/.

Cada servidor virtual responderá a un dominio o subdominio distinto. Podemos crear tantos como queramos, lo importante es que todos los dominios y subdominios estén apuntados a la dirección del servidor CentOS 8.

Por cada servidor virtual tendremos que crear su propio directorio de contenido web o DocumentRoot. Un buen sitio donde alojar estos directorios es en /var/www/:

~$ sudo mkdir /var/www/blog.centos8.local.lan

Deberíamos colocar algo de contenido en los directorios:

~$ sudo nano /var/www/blog.centos8.local.lan/index.html

Un simple mensaje basta:

<h1>blog.centos8.local.lan</h1>

Llega el momento de crear los archivos de configuración, uno por cada servidor virtual:

~$ sudo nano /etc/httpd/sites.d/blog.centos8.local.lan.conf

Es buena idea darles nombres representativos, como el dominio que configuran. A continuación veremos el contenido mínimo de estos archivos:

<VirtualHost *:80>
        ServerName blog.centos8.local.lan
        DocumentRoot /var/www/blog.centos8.local.lan

        <Directory /var/www/blog.centos8.local.lan>
                Options -Indexes
                AllowOverride all
                Require all granted
        </Directory>

        ErrorLog /var/log/httpd/error_blog.centos8.local.lan.log
        CustomLog /var/log/httpd/access_blog.centos8.local.lan.log combined
</VirtualHost>

Se trata de un bloque VirtualHost que contiene las siguientes directivas:

ServerName

El dominio o subdominio al que responderá el servidor virtual.

DocumentRoot

La ruta en el sistema de archivos donde se aloja el contenido web del servidor virtual.

Directory

Un bloque donde se pueden configurar opciones específicas para una ruta. En este caso configuramos la ruta del contenido web y todo lo que cuelga de ella.

Options

Opciones de Apache para la ruta del bloque Directory. La opción -Indexes no permite visualizar el contenido de los directorios que no contengan archivos index.html, index.htm o similares.

AllowOverride all

Permite el uso de archivos .htaccess que contienen directivas de configuración sólo aplicables a los directorios donde se encuentren.

Require all granted

Permite explícitamente el acceso del servidor web al directorio.

ErrorLog

El archivo donde se guardará el registro de errores del servidor. Si no se especifica se usará el archivo común de Apache.

CustomLog

Este es el registro de accesos y peticiones al servidor, donde se indican fechas, direcciones de los clientes, recursos solicitados, resultados de las peticiones, etc. Igualmente, si no se especifica uno concreto se usa el archivo común.

Recargamos la configuración del servicio Apache y ya podemos probar los distintos servidores virtuales desde un navegador:

servidores virtuales de apache en centos 8

Un problema que podemos tener es que el servidor por defecto, que responde por dirección IP y por el dominio configurado como nombre del servidor (en este ejemplo, centos8.local.lan), ahora responderá al primer servidor virtual cargado por orden alfabético.

Para evitar esto podemos crear un pseudo-servidor virtual con un nombre de archivo de configuración que siempre esté alfabéticamente el primero, por ejemplo 000-default.conf:

~$ sudo nano /etc/httpd/sites.d/000-default.conf

Con un contenido mínimo:

<VirtualHost *:80>
</VirtualHost>

Este servidor virtual toma el resto de la configuración del archivo principal de Apache, httpd.conf.

Para añadir configuración SSL a un servidor virtual usaremos su archivo de configuración ya existente:

~$ sudo nano /etc/httpd/sites.d/blog.centos8.local.lan.conf

Y añadiremos un nuevo bloque VirtualHost al final del archivo:

...
<VirtualHost *:443>
        ServerName blog.centos8.local.lan
        DocumentRoot /var/www/blog.centos8.local.lan

        <Directory /var/www/blog.centos8.local.lan>
                Options -Indexes
                AllowOverride all
                Require all granted
        </Directory>

        SSLEngine on
        SSLCertificateFile /etc/pki/tls/certs/blog.centos8.local.lan.crt
        SSLCertificateKeyFile /etc/pki/tls/private/blog.centos8.local.lan.key

        ErrorLog /var/log/httpd/error_blog.centos8.local.lan.log
        CustomLog /var/log/httpd/access_blog.centos8.local.lan.log combined
</VirtualHost>

El contenido es prácticamente el mismo, pero hay cambios y novedades, empezando por que el bloque VirtualHost ahora se configura para el puerto estándar HTTPS, el 443.

Además se añaden las directivas SSLEngine on para usar el módulo SSL, y las directivas relativas a la ubicación de los certificados pare este servidor virtual.

En este caso el contenido web es el mismo, y los archivos de registro también, pero nada impide que configures un contenido diferente para la versión cifrada del servidor virtual, y archivos de registro separados.

Guarda los cambios y cierra el archivo.

No olvides crear y ubicar los certificados correspondientes a este servidor virtual y su dominio, y recarga la configuración del servidor.

Ahora ya podrás acceder a tus servidores virtuales también mediante HTTPS.

Conclusión

Ahora que sabes cómo instalar Apache en CentOS 8 ya puedes montar tus páginas web en tu servidor o VPS con este servicio tan popular y extendido en Internet.

¡Apoya este sitio!

¿Te ha servido esta pequeña guía de instalación de Apache en CentOS 8? Pues si quieres agradecérnoslo, puedes dejar una pequeña propina de 1 $ desde PayPal para contribuir al mantenimiento de este sitio y elaboración de nuevos tutoriales:

¡Gracias!

¿Dudas, preguntas, sugerencias?

En caso de que tengas dudas, preguntas, sugerencias, etc. puedes dejar un comentario (están moderados para evitar molesto SPAM, pero se revisan a diario).

Valora esta entrada

5/5 - (2 votos)

10 comentarios en «Cómo instalar Apache en CentOS 8»

  1. Buenas noches, el directorio «/etc/httpd/sites.d/» finalmente no lo usas para nada, en su lugar almacenas los archivos de los virtualhosts en «/etc/httpd/conf.d/«. ¿Es por algún motivo o es una errata?

    Un saludo.

    Responder
    • ¡Hola, Juan!
      Efectivamente, se trata de un despiste que ya he corregido. El tutorial funciona, porque no es un gran problema en qué subdirectorio guardes las configuraciones de los servidores virtuales, mientras dichos directorios sean referenciados desde httpd.conf. Pero es buena práctica mantener separados los archivos de configuración según su función, y en muchas distribuciones de Linux encontrarás que las configuraciones de servidores virtuales tienen su propia carpeta.
      ¡Gracias por el aviso!

      Responder
      • ¡Perfecto! Vengo de usar Ubuntu e imagino que sólo cambia el nombre del paquete, las directivas supongo que funcionan exactamente igual como es lógico, pero el hecho de usar otro directorio me había causado algún despiste, efectivamente, el tutorial funciona a la perfección.

        ¡Muchas gracias por tu tiempo y por responde tan rápido! 😉

        Responder
  2. ¡Instalador!, ¿qué tal, amigo?

    Más allá del SSL, la única manera que encontré que los servidores virtuales funcionen fue modificando el archivo /etc/hosts y agregar la línea correspondiente, ej:

    127.0.0.1 mundocentos8.local local localhost ……

    No sé si no he entendido algo o falta información.

    ¿A ti te funciona sin alterar el hosts?

    Responder
    • ¡Hola, Sebastián! Cuando se usan dominios y subdominios se entiende que estos deben estar registrados en algún servidor DNS, de modo que cualquier cliente que quiera conectar pueda resolver dichos nombres (que es lo que ocurre en Internet o en redes locales corporativas). En ambientes locales, redes domésticas, etc. puede funcionar muy bien añadir los nombres en los archivos hosts, como has hecho tú.

      Responder
  3. Hola, muy buena explicación, venía bien pero cuando pongo estas lineas explota todo:

    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/blog.centos8.local.crt
    SSLCertificateFile /etc/pki/tls/private/blog.centos8.local.key

    Si las comento, httpd vuelve a correr.
    ¿Sabes qué me puedo estar olvidando?

    Responder
    • ¡Hola, Sebastián!

      Las directivas SSLCertificate hacen referencia a la ruta de los archivos de clave pública y privada, por lo que dichos archivos deben existir físicamente tal como aparecen referenciados. Los valores mostrados corresponden al ejemplo desarrollado en el tutorial. Si dispones de tus propios certificados debes especificar las rutas correspondientes, y si los vas a crear con la herramienta openssl, debes indicar las rutas y nombres de modo que coincidan con los especificados en la configuración.

      Responder
  4. Hola, saludos.
    Muy buena explicación, muchas gracias. ¿Pero si quiero ponerle autenticación con usuarios para entrar a la web o algún servicio? Gracias.

    Responder

Deja un comentario