Cómo instalar Apache en CentOS 7

En esta entrada vamos a ver cómo instalar Apache en CentOS 7 paso a paso. CentOS es una de las distribuciones de Linux más prestigiosas en el entorno de servidores y servicios VPS. Por tanto instalar y configurar un servidor web en CentOS es uno de los primeros pasos a realizar.

Antes de instalar Apache en CentOS 7

Si quieres seguir esta guía de instalación de Apache en CentOS 7 necesitas cumplir una serie de requisitos:

  • Una instalación actualizada de CentOS 7.
  • Acceso por terminal como root o usuario con privilegios de sudo.
  • Conexión a Internet.

Seguramente ya cumples todo esto, así que podemos continuar.

Instalar Apache en CentOS 7

Vamos a ver cómo instalar Apache en CentOS 7, concretamente sobre un servidor recién preparado desde la versión minimal (tengo una entrada dedicada a la instalación de CentOS 7 en una máquina virtual VirtualBox con esa distribución, por si te interesa). La instalación del servidor web se realizará usando los paquetes oficiales de la distribución, a través de yum.

En primer lugar actualizamos las listas de paquetes de los repositorios del sistema, como buena práctica antes de instalar cualquier nueva colección de paquetes:

~$ sudo yum update

A continuación instalamos el paquete httpd, que es el que contiene Apache:

~$ sudo yum install httpd -y

Cómo saber qué versión de Apache hemos instalado

Si queremos saber qué versión exacta de Apache estamos instalando en CentOS 7 usaríamos el comando httpd:

~$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Jan 25 2022 14:08:43

Cómo iniciar Apache y configurar el arranque automático

Ya tenemos Apache instalado, pero no está en marcha, algo que podríamos comprobar fácilmente mediante el comando systemctl status httpd:

como instalar el servidor web apache en centos 7

Por tanto tenemos que iniciar el servicio y hacer que lo haga también en cada arranque de CentOS 7, para no tener que iniciarlo manualmente. En primer lugar habilitamos el inicio automático:

~$ sudo systemctl enable httpd

Y a continuación iniciamos el servicio httpd por primera vez:

~$ sudo systemctl start httpd

Cómo configurar el firewall de CentOS 7 para acceder al servidor Apache

Ahora ya tenemos el servidor web Apache funcionando y configurado para iniciar automáticamente, pero tenemos un pequeño problema, ya que por defecto el firewall bloquea el acceso desde red.

La solución es configurar el acceso a Apache abriendo en el firewall los puertos tcp 80 y 443 (si queremos tener servicio http seguro), de modo permanente:

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

Además de abrir los puertos para Apache, hay que recargar la configuración del firewall para que los cambios entren en funcionamiento de modo inmediato:

~$ sudo firewall-cmd --reload

Ahora sí podemos acceder a nuestro servicio web Apache en CentOS 7 desde cualquier lugar de la red, usando como URL la dirección IP o el dominio del servidor:

instalar el servidor web apache en centos 7
Página web por defecto de Apache en CentOS 7

Configurar Apache en CentOS 7

A continuación vamos a configurar Apache en CentOS para utilizarlo en los escenarios más habituales.

En CentOS 7 encontramos el directorio de configuración de Apache en /etc/httpd/, y el archivo de configuración principal en /etc/httpd/conf/httpd.conf. Este es el archivo que editaremos para realizar los ajustes.

ServerName (nombre del servidor)

Si nuestro servidor NO tiene configurado el FQDN (nombre cualificado de dominio) habrá que configurar un detalle con respecto a nuestro nuevo servicio Apache. Podremos observar si revisamos el registro del sistema (/var/log/messages) lo siguiente:

...
Sep 21 13:16:05 localhost systemd: Starting The Apache HTTP Server...
Sep 21 13:16:06 localhost httpd: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Sep 21 13:16:06 localhost systemd: Started The Apache HTTP Server.
...

Vemos que cada vez que inicia el servidor web Apache se registra un aviso de que no está configurada la directiva ServerName en la configuración. La solución es simple, consiste en configurar un ajuste /etc/httpd/conf/httpd.conf:

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

Buscamos la directiva ServerName que, por defecto, aparece desactivada:

...
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName www.example.com:80
...

Añadimos una línea con la directiva ServerName y el nombre de nuestra máquina, solucionando así el aviso en el registro.

...
ServerName centos7.local.lan
...

Guardados los cambios, reiniciamos Apache para aplicar la nueva configuración:

~$ sudo systemctl restart httpd

Y comprobamos los mensajes del sistema:

~$ sudo tail /var/log/messages
...
Sep 21 13:30:11 localhost systemd: Stopping The Apache HTTP Server...
Sep 21 13:30:13 localhost systemd: Starting The Apache HTTP Server...
Sep 21 13:30:13 localhost systemd: Started The Apache HTTP Server.

Como podemos ver ya no queda rastro del error.

Esto no sería necesario si el servidor CentOS tiene configurado el nombre de dominio, ya que Apache lo toma como valor por defecto de ServerName.

Usuario y grupo de Apache

Un dato importante que debemos conocer es el usuario y grupo con que se ejecuta Apache, que son, respectivamente, apache y apache. Es necesario saberlo para configurar los permisos de escritura que puedan necesitar nuestras aplicaciones web.

Podemos consultar e incluso cambiar el usuario y grupo de Apache a través de las directivas User y Group en httpd.conf.

Servidores Virtuales Apache en CentOS 7

Si queremos que nuestro servidor o VPS CentOS 7 sea capaz de servir distintos sitios web para distintos dominios, necesitamos configurar servidores virtuales de Apache.

Si aún no has registrado los dominios, te recomiendo Namecheap, el lugar donde registro y renuevo los dominios de mis sitios web, como por ejemplo este sitio.

En este ejemplo trabajaremos con servidores virtuales para el dominio centos7.local.lan y los subdominios vhost1.centos7.local.lan y vhost2.centos7.local.lan.

Para configurar servidores virtuales de Apache en CentOS 7 vamos a seguir una aproximación similar a la de Debian.

Tendremos una carpeta /etc/httpd/sites-available/ donde guardaremos los archivos de configuración de cada servidor virtual. En una segunda carpeta /etc/httpd/sites-enabled/ crearemos enlaces simbólicos a cada uno de los archivos de la primera carpeta. Creando y eliminando estos enlaces dentro de sites-enabled/ será la forma en que activaremos y desactivaremos cada servidor virtual, de forma independiente.

Así que en primer lugar creamos las carpetas sites-available/ y sites-enabled/ dentro de /etc/httpd/ como acabamos de decir:

~$ sudo mkdir /etc/httpd/sites-available /etc/httpd/sites-enabled

Para que Apache tenga en consideración estos archivos de configuración, tendremos que instruirle a través de la configuración en httpd.conf.

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

Añadiremos una directiva IncludeOptional al final del archivo para que cargue los archivos de configuración presentes en /etc/httpd/sites-enabled/:

...
IncludeOptional sites-enabled/*.conf

Guardamos los cambios, cerramos el archivo y recargamos la configuración de Apache:

~$ sudo systemctl reload httpd

Ahora, cada vez que Apache reinicie o recargue la configuración, tendrá en cuenta los servidores virtuales que tengan enlaces desde sites-enabled/ a los archivos de configuración en sites-available/.

Vamos a crear las carpetas que contendrán los archivos de las webs de cada servidor virtual en /var/www/:

~$ sudo mkdir /var/www/vhost1 /var/www/vhost2

Además de crear las carpetas, cambiamos el propietario de las mismas para que sea el usuario que se ocupará de gestionarlas.

~$ sudo chown chacho:chacho /var/www/vhost1 /var/www/vhost2

Creamos un archivo index.html en cada carpeta de servidor virtual para que tengan algún contenido. Por ejemplo, para el servidor virtual vhost1.centos7.local.lan creamos el archivo index.html:

~$ sudo nano /var/www/vhost1/index.html

Con este único contenido:

<h1>vhost1.centos7.local.lan</h1>

De forma similiar haríamos con el resto de servidores virtuales.

Ya sólo queda crear los archivos de configuración para cada servidor virtual dentro de la carpeta /etc/httpd/sites-available/. Por ejemplo, para el primer servidor virtual:

~$ sudo nano /etc/httpd/sites-available/vhost1.conf

Y este sería el contenido del archivo:

<VirtualHost *:80>
        ServerName vhost1.centos7.local.lan
        DocumentRoot /var/www/vhost1
        <Directory /var/www/vhost1>
                AllowOverride all
                Require all granted
        </Directory>
        ErrorLog /var/log/httpd/vhost1-error.log
        CustomLog /var/log/httpd/vhost1-access.log combined
</VirtualHost>

Y creamos el segundo servidor virtual:

~$ sudo nano /etc/httpd/sites-available/vhost2.conf

Con este contenido:

<VirtualHost *:80>
        ServerName vhost2.centos7.local.lan
        DocumentRoot /var/www/vhost2
        <Directory /var/www/vhost2>
                AllowOverride all
                Require all granted
        </Directory>
        ErrorLog /var/log/httpd/vhost2-error.log
        CustomLog /var/log/httpd/vhost2-access.log combined
</VirtualHost>

Lógicamente tú tendrás que sustituir tus dominios, nombres de carpeta, etc. donde corresponda.

Ahora vamos a enlazar estos archivos de configuración para que carguen en la configuración de Apache:

~$ sudo ln -s /etc/httpd/sites-available/vhost1.conf /etc/httpd/sites-enabled/
~$ sudo ln -s /etc/httpd/sites-available/vhost2.conf /etc/httpd/sites-enabled/

Y ya sólo nos quedaría recargar la configuración de Apache:

~$ sudo systemctl reload httpd

Y ya podemos acceder a los servidores virtuales a través de los dominios que hemos configurado.

servidores virtuales de apache en centos 7

Servidor Virtual de Apache por defecto en CentOS

Un problema que tenemos es que accediendo al servidor por su dirección IP o por cualquier dominio o subdominio que se resuelva con esa IP mostrarán siempre la página perteneciente al primer servidor virtual que cargue la configuración de Apache.

Este no suele ser un comportamiento deseable, así que la solución es crear un servidor virtual adicional que se encargue de responder a todas estas peticiones. Podríamos llamar al archivo de configuración 000-default.conf (para que por orden alfabético se cargue en primer lugar):

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

Y su contenido sería algo como:

<VirtualHost *:80>
        DocumentRoot /var/www/html
</VirtualHost>

Recordemos que prácticamente toda la configuración por defecto se toma de /etc/httpd/conf/httpd.conf, por lo que no es necesario especificar opciones, a no ser que queramos cambiarlas. Enlazamos este archivo en sites-enabled/:

~$ sudo ln -s /etc/httpd/sites-available/000-default.conf /etc/httpd/sites-enabled/

Y recargamos la configuración de Apache:

~$ sudo systemctl reload httpd

Y tenemos el servidor por defecto y los servidores específicos funcionando.

apache virtual host centos 7

Servidores virtuales de Apache en directorios de usuario en CentOS 7

Al configurar servidores virtuales o sitios web bajo /var/www/ y /var/www/html/, como hemos visto en los ejemplos anteriores, no deberíamos tener ningún tropiezo. Sin embargo, si usamos la carpeta personal de cada usuario para alojar sus sitios web, sí que podríamos tener problemas.

Por ejemplo, yo suelo alojar los sitios web que desarrollo bajo la carpeta ~/public_html/ de mi usuario en el sistema. Es decir, si mi usuario es chacho, alojaré en /home/chacho/public_html/ tantas carpetas como proyectos quiera desplegar. Es muy habitual hacerlo así, especialmente en sistemas donde conviven varios usuarios.

Podríamos tener un archivo de configuración de servidor virtual para un proyecto en la carpeta personal de usuario como este:

<VirtualHost *:80>
   ServerName vhost1.centos7.local.lan
   DocumentRoot /home/chacho/public_html/vhost1
   <Directory /home/chacho/public_html/vhost1>
      AllowOverride all
      Require all granted
   </Directory>
   ErrorLog /var/log/httpd/vhost1-error.log
   CustomLog /var/log/httpd/vhost1-access.log combined
</VirtualHost>

Error AH00035 y error 403 Forbidden de Apache en CentOS 7

Pero esta configuración no funciona por defecto, y mientras que el navegador puede arrojar un error 403 Forbidden, en los registros del servidor virtual pueden aparecer errores AH00035.

como configurar el servidor web apache en centos 7
Error 403: Forbidden. Apache no puede acceder a los archivos web.

Para conseguir nuestro objetivo, debemos vencer dos obstáculos distintos.

Por un lado los permisos de lectura. Aunque la carpeta ~/public_html/ y las que cuelguen de ella tengan permisos de lectura y acceso para terceros, en CentOS 7 la carpeta personal del usuario (la que cuelga directamente de /home/) sólo tiene permisos para el propietario. No tiene permisos ni para el grupo ni para terceros. Por tanto debemos dar permisos de lectura y acceso a terceros:

~$ chmod 755 /home/chacho

El siguiente problema es la seguridad extendida SELinux que viene activada por defecto en CentOS 7. En nuestro caso, el servidor no tiene permiso para servir archivos desde cualquier ubicación sólo desde las ubicaciones estándar.

La solución es dar los permisos extendidos necesarios a las ubicaciones que SELinux no permite por defecto en CentOS 7.

Por ejemplo, para conceder al servidor acceso a la carpeta /home/chacho/public_html/ usaremos el comando chcon:

~$ sudo chcon -R --type=httpd_sys_content_t /home/chacho/public_html

Si la aplicación web que vamos a instalar va a escribir archivos en su propio directorio, por ejemplo, un WordPress, entonces usaremos chcon de esta forma:

~$ sudo chcon -R --type=httpd_sys_rw_content_t /home/chacho/public_html/wordpress

Cambiando los permisos de acceso convencionales y extendidos ya podremos configurar servidores virtuales en cualquier ubicación

Para estos cambios no es necesario recargar la configuración de Apache.

Conclusión

Ya hemos visto cómo instalar y configurar Apache en CentOS 7, manejar su configuración básica y añadir servidores virtuales. Con todo esto ya sólo quedarían pequeños retoques dependientes de cada caso particular, para ajustar el servidor web de CentOS a tus necesidades.

Para cualquier duda, pregunta o error, déjame un mensaje y te digo algo.

¡Apoya comoinstalar.me!

¿Te ha sido de utilidad este artículo? ¿Te has ahorrado un dolor de cabeza al configurar Apache en CentOS 7? Si es así y quieres agradecérnoslo, puedes apoyarnos con el mantenimiento del sitio (y un ventilador para la oficina, este verano es muy caluroso) dejando una propina de 1 $ en PayPal:

O, si te sientes especialmente agradecido, invitándonos a un café:

¡Gracias!

NOTA: Este es el ventilador que tenemos pensado para la oficina:

Valora esta entrada

5/5 - (4 votos)

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

  1. Buenas tardes, Instalador. Estoy haciendo paso por paso lo que describís en el artículo. Llegué hasta «Servidor Virtual de Apache por defecto en CentOS»

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

    Y su contenido sería algo como:

    DocumentRoot /var/www/html

    ~$ sudo ln -s /etc/httpd/sites-available/000-default.conf /etc/httpd/sites-enabled/

    Y recargamos la configuración de Apache:

    ~$ sudo systemctl reload httpd

    Y es acá donde me arroja el siguiente error:

    Job for httpd.service failed because the control process exited with error code. See «systemctl status httpd.service» and «journalctl -xe» for details.

    OTRA OBSERVACIÓN: Cuando tipeo desde mi PC la URL que coloqué yo no encuentra el index.html (no encuentra la página).

    Desde ya, ¡muchas gracias por el aporte!

    ¡Saludos!

    Responder
    • Hola, Fabricio. Obviamente el directorio /var/www/html y el contenido que quieras mostrar con el servidor virtual por defecto deben existir previamente a la aplicación de la nueva configuración. Simplemente crea /var/www/html, crea un archivo index.html personalizado, recarga la configuración del servicio y accede desde el navegador.

      Responder
  2. Hola, muchas gracias por tus grandes aportes. Tengo un pequeño inconveniente en mi servidor con CentOS 7. He montado Moodle y corre todo casi bien, el detalle es el siguiente: Cuando coloco en la barra de direcciones *ipPública*/aulavirtual funciona sin problemas. He creado un subdominio para verlo así: subdominio.dominio.edu.pe. Hasta acá también funciona sin problemas. Luego, quiero que también funcione asi: subdominio.dominio.edu.pe/aulavirtual y cuando presiono enter automáticamente se convierte en *ipPública*/aulavirtual. Cabe indicar que también tengo phpMyAdmin y funciona sin problemas en la forma subdominio.dominio.edu.pe/phpmyadmin.

    Agradecería tu ayuda, por favor.

    Responder
    • Hola, José. El problema que tienes no es con el servicio web, sino que algunas aplicaciones complejas guardan en su configuración la dirección con la que fueron instaladas y esperan posteriormente ser accedidas con dicha dirección. Al realizar cambios de URL habrá problemas del tipo que comentas. En estos casos hay que instalar la aplicación con la URL definitiva o tocar la configuración de la aplicación para modificar dicha URL.

      Sin embargo, con aplicaciones más simples, como la que también comentas, puedes usar cualquier dirección que sea resuelta correctamente porque es algo totalmente transparente para ellas.

      Responder
  3. Una pregunta estoy haciendo una instalación básica pero al momento de subir un archivo php y verlo a través de un browser no ejecuta el archivo sino despliega su contenido, que me esta faltando por hacer?

    Responder

Deja un comentario