En este artículo veremos cómo instalar Apache en CentOS 6 paso a paso, de modo que puedas experimentar con este servidor web, incluyendo la configuración del firewall, servidores virtuales y configuración de seguridad SSL para el protocolo HTTPS.
Contenido
Antes de instalar Apache en CentOS 6
Para poder seguir esta guía de instalación de Apache en CentOS 6 necesitas partir de los siguientes requisitos básicos:
- Un sistema CentOS 6 actualizado.
- Dominios o subdominios apuntando al servidor CentOS 6 si planeas configurar servidores virtuales.
- Acceso a consola con un usuario con permisos de sudo o el mismo root.
- Conexión a Internet.
Este tutorial se ha realizado sobre la versión 6.10 Final de CentOS.
Cómo instalar Apache en CentOS 6
Para instalar Apache en CentOS 6 usaremos los paquetes presentes en los repositorios de la distribución, por lo que es conveniente actualizar la información de las listas de paquetes:
~$ sudo yum update -y
El paquete que buscamos es httpd, que corresponde con el servidor web Apache 2.2.15, así que lo instalaremos con yum:
~$ sudo yum install -y httpd
Cuando termine la descarga e instalación del paquete httpd y sus dependencias tendremos un nuevo servicio en CentOS 6 llamado httpd. Este servicio no queda en ejecución ni activado, por lo que Apache no iniciará automáticamente en cada arranque de CentOS 6.
Iniciaremos el servicio httpd con el comando service:
~$ sudo service httpd start
Y nos aseguraremos de que Apache inicie automáticamente con CentOS 6 con el comando chkconfig:
~$ sudo chkconfig --level 2345 httpd on
Comprobaremos el estado del servicio en cualquier momento con el comando service:
~$ sudo service httpd status Se está ejecutando httpd (pid 1851)...
Configurar el firewall para Apache en CentOS 6
Por defecto el firewall de CentOS 6 bloqueará los puertos en los que acepta conexiones el servidor web Apache, el 80/TCP para el protocolo HTTP estándar y el 443/TCP para el protocolo HTTPS seguro.
Antes de añadir reglas para el firewall, veamos la configuración actual:
~$ sudo iptables -L --line Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination
Vemos que la regla 5 de la cadena INPUT rechaza todo el tráfico entrante, por lo que tendremos que insertar las nuevas reglas por encima de ese número de línea.
Para habilitar el puerto HTTP insertaremos la siguiente regla con iptables:
~$ sudo iptables -I INPUT 5 -m state --state NEW -p tcp --dport 80 -j ACCEPT
Si tenemos pensado usar también el protocolo HTTPS tendremos que insertar su propia regla:
~$ sudo iptables -I INPUT 5 -m state --state NEW -p tcp --dport 443 -j ACCEPT
En cualquier caso si queremos que la configuración sea permanente tendremos que guardar las nuevas reglas:
~$ sudo service iptables save
Comprobaremos el funcionamiento de Apache conectando desde otra máquina de la red empleando como URL la dirección IP o el dominio del servidor CentOS 6:
Cómo configurar Apache en CentOS 6
Para configurar Apache en CentOS 6 debes saber que la ruta de los archivos y directorios de configuración es /etc/httpd/. El archivo de configuración principal es httpd.conf y se encuentra en la carpeta conf/.
Hay otra carpeta adicional de la que también se cargan otros archivos de configuración, además de conf/, que es conf.d/.
La página web por defecto de Apache está configurada para ser alojada en /var/www/html/. Sin embargo, la página de prueba que hemos visto hace unos instantes no se ubica en esa ruta. En realidad es una página de error que se muestra al estar vacía la ruta /var/www/html/. La configuración que muestra esta página de bienvenida/error se carga de conf.d/welcome.conf.
Las páginas de registro de accesos y errores son access_log y error_log y se guardan en la ruta /var/log/httpd/.
Tras realizar cualquier cambio en la configuración de Apache en CentOS 6 será necesario recargar la configuración del servicio httpd:
~$ sudo service httpd reload
En ocasiones puede ser necesario reiniciar el servicio:
~$ sudo service httpd restart
Servidores virtuales de Apache en CentOS 6
Vamos a configurar servidores virtuales de Apache en CentOS 6. Para ello editaremos httpd.conf para activar el uso de servidores virtuales:
~$ sudo nano /etc/httpd/conf/httpd.conf
Buscaremos la directiva NameVirtualHost:
... # Use name-based virtual hosting. # #NameVirtualHost *:80 ...
Activaremos esta directiva eliminando el carácter # inicial:
... NameVirtualHost *:80 ...
Ahora añadimos al final del archivo una directiva Include relativa a un directorio donde guardaremos los archivos de configuración de cada servidor virtual que configuremos:
... Include sites.d/*.conf
Guardamos los cambios y cerramos el archivo.
Tenemos que crear el directorio para las configuraciones de servidores virtuales tal como hemos indicado en la configuración:
~$ sudo mkdir /etc/httpd/sites.d
Servidor virtual por defecto de Apache
Antes de añadir un servidor virtual para un nuevo dominio o subdominio es necesario crear el servidor virtual por defecto, que recogerá las peticiones para la dirección o direcciones IP del servidor CentOS 6, el dominio principal (en este ejemplo es centos6.local.lan) y cualquier dominio que apunte al servidor pero no tenga su propio servidor virtual configurado.
Apache considera como servidor virtual por defecto aquel cuya configuración carga en primer lugar, así que usaremos un nombre de archivo alfabéticamente favorable para nuestros propósitos:
~$ sudo nano /etc/httpd/sites.d/000-default.conf
El contenido será mínimo:
<VirtualHost *:80> </VirtualHost>
Toda la configuración cargará con valores por defecto y los especificados en httpd.conf.
Servidores virtuales adicionales
Solucionado el asunto del servidor virtual por defecto, pasamos a añadir servidores virtuales adicionales, por ejemplo para el subdominio blog.centos6.local.lan, creando el archivo de configuración:
~$ sudo nano /etc/httpd/sites.d/blog.centos6.local.lan.conf
El contenido básico sería el siguiente:
<VirtualHost *:80> ServerName blog.centos6.local.lan DocumentRoot /var/www/blog.centos6.local.lan ErrorLog logs/blog.centos6.local.lan-error.log CustomLog logs/blog.centos6.local.lan-access.log combined </VirtualHost>
Donde encontramos las siguientes directivas:
- ServerName: Especifica el dominio al que responde este servidor virtual.
- DocumentRoot: El directorio donde se alojan los archivos web del servidor.
- ErrorLog: El archivo de registro de errores.
- CustomLog: El registro de accesos al servidor.
Guardamos los cambios y cerramos el archivo.
Tenemos que preparar el contenido web de este servidor virtual creando su carpeta raíz de archivos web tal y como está especificada en la directiva DocumentRoot:
~$ sudo mkdir /var/www/blog.centos6.local.lan
Para este ejemplo preparamos un contenido mínimo:
~$ sudo nano /var/www/blog.centos6.local.lan/index.html
El archivo HTML contendrá un simple mensaje:
<h1>Bienvenidos a blog.centos6.local.lan</h1>
Guardados los cambios del archivo, sólo queda recargar la configuración de Apache:
~$ sudo service httpd reload
Y ya podemos conectar al servidor Apache desde un navegador con las distintas posibilidades:
A partir de este momento, añadir más servidores virtuales de Apache en CentOS 6 es tan sencillo como:
- Configurar un dominio o subdominio que apunte al servidor CentOS 6.
- Preparar la carpeta y archivos web del nuevo servidor virtual.
- Crear el archivo de configuración con extensión .conf en la carpeta sites.d/.
- Recargar la configuración de Apache.
Desactivar servidores virtuales
Por otro lado para eliminar o desactivar un servidor virtual podemos borrar su archivo de configuración o cambiarle la extensión a cualquiera distinta de .conf, y a continuación recargar la configuración del servicio Apache.
Configurar Apache con seguridad SSL en CentOS 6
Para configurar la seguridad SSL de Apache en CentOS 6 es necesario instalar el módulo SSL de Apache, que encontraremos en los repositorios de CentOS 6. El paquete que necesitamos es mod_ssl y lo instalaremos con yum:
~$ sudo yum install mod_ssl
Además de la instalación del módulo SSL de Apache, se instala un archivo de configuración ssl.conf en conf.d/ y unos certificados autofirmados. La configuración por defecto usa estos nuevos certificados, llamados localhost.key y localhost.crt y sus rutas están configuradas en el archivo ssl.conf.
Si dispones de tus propias claves RSA y certificados SSL puedes editar ssl.conf:
~$ sudo nano /etc/httpd/conf.d/ssl.conf
Las directivas que hay que buscar son SSLCertificateFile y SSLCertificateKeyFile:
... SSLCertificateFile /etc/pki/tls/certs/localhost.crt ... SSLCertificateKeyFile /etc/pki/tls/private/localhost.key ...
Tendrás que ajustar sus valores a las rutas de tus propios certificados. Si planeas usar un certificado firmado por alguna autoridad certificadora, además tendrás que configurar la directiva SSLCertificateChainFile:
... #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt ...
Será necesario eliminar el carácter # inicial e indicar la ruta al archivo «chain«. Por defecto viene desactivada porque para certificados autofirmados no es necesaria.
Guardados los cambios en el archivo, habrá que recargar la configuración de Apache.
Ahora probaremos a acceder al servidor web usando una URL que comience por https:// en lugar de por http:// como hicimos anteriormente:
En el caso de usar certificados SSL autofirmados el navegador nos hará saber que no confía en ellos, ya que no hay una autoridad certificadora que los garantice.
Según el navegador del que se trate habrá una opción que nos permita continuar, en este ejemplo sería pulsando el botón «Configuración avanzada» y a continuación el enlace «Acceder a xxxxxxxx (sitio no seguro)» que se despliega. Hecho esto el navegador accederá a la página, aunque de una forma u otra seguirá mostrando avisos de seguridad relativos a los certificados empleados:
A pesar de los avisos, la conexión está cifrada y se usa el puerto 443/TCP en lugar del 80/TCP.
Configuración para servidores virtuales
Esta configuración por defecto del módulo SSL de Apache en CentOS 6 está pensada para un servidor que ofrece la página web por defecto. Si estás interesado en montar distintos servidores virtuales con sus propios certificados SSL, partiendo del ejemplo de servidores virtuales de este tutorial haremos algunos cambios.
En primer lugar, el archivo ssl.conf incluye una parte de configuración general para cargar el módulo SSL y ajustes por defecto. De esta primera lo único que hay que hacer es añadir una directiva NameVirtualHost.
En una segunda parte, el archivo ssl.conf incluye una configuración para el servidor virtual por defecto que habremos de cortar y pegar en el archivo 000-default.conf. Debemos hacerlo porque si no esta configuración cargaría siempre, colisionando con la configuración particular si accedemos a un servidor virtual distinto.
Haremos un respaldo del archivo ssl.conf original:
~$ sudo cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.ORIGINAL
Y editaremos el archivo ssl.conf eliminando por completo el bloque VirtualHost. Nos quedaría algo así (se han eliminado los comentarios por brevedad):
LoadModule ssl_module modules/mod_ssl.so Listen 443 NameVirtualHost *:443 SSLPassPhraseDialog builtin SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000) SSLSessionCacheTimeout 300 SSLMutex default SSLRandomSeed startup file:/dev/urandom 256 SSLRandomSeed connect builtin #SSLRandomSeed startup file:/dev/random 512 #SSLRandomSeed connect file:/dev/random 512 #SSLRandomSeed connect file:/dev/urandom 512 SSLCryptoDevice builtin #SSLCryptoDevice ubsec
Observa que hemos añadido la directiva NameVirtualHost debajo de Listen para activar la configuración de servidores virtuales con seguridad SSL.
Si guardas los cambios y recargas Apache, se cargará el módulo SSL y el servidor web seguirá atendiendo peticiones en el puerto 443/TCP, pero ningún servidor virtual podrá responderlas.
Editaremos la configuración del servidor virtual por defecto y copiaremos al final del mismo el bloque VirtualHost que hemos eliminado de ssl.conf:
~$ sudo nano /etc/httpd/sites.d/000-default.conf
El bloque que añadimos quedaría así (sin los comentarios):
<VirtualHost *:80> </VirtualHost> <VirtualHost _default_:443> ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn SSLEngine on SSLProtocol all -SSLv2 SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt #SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt #SSLVerifyClient require #SSLVerifyDepth 10 #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire <Files ~ "\.(cgi|shtml|phtml|php3?)$"> SSLOptions +StdEnvVars </Files> <Directory "/var/www/cgi-bin"> SSLOptions +StdEnvVars </Directory> SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost>
Guardamos los cambios y cerramos el archivo.
En realidad la configuración puede ser más simple. Vamos a añadir cifrado SSL al servidor virtual adicional que configuramos antes para el subdominio blog.centos6.local.lan.
Si no tenemos un certificado SSL firmado, podemos crear e instalar uno nuevo autofirmado para este servidor virtual:
~$ sudo openssl req -newkey rsa:2048 -x509 -nodes -days 365 -keyout /etc/pki/tls/private/blog.centos6.local.lan.key -out /etc/pki/tls/certs/blog.centos6.local.lan.crt
Puedes contestar en blanco a las preguntas, pero en «Common Name» es interesante responder con el dominio o subdominio que estamos configurando:
... Common Name (eg, your name or your server's hostname) []:blog.centos6.local.lan ...
Editamos el archivo del sevidor virtual:
~$ sudo nano /etc/httpd/sites.d/blog.centos6.local.lan.conf
Y añadimos un bloque VirtualHost para el protocolo HTTPS:
<VirtualHost *:80> ServerName blog.centos6.local.lan DocumentRoot /var/www/blog.centos6.local.lan ErrorLog logs/blog.centos6.local.lan-error.log CustomLog logs/blog.centos6.local.lan-access.log combined </VirtualHost> <VirtualHost *:443> ServerName blog.centos6.local.lan DocumentRoot /var/www/blog.centos6.local.lan SSLEngine on SSLCertificateFile /etc/pki/tls/certs/blog.centos6.local.lan.crt SSLCertificateKeyFile /etc/pki/tls/private/blog.centos6.local.lan.key #SSLCertificateChainFile LogLevel warn ErrorLog logs/blog.centos6.local.lan-error.log CustomLog logs/blog.centos6.local.lan-access.log combined </VirtualHost>
Observa que es mucho más reducido. Guardamos los cambios, cerramos el archivo y recargamos la configuración de Apache.
Por fin podemos acceder con las distintas direcciones y dominios al servidor web de nuestra máquina CentOS 6:
Ha sido un camino lleno de obstáculos, pero al final lo hemos conseguido.
Conclusión
Ahora ya sabes cómo instalar y configurar Apache en CentOS 6 al más puro estilo old school, con una configuración de firewall algo correosa, la entrañable versión 2.2 de Apache y la farragosa configuración del módulo SSL. A partir de aquí ya puedes sacarle todo el partido a tu VPS CentOS 6 si aún no te animas a actualizar.
En caso de dudas, sugerencias, preguntas, etc. puedes dejar un comentario.
¡Apoya comoinstalar.me!
¿Te ha servido esta guía de instalación y configuración de Apache en CentOS 6? ¿Quieres más guías y tutoriales del viejo CentOS 6 para mantener viejos servidores y VPS CentOS 6? Un poco de apoyo estimulará la inversión de tiempo y recursos en este tipo de guías, así que si quieres agradecérnoslo puedes hacerlo dejando tan sólo 1 $ de propina desde PayPal:
¡Gracias!