Salta el contingut

MP08 - UF1: Servidors web i de transferència de fitxers

Apache i Nginx - Hosting virtual (ii)

Ja és hora de deixar de treballar amb l'URL que apunti a http://ipDelServidor i treballem com si estiguéssim en un servidor real. Per això cal tenir un nom de domini registrat a internet. Com que no és el nostre cas, no ens interessa de moment, simularem un lloc web en el nostre servidor local.

Per a treballar fàcilment i no haver de dependre de servidors DNS podem modificar directament el fitxer de hosts del nostre ordinador client. Aquest fitxer el trobem a:

  • Windows -> C:\Windows\System32\Drivers\etc\hosts
  • Linux -> /etc/hosts

D'aquesta manera, en qualsevol dels sistemes, podem afegir línies al final del fitxer amb el format següent: <ip_de_servidor> <nom_a_resoldre>

Per a modificar el fitxer hosts...

En Windows no ens deixarà modificar el fitxer C:\Windows\System32\Drivers\etc\hosts si no ho fem com usuari administrador. Per tant, podeu iniciar sessió com a administrador en un cmd i executar la comanda notepad.exe C:\Windows\System32\Drivers\etc\hosts. D'aquesta manera tindrem permisos d'administrador i podrem modificar el fitxer.

Imaginem que volem accedir al nostre servidor, però amb els següents noms: projecte1.daw.cat i projecte2.daw.cat. Si l'accés al nostre servidor el fem a partir de la IP ipDelServidor (o la del vostre company de classe), caldrà afegir, al final del fitxer de hosts les següents línies:

ipDelServidor   projecte1.daw.cat
ipDelServidor   projecte2.daw.cat

Ara estem en disposició d'accedir al nostre servidor (o el del company) amb aquest url. Provarem de fer un ping projecte1.daw.cat i veurem com ens resol el nom:

C:\DAW>ping -n 1 projecte1.daw.cat

Haciendo ping a projecte1.daw.cat [ipDelServidor] con 32 bytes de datos:
Respuesta desde ipDelServidor: bytes=32 tiempo<1m TTL=128

Estadísticas de ping para ipDelServidor:
    Paquetes: enviados = 1, recibidos = 1, perdidos = 0
    (0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
    Mínimo = 0ms, Máximo = 0ms, Media = 0ms

C:\DAW>ping -n 1 projecte2.daw.cat

Haciendo ping a projecte2.daw.cat [ipDelServidor] con 32 bytes de datos:
Respuesta desde ipDelServidor: bytes=32 tiempo<1m TTL=128

Estadísticas de ping para ipDelServidor:
    Paquetes: enviados = 1, recibidos = 1, perdidos = 0
    (0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
    Mínimo = 0ms, Máximo = 0ms, Media = 0ms

Accedint a http://ipDelServidor.cat, a http://projecte1.daw.cat, o a http://projecte2.daw.cat, el servidor web ens mostra sempre el mateix site, aquell que tenim configurat a /etc/apache2/sites-available/000-default.conf o a /etc/nginx/sites-available/default.

El servidor web, Apache o Nginx, ha de poder servir-nos diferents pàgines segons el nom amb el qual accedim al servidor web, això és el que s'anomena Virtual Hosting o allotjament virtual de llocs web.

Virtual Hosting

  • L'ús d'aquesta tècnica ens permet reduir el nombre de màquines físiques necessàries per allotjar els diferents llocs web.

  • Evidentment, això també permet aprofitar millor els recursos de la màquina física.

  • Per contra, ens podem trobar que el rendiment d'un site afecti la resta de forma negativa.

Tipus d'allotjament virtual al web

Podem diferenciar 3 tipus d'allotjament web virtual:

Allotjament virtual basat en IP

  • El servidor tindrà una adreça IP diferent per cada configuració d'allotjament web virtual.

  • Això implica que el servidor ha de tenir N IP diferents configurades (1 per cada allotjament web virtual).

  • Sota IPv4 i l'escassetat d'IP que hi ha actualment és un model molt poc freqüent.

  • Implica una configuració complexa en l'àmbit de paràmetres de xarxa o tenir una targeta de xarxa per cada IP.

Allotjament virtual basat en noms

  • El servidor allotja diferents noms de domini o subdomini a la mateixa adreça IP.

  • Apache a partir del nom de domini aplica un fitxer de configuració o un altre.

  • Aquest tipus d'allotjament funciona a partir de HTTP/1.1.

    Això és perquè s'envia la capçalera Host que indica el nom de domini.

  • Actualment és la forma de configuració més utilitzada.

  • Simplifica i facilita l'administració del servei.

Allotjament virtual basat en ports

  • Cada site funciona a una IP i/o domini:port diferent.

  • Consisteix a combinar els dos tipus anteriors amb l'ús de diferents ports.

Cal destacar que, tal com hem vist en aquest últim cas, tots els tipus poden funcionar en comú al mateix servidor web. Teniu més informació a:

Configurem el nostre http://projecte1.daw.cat

Aplicarem la configuració d'allotjament virtual per noms al nostre servidor web. D'entrada farem un Virtualhost pel projecte1. Podeu utilitzar el nom de domini que més us agradi, però aquí simularem els que hem anat proposant fins ara.

La configuració de cadascun dels diferents sites es guarda al directori /etc/apache2/sites-available/<nom_del_site.conf>. Per tant, el que farem és:

  1. anirem al directori corresponent en el nostre servidor web, /etc/apache2/sites-available, i duplicarem el fitxer 000-default.conf, anomenant a la còpia projecte1.daw.cat.conf.

    cd /etc/apache2/sites-available
    cp 000-default.conf projecte1.daw.cat.conf
    
  2. editarem el fitxer i

    • entre les etiquetes <VirtualHost *:80> i </VirtualHost> afegirem la següent directiva (en una línia)

    ServerName projecte1.daw.cat

    • ens assegurarem que la directiva DocumentRoot apunti al directori on tenim els fitxers del nostre site.

    En aquest exemple hem posat el projecte1 dins el directori /var/www/projecte1

  3. habilitem el nou site que acabem de configurar, des de l'Apache, amb la comanda ae2nsite projecte1.daw.cat

    sudo a2ensite projecte1.daw.cat
    
    Enabling site projecte1.daw.cat.
    To activate the new configuration, you need to run:
    systemctl reload apache2
    
  4. reiniciem (o recarreguem) el servidor Apache per tal que agafi la nova configuració

    systemctl reload apache2
    
    ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
    Authentication is required to reload 'apache2.service'.
    Authenticating as: Isard (isard)
    Password:
    ==== AUTHENTICATION COMPLETE ===
    
  5. Podem comprovar que ara ja tenim el nou site (projecte1) habilitat amb la comanda apache2ctl -S

    apache2ctl -S
    
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
    VirtualHost configuration:
    *:80                   is a NameVirtualHost
            default server 127.0.1.1 (/etc/apache2/sites-enabled/000-default.conf:1)
            port 80 namevhost 127.0.1.1 (/etc/apache2/sites-enabled/000-default.conf:1)
            port 80 namevhost daw1.cat (/etc/apache2/sites-enabled/daw1.conf:1)
            port 80 namevhost 127.0.1.1 (/etc/apache2/sites-enabled/projecte1.daw.cat.conf:1)
    ServerRoot: "/etc/apache2"
    Main DocumentRoot: "/var/www/html"
    Main ErrorLog: "/var/log/apache2/error.log"
    Mutex watchdog-callback: using_defaults
    Mutex default: dir="/var/run/apache2/" mechanism=default
    Mutex mpm-accept: using_defaults
    PidFile: "/var/run/apache2/apache2.pid"
    Define: DUMP_VHOSTS
    Define: DUMP_RUN_CFG
    User: name="www-data" id=33 not_used
    Group: name="www-data" id=33 not_used
    

La configuració de cadascun dels diferents sites es guarda al directori /etc/nginx/sites-available/<nom_del_site.conf>. Per tant, el que farem és:

  1. anirem al directori corresponent en el nostre servidor web, /etc/nginx/sites-available, i duplicarem el fitxer default, anomenant a la copia projecte1.daw.cat.

    cd /etc/nginx/sites-available
    cp default projecte1.daw.cat
    
  2. editarem el fitxer i

    • eliminarem totes les línies del servidor per defecte i anirem a configurar les darreres línies que estan comentades i comencen amb el text

      # Virtual Host configuration for example.com
      
    • descomentem les línies comentades amb directives i anirem omplint-les amb el necessari

      server {
              listen 80;
      #       listen [::]:80;
      #
              server_name projecte1.daw.cat;
      #
              root /var/www/projecte1.daw.cat;
              index index.html;
      #
      #       location / {
      #               try_files $uri $uri/ =404;
      #       }
      }
      
    • ens assegurarem que la directiva server_name tingui el nom del domini que volem servir.

    • ens assegurarem que la directiva root apunti al directori on tenim els fitxers del nostre site.

    En aquest exemple hem posat el projecte1 dins el directori /var/www/projecte1

  3. habilitem el nou site que acabem de configurar, creant el link corresponent, amb la comanda ln -s

    sudo ln -s /etc/nginx/sites-available/projecte1.daw.cat /etc/nginx/sites-enabled/projecte1.daw.cat
    
  4. reiniciem (o recarreguem) el servidor nginx per tal que agafi la nova configuració

    systemctl reload nginx
    
    ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
    Authentication is required to reload 'nginx.service'.
    Authenticating as: isard
    Password:
    ==== AUTHENTICATION COMPLETE ===
    
  5. Podem comprovar que ara ja tenim el nou site (projecte1) habilitat amb la comanda apache2ctl -S

    sudo nginx -T | grep server_name | grep -v "#"
    
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
            server_name daw1.cat;
            server_name projecte1.daw.cat;
    

Ja podem accedir a http://projecte1.daw.cat.

A partir d'aquí podem anar jugant amb les configuracions, afegint logs, canviant ports, noves directives, etc.

Ara ja és cosa vostra configurar també un site pel projecte2.

Un paràmetre interessant en Apache

ServerAlias en Apache

ServerAlias és una directiva que ens permet establir noms alternatius per a un site i utilitzar-los amb sites virtuals basats en noms. La directiva ServerAlias pot incloure comodins.

Exemple:

    ServerName projecte2.daw.cat
    ServerAlias *.projecte2.cat p2.daw.cat prj2.daw.cat

Podeu provar-ho modificant el vostre fitxer de hosts

I en nginx?

En Nginx, el mateix àlies, el podem posar a la directiva server_name

server_name projecte1.daw.cat ~projecte[23].daw.cat$ projecte.daw.*;

Ara respondrà el servidor per noms com ara: projecte1.daw.cat, projecte2.daw.cat, projecte3.daw.cat, projecte.daw.com, usuari.projecte2.daw.cat

però no per noms com ara projecte4.daw.cat

Segurament, voldrem posar un inici i un fi l'àlies del server_name:

`#!nginx server_name projecte1.daw.cat ~^projecte[23].daw.cat$ projecte.daw.*;`