dilluns, 11 de gener de 2016

Apache virtual host configuration on Centos 7.2

Introducció:

L'objectiu d'aquest article és configurar un Apache amb suport per a virtual hosts amb una distribució CentOS 7.2. Per a la realització d'aquesta tasca utilitzarem KVM com a hipervisor i una màquina virtual.

Configuració bàsica

Instal·lem una CentOS 7.2 i l'actualitzem. Una volta actualitzada la distribució procedim a configurar la xarxa amb una IP. En el nostre cas la IP assignada serà 192.168.122.4. Per configurar la xarxa editem el fitxer /etc/sysconfig/networking-scripts/ifcfg-eth0 amb la següent configuració:
HWADDR=52:54:00:44:9B:40
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.122.4
NETMASK=255.255.255.0
USERCTL=no
NAME=eth0
UUID=b166b9bb-a7a3-4d6e-8a76-0c9dfa2d9be7
ONBOOT=yes
Una volta assignada una IP a la xarxa, configurem també la porta d'enllaç per a que la màquina virtual tinga eixida a Internet. Editem el fitxer /etc/sysconfig/network com següeix:
# Created by anaconda
NETWORKING=yes
HOSTNAME="apache-c7"
GATEWAY=192.168.122.1
Afegim també un DNS per a que puga realitzar la resolució de noms a /etc/resolv.conf.
...
nameserver 192.168.122.1
Una volta tenim configurada la xarxa, el DNS bàsic i la màquina es capaç de fer ping a altres màquines dins la seua xarxa privada procedirem a la instal·lació i configuració del servidor web.

Configuració d'Apache:

El primer que farem serà instal·lar Apache. Per a instal·lar Apache a una distribució CentOS teclegem la següent comanda:
yum install httpd
Una volta tenim Apache instal·lat habilitem en el firewall el port 80 per a que el servidor puga rebre peticions.
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
Seguidament configurem el servidor per a que s'arranque automàticament al iniciar la màquina.
systemctl enable httpd
I arranquem el servidor.
systemctl start httpd
A partir d'ací utilitzarem una forma de configurar els virtual hosts un poc diferent a l'habitual. En primer lloc crearem l'estructura de directoris que utilitzarem per desplegar les pàgines web. Crearem un directori amb el nom del domini i despres crearem dos directoris www i log per enmagatzemar les pàgines i els logs respectivament.
sudo mkdir -p /var/www/proba.com/www
sudo mkdir -p /var/www/proba2.com/www

sudo mkdir -p /var/www/proba.com/log
sudo mkdir -p /var/www/proba2.com/log
Creem el següent fitxer a /var/www/proba.com/www/index.html amb el següent codi:
<html>
 <head>
    <title>Proba.com</title>
  </head>
  <body>
    <h1>Proba.com funciona!</h1>
  </body>
</html>
Repetim el proces per al segon host. Creem el següent fitxer a /var/www/proba2.com/www/index.html amb el següent codi:
<html>
 <head>
    <title>Proba2.com</title>
  </head>
  <body>
    <h1>Proba2.com funciona!</h1>
  </body>
</html>

Aquest fitxers els configurarem amb permisos 644. Crearem també dos directoris en el directori de configuració de l'Apache per gestionar més facilment el diferents virtual hosts que anirem configurant.
sudo mkdir -p /etc/httpd/sites-available
sudo mkdir -p /etc/httpd/sites-enabled
Afegim la següent linia al final del fitxer /etc/httpd/conf/httpd.conf per a afegir una nova ubicació per als fitxers del virtual host.
IncludeOptional sites-enabled/*.conf
Configurem el primer domini proba.com. Editarem el següent fitxer:
vi /etc/httpd/sites-available/proba.com.conf
Amb les següents opcions:

    ServerName www.proba.com
    ServerAlias proba.com
    DocumentRoot /var/www/proba.com/www
    ErrorLog /var/www/proba.com/log/error.log
    CustomLog /var/www/proba.com/log/requests.log combined

Repetim el procés per al segon domini:
vi /etc/httpd/sites-available/proba2.com.conf
Amb les següents opcions:

    ServerName www.proba2.com
    ServerAlias proba2.com
    DocumentRoot /var/www/proba2.com/www
    ErrorLog /var/www/proba2.com/log/error.log
    CustomLog /var/www/proba2.com/log/requests.log combined

Per activar els diferents virtual hosts crearem un soft link al directori que el fitxer de configuració utilitza.
sudo ln -s /etc/httpd/sites-available/proba.com.conf \ 
     /etc/httpd/sites-enabled/proba.com.conf
sudo ln -s /etc/httpd/sites-available/proba2.com.conf \ 
     /etc/httpd/sites-enabled/proba2.com.conf
I reiniciarem Apache per a que recarregue la configuració.
systemctl stop httpd
systemctl start httpd
Configurem la resolució de noms localment en la màquina desde la que realitzem la petició de la pàgina. Si la màquina que utilitzem per realitzar la petició es un linux, com es el nostre cas, afegirem al fitxer /etc/hosts les dues entrades referents a proba i proba2.
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.122.4   apache-c7
192.168.122.4   www.proba.com
192.168.122.4   www.proba2.com
Al realitzar la proba el servidor web donava un error de permisos en el fitxer /var/log/httpd/error_log, pero si comprovavem els permisos aquestos semblaven correctes. Comprovem que no siga un problema relacionat amb SElinux.
...
[Tue Dec 22 06:16:33.069393 2015] [mpm_prefork:notice] 
[pid 1142] AH00170: caught SIGWINCH, shutting down gracefully
(13)Permission denied: AH00091: httpd: could not open error log 
file /var/www/proba2.com/log/error.log.
AH00015: Unable to open logs
(13)Permission denied: AH00091: httpd: could not open error log 
file /var/www/proba2.com/log/error.log.
AH00015: Unable to open logs
(13)Permission denied: AH00091: httpd: could not open error log 
file /var/www/proba2.com/log/error.log.
AH00015: Unable to open logs
(13)Permission denied: AH00091: httpd: could not open error log 
file /var/www/proba2.com/log/error.log.
AH00015: Unable to open logs
...
Per facilitar-nos la tasca instal·lem el paquet setroubleshoot que ens ajuda a identificar els problemes relacionats amb SElinux.
yum install setroubleshoot
Executem la següent comanda sobre el log de SElinux per veure possibles problemes i ens mostra que efectivament SElinux esta bloquejant l'accés.
sealert -a /var/log/audit/audit.log 
La següent comanda sol·lucionarà el problema.
chcon -R -t httpd_sys_rw_content_t log/

Enllaços:

https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-centos-7
https://wiki.centos.org/es/HowTos/SELinux