Salta el contingut

0614 - Bloc1: Servidors web i de transferència de fitxers

Paràmetres de configuració - Apache i Nginx (v)

Anem a veure altres paràmetres que podem configurar en els servidors web amb Apache i Nginx. Cal saber però:

Directives

Què són les directives en Apache i Nginx?

En el context de servidors web com Apache i Nginx, una directiva és una instrucció de configuració que indica al servidor com ha de comportar-se davant de diferents situacions.

Es poden entendre com ordres o paràmetres que modifiquen el funcionament del servidor, definint aspectes com:

  • Quins dominis atendre.
  • On es troben els fitxers web.
  • Com gestionar la seguretat i permisos.
  • Quins mòduls o característiques activar.
  • Com manejar protocols (HTTP/HTTPS).

Exemple en Apache

Un bloc de configuració amb directives dins d’un VirtualHost:

<VirtualHost *:80>
    ServerName www.exemple.com
    DocumentRoot /var/www/exemple

    <Directory /var/www/exemple>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

En aquest exemple:

  • ServerName → defineix el domini que servirà aquest VirtualHost.
  • DocumentRoot → estableix la carpeta on hi ha els fitxers del lloc web.
  • <Directory> → permet afegir directives aplicades a un directori concret (Options, AllowOverride, Require).

Contextos de configuració a Apache

La configuració d’Apache no és plana, sinó que es pot aplicar en diferents contextos segons el nivell de detall o l'abast que vulguem donar-li.

Aquests contextos permeten controlar el servidor globalment, per dominis (VirtualHost), per directoris o fins i tot per fitxers concrets.

  1. server config:

    • Configuració general per a tot el servidor Apache
    • S’especifica normalment a apache2.conf (o httpd.conf en altres distribucions).
    • Afecta a tots els VirtualHost i a qualsevol lloc web si no s’indica una configuració més específica.
    # Exemple d'una directiva en el context de server config
    timeout 300
    keepalive on
    
  2. Virtualhost:

    • Permet definir la configuració d’un lloc web concret (site o domini).
    • Cada VirtualHost pot tenir directives pròpies com el domini (ServerName), la carpeta arrel (DocumentRoot) o els logs.
    • S’utilitza a fitxers dins sites-available/ i sites-enabled/.
    <VirtualHost *:80>
      ServerName www.exemple.com
      DocumentRoot /var/www/exemple
        ...
    </VirtualHost>
    
  3. Directory:

    • Permet aplicar configuracions específiques a un directori concret del sistema de fitxers.
    • Es defineix amb la directiva ... .
    • Especifica permisos, opcions, restriccions d'accés i comportaments per a fitxers dins d'aquest directori.
    <Directory /var/www/exemple>
      Options Indexes FollowSymLinks
      AllowOverride All
      Require all granted
    </Directory>
    

    o bé <Location>, <Files>, <If>, <Proxy>, etc.

    • <Location> → afecta a una URL concreta en lloc d’un directori físic.

    • <Files> → aplica a fitxers específics (per nom o extensió).

    • <Proxy> → configuracions específiques per a servidors proxy.

    • <If> → permet aplicar configuracions condicionals.

  4. .htaccess:

    • És un fitxer de configuració que es col·loca dins un directori concret i afecta tant aquest com els seus subdirectoris.
    • Permet fer configuracions sense tocar els fitxers principals d’Apache.
    • Molt utilitzat en hosting compartit o aplicacions web (WordPress, Laravel, etc.).
    • Configuració que afecta el directori i subdirectoris on es troba el fitxer .htaccess. Podria no afectar, tot dependrà de la directiva Overrides

      Exemple (.htaccess dins /var/www/exemple):

      RewriteEngine On
      RewriteRule ^about$ about.php
      
      • El seu ús depèn de la directiva AllowOverride dins del bloc .
      • Si AllowOverride None, .htaccess no té efecte.
      • Si AllowOverride All, .htaccess pot sobreescriure la configuració del directori.
    • Podem trobar més informació a la pàgina web de la documentació de Apache

    RECORDEM. Estructura de fitxers i directori de configuració d'Apache

    • El directori base on tenim els fitxers de configuració de l'Apache és /etc/apache2. Dins d'aquest directori trobarem el fitxer principal apache2.conf on ja se'ns informa de l'estructura de directoris
    • El fitxer apache2.conf és el fitxer principal de configuració d'Apache. Aquest fitxer pot incloure altres fitxers de configuració mitjançant la directiva Include o IncludeOptional.

          /etc/apache2/
          |-- apache2.conf
          |   `--  ports.conf
          |-- mods-enabled
          |   |-- *.load
          |   `-- *.conf
          |-- conf-enabled
          |   `-- *.conf
          `-- sites-enabled
              `-- *.conf
      
    • El directori on s'emmagatzemen els fitxers de log per defecte és /var/log/apache2. Dins d'aquest directori trobarem:

      isard@ubuntu:/~$ ls -l /var/log/apache2/
      total 2890172
      -rw-r----- 1 root adm     292571 Mmm DD HH:MI access.log
      -rw-r----- 1 root adm 2959229371 Mmm DD HH:MI error.log
      -rw-r----- 1 root adm          0 Mmm DD HH:MI other_vhosts_access.log
      
    • En els fitxers de configuració, les línies que comencen per # són comentaris i el servidor les ignora.

    • Podem incloure altres fitxers amb la directiva Include.

    • Dins el fitxer ports.conf s'especifica la configuració de xarxa pel procés (ports i IPs/interfícies on atendre peticions)

      Possible contingut del fitxer
      # If you just change the port or add more ports here, you will likely also
      # have to change the VirtualHost statement in
      # /etc/apache2/sites-enabled/000-default.conf
      
      Listen 80
      
      <IfModule ssl_module>
              Listen 443
      </IfModule>
      
      <IfModule mod_gnutls.c>
              Listen 443
      </IfModule>
      
    • Després tenim 3 parelles de carpetes amb el mateix nom però acabades amb enabled o available.

      Apache funciona de forma que podem 'preparar' coses (mòduls, configuracions, espais, etc.) però activar-les només si ens interessa (a partir de symlinks, amb a2ensite, a2dissite, a2enmod, a2dismod, etc.)

      • conf-*: hi tenim configuracions

      • sites-*: les diferents configuracions pels llocs web - Hosting Virtual o https

      • mods-*: els mòduls disponibles

    Directives més utilitzades. Per què serveixen i on s'han de posar

  • Les dues primeres directives que ens han de servir són:

    • DocumentRoot
      La directiva DocumentRoot indica quin és el directori arrel del lloc web, és a dir, la carpeta on Apache buscarà els fitxers que ha de servir als clients quan aquests fan una petició. (index.html, img/, scripts/, etc.).

      • Normalment s’especifica dins del bloc .
      • Cada lloc web (site) pot tenir el seu propi DocumentRoot.
      • Ha d’indicar una ruta absoluta del sistema de fitxers. No ha d’acabar amb una barra inclinada (/).

        Exemple:

        <VirtualHost *:80>
            ServerName www.exemple.com
            DocumentRoot /var/www/exemple
        </VirtualHost>
        

        En aquest cas:

        • Quan el client demani http://www.exemple.com/, Apache anirà a buscar fitxers dins /var/www/exemple/.
        • Si hi ha un index.html, serà el que es mostri per defecte (això ho controla DirectoryIndex).

        Contextos on es pot utilitzar:

        • server config
        • virtual host
    • DirectoryIndex
      La directiva DirectoryIndex defineix quins fitxers s’han de buscar i servir quan un client accedeix a una URL sense especificar un fitxer concret.

      Per exemple:

      • Si un usuari demana http://www.exemple.com/, Apache buscarà, en ordre, els fitxers definits a DirectoryIndex.

        Exemple de configuració:

        <IfModule dir_module>
            DirectoryIndex index.php index.html index.htm
        </IfModule>
        

        En aquest cas:

        1. Apache intentarà servir index.php.
        2. Si no existeix, buscarà index.html.
        3. Si tampoc hi és, provarà amb index.htm.
        4. Si no hi ha cap d’aquests fitxers, per defecte l’usuari rebrà un error 403 (Forbidden), tret que estigui activada l’opció d’indexació (Options Indexes), en aquest cas es mostrarà un llistat de fitxers.

        Contextos on es pot utilitzar:

        • server config
        • virtual host
        • directory
        • .htaccess
  • Altres directives:

    • Redirect: Envia una redirecció externa demanant al client que obtingui un URL diferent. Contextos: server config, virtual host, directory, .htaccess. Com a exemple:

      Redirect "/cerca" "http://www.google.es/"

      en aquest cas hem redirigit a un URL extern. Per a redirigir a un URL intern només cal posar com a segon paràmetre un path relatiu.

      Exemple:

      <VirtualHost *:80>
          ServerName www.exemple.com
          DocumentRoot /var/www/exemple
      
          # Redirigeix totes les peticions a /antic/ cap a /nou/
          Redirect /antic/ /nou/
      
          # Redirigeix una URL concreta
          Redirect /productes.html https://www.exemple.com/shop.html
      </VirtualHost>
      

      El protocol HTTP ho indica a partir dels codis 3xx on indica al client que ha de realitzar una acció addicional per a completar la petició. Aquesta acció normalment va sense interacció de l'usuari i ho fa el navegador del client.

      Tenim dos tipus principals de redireccions:

      • Permanents: el recurs s'ha mogut a un altre URL per sempre. El codi és el 301. És el que cal que fem quan ho volem notificar als buscadors (per temes de page ranking principalment)

        Redirect permanent /antic/ /nou/
        
        permanent → fa un 301 Moved Permanently

      • Temporals: el recurs existeix però es troba a un altre URL de forma temporal. El codi és el 302 i és el comportament per defecte.

        Redirect temp /oferta/ /promo/
        
        temp → fa un 302 Found (redirecció temporal)

      La directiva Redirect es pot utilitzar en diferents contextos:

      • server config (fitxer global de configuració /etc/apache2/apache2.conf)
      • virtual host (fitxers a /etc/apache2/sites-available/*.conf)
      • directory
      • .htaccess (si està permès mitjançant AllowOverride All o AllowOverride Redirect)

      Podem complementar-la amb RedirectMatch per tal de controlar expressions regulars, però avui en dia no és suficient.

      Alternatives més avançades

      • Amb mod_rewrite (molt més potent i flexible), podem fer redireccions amb expressions regulars:

        RewriteEngine On
        RewriteRule ^antic/(.*)$ /nou/$1 [R=301,L]
        
    • <Directory path> * * * </Directory>: Inclou un grup de directives que només s'apliquen al directori del sistema de fitxers especificat, als subdirectoris i al seu contingut. Per exemple:

      <Directory /var/www/html/projecte1>
          Options Indexes FollowSymLinks
          Allowoverride None
          Require all granted
      </Directory>
      

      /var/www/html/projecte1 és la ruta al sistema de fitxers, format de ruta absoluta. Les directives dins del bloc només afecten aquest directori i el que conté.
      El path pot incloure comodins (*, ?) si volem aplicar la mateixa configuració a diversos directoris

      Mireu també DirectoryMatch, Files, FilesMatch, Location, LocationMatch

    • Options: Aquesta directiva controla quines funcions del servidor estan disponibles en un directori concret. Contextos: server config, virtual host, directory, .htaccess. Les diferents opcions possibles són:

      • All: Totes les opcions excepte MultiViews.

      • None: Desactiva totes les opcions (configuració més restrictiva).

      • ExecCGI: Es permet l'execució d'scripts CGI utilitzant mod_cgi.

      • FollowSymLinks: El servidor seguirà enllaços simbòlics en aquest directori. Aquesta és la configuració predeterminada.

      • SymLinksIfOwnerMatch: només seguirà symlinks si el propietari coincideix amb el fitxer original (més segur).

      • Includes: S'admeten les inclusions del costat del servidor proporcionades per mod_include.

      • IncludesNOEXEC: Les inclusions del costat del servidor estan permeses, però les #exec cmd i #exec cgi estan desactivades.

      • Indexes: si no hi ha un DirectoryIndex (ex. index.html), Apache mostrarà un llistat del directori (via mod_autoindex).

      • MultiViews: activa la negociació de continguts (per exemple, si un client demana /fitxer, es poden servir /fitxer.html, /fitxer.fr.html, etc. segons idioma o format). https://httpd.apache.org/docs/2.4/content-negotiation.html#multiviews

    • Alias: Mapeja un URL dins el nostre site a un directori determinat dins el sistema de fitxers del servidor. Cal que tinguem accés a aquest directori.
      Un exemple seria:

      Alias "/imatges" "/ftp/pub/image"
      <Directory "/ftp/pub/image">
          Require all granted
      </Directory>
      
      • En aquest cas quan un usuari accedeix a http://servidor/imatges/, en realitat veurà els fitxers de /ftp/pub/image/.
      • És molt útil per separar els fitxers públics de la resta de l’arbre del servidor
    • Require: Serveix per a definir el control d'accés a diferents llocs del servidor. Per a permetre accés a tothom especificarem Require all granted, però sempre podem posar seguretat a nivell de IP, d'usuari, etc. Recomano accedir a la documentació d'Apache on parla de control d'accés.

      # Permet accés a tothom
      Require all granted
      
      # Denega accés a tothom
      Require all denied
      
      # Només permet a una IP concreta
      Require ip 192.168.1.50
      
      # Només permet a una subxarxa
      Require ip 192.168.1.0/24
      
      # Control d’accés per usuari (amb autenticació prèvia)
      Require user admin
      
      Podem combinar diferents condicions amb RequireAny, RequireAll i RequireNone.

    exemple:

    <Directory /var/www/html/projecte1>
        Options Indexes FollowSymLinks
        Allowoverride None
        Require all granted
    </Directory>
    
    o bé
    <Directory /var/www/html/projecte2>
        Options Indexes FollowSymLinks
        Allowoverride None
        Require ip 192.168.1.50
        Require host exemple.com
    </Directory>
    

  • En Nginx la configuració la podem especificar en els següents contextos: NginxContextes

    • http: Configuració general per a tot el servidor web

    • server: Configuració general per a tot un site

    • location: Configuració general per a directoris virtuals

    • events: Configuració general per a tot el servidor

  • Podem trobar més informació a la pàgina web de la documentació de Nginx

  • El directori base on tenim els fitxers de configuració del Nginx és /etc/nginx. Dins d'aquest directori trobarem el fitxer prinipal nginx.conf on ja se'ns informa de l'estrutura de directoris

        /etc/nginx/
        |-- nginx.conf
        |-- mime.types
        |   
        |-- conf.d
        |   `-- *.conf
        |   
        |-- modules-available
        |
        |-- modules-enabled
        |   `-- *.conf
        |   
        |-- sites-available
        |   `-- default
        |   
        `-- sites-enabled
            `-- default
    
  • El directori on s'emmagatzemen els fitxers de log per defecte és /var/log/nginx. Dins d'aquest directori trobarem:

    isard@ubuntu:/~$ ls -l /var/log/nginx/
    total 2890172
    -rw-r----- 1 root adm 9915 Nov  4 18:22 access.log
    -rw-r----- 1 root adm 2220 Nov 10 16:30 error.log
    
  • En els fitxers de configuració, les línies que comencen per # són comentaris i el servidor les ignora.

  • Les directives que entrem en els fitxers de configuració acaben en punt i coma ;.

  • Podem incloure altres fitxers amb la directiva include.

  • Després tenim 2 parelles de carpetes amb el mateix nom però acabades amb enabled o available.

    Apache funciona de forma que podem 'preparar' coses (mòduls, configuracions, etc) però activar-les només si ens interessa (a partir de symlinks, ho veurem més endavant)

    • sites-*: les diferentes configuracions pels llocs web - Hosting Virtual o hppts

    • mods-*: els mòduls disponibles

  • Al directori conf.d hi tenim diferents configuracions, en fitxers acabats en .conf

  • Les dues primeres directives que ens han de servir són:

    • root /var/www/html: especifica el directori on ha d'anar a buscar els fitxers de la web o del directori virtual. En l'exemple /var/www/html.

    • index index.html index.htm index.nginx-debian.html;: indica una llista de recursos, fitxers, a buscar, quan una petició de client sol·licita un URL sense especificar el recurs. Pot ser general o particular per a qualsevol context següent: http, server, location.

  • Altres directives:

    • location [ = | ~ | ~* | ^~ ] uri { ... }: Inclou un grup de directives que només s'apliquen a la uri especificada Per exemple:

      location  /despres {
          # Ruta absoluta del directori al sistema de fitxers
          alias /var/www/despres;
          index despres.html;
          autoindex on;
      }
      
      La uri es pot definir mitjançant una cadena de prefix o una expressió regular.

      Utilitzant el modificador =, definim una coincidència exacta d'URI i ubicació.

      Les expressions regulars poden portar el prefix ~* per tal de no distingir entre majúscules i minúscules o el prefix ~ per tal que distingeixi entre majúscules i minúscules.

    • return: Envia una redirecció externa demanant al client que obtingui un URL diferent. Contextos: server, location, if. Com a exemple:

       location  ~* ^/cerca {
          return 307  http://www.google.es;
      }
      

      en aquest cas hem redirigit a un URL extern. Per a redirigir a un URL intern només cal posar com a segon paràmetre un path relatiu.

      El protocol HTTP ho indica a partir dels codis 3xx on indica al client que ha de realitzar una acció addicional per a completar la petició. Aquesta acció normalment va sense interacció de l'usuari i ho fa el navegador del client.

      Tenim dos tipus principals de redireccions:

      • Permanents: el recurs s'ha mogut a un altre URL per sempre. El codi és el 301. És el que cal que fem quan ho volem notificar als buscadors (per temes de page ranking principalment)

      • Temporals: el recurs existeix però es troba a un altre URL de forma temporal. El codi és el 302 i és el comportament per defecte.

    • algunes de les opcions que podem habilitar i deshabilitar en Apche, en la directiva Options, en nginx cal configurar-ho amb diferents directives:

      • disable_symlinks off: El servidor seguirà enllaços simbòlics en aquest context. Aquesta és la configuració predeterminada.

      • autoindex off: Si es demana un URL que s'assigna a un directori i no hi ha cap fitxer de index (per exemple, index.html) en aquest directori, es retornarà, o no una llista amb format del directori. Per defecte està configurat amb la opció off. Per habilitar-ho cal especificar el valor a ´on´.

    • allow / deny: S'utilitza per definir el control d'accés a diferents llocs del servidor. Per a permetre accés a tothom especificarem allow all però sempre podem posar seguretat a nivell de IP. Recomano accedir a la documentació de nginx on parla de [control d'accés]control_acces_nginx]{target="_blank"} a tots nivells.

      location / {
          deny  192.168.1.1;
          allow 192.168.1.0/24;
          allow 10.1.1.0/16;
          allow 2001:0db8::/32;
          deny  all;
      }
      

Fitxers de log

Documentació de logs en Apache

  • ErrorLog: Especifica el nom i ubicació del fitxer on es guardarà el registre dels errors que succeeixin al servidor. Contextos: server config, virtual host.

  • CustomLog: Especifica el nom, la ubicació i el format del fitxer de log de les peticions al servidor. Contextos: server config, virtual host.

Documentació de logs en Nginx

  • error_log: Especifica el nom i ubicació del fitxer on es guardarà el registre dels errors que succeeixin al servidor. Contextos: http, server, location, if in location, limit_except. També podem especificar el nivell de log: debug, info, notice, warn, error, crit, alert, o emerg.

  • access_log: Especifica el nom, la ubicació i el format del fitxer de log de les peticions al servidor. Contextos: http, server, location, if in location, limit_except.

Opcions a tenir en compte en Producció

  • Servertokens: Controla les capçaleres de resposta del nostre servidor permetent mostrar o ocultar certa informació. Contextos: server config.

  • MaxKeepAliveRequests: especifica el nombre de connexions obertes que pot gestionar alhora.

  • TimeOut: Permet establer el temps màxim, en segons, que esperarà per a les connexions amb els clients.

  • LogLevel: Controla el tipus de missatges que apareixeran al fitxer d'errors.

  • server_tokens off: Amaga la versió del sistema. Contextos: http, server, location.

  • desactivem els mètodes que no s'utilitzin al nostre servidor web. Per això, cal afegir al fitxer de configuració, al context que creiem oportú, les següents línies:

    ## Mètodes que acceptem: GET HEAD POST
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
    ## Bloqueja DELETE, SEARCH i altres mètodes
    
  • en linux, posem els fitxers del servidor web en una partició a part i muntem la partició amb els permisos necessaris. Per exemple, muntem la partició /dev/sda3 al directori /var/www/nginx amb permisos noexec, nodev i nosetuid

    /dev/sda3   /var/www/nginx    ext4     defaults,nosuid,noexec,nodev   1   2
    
  • en linux, podem afegir el paquet nginx-extras i ens permetrà configurar nous paràmetres, com ara

    more_set_headers 'Server: Algun nom pel servidor';
    

    havent instal·lat el paquet de la forma habitual

    apt install nginx-extras
    

    La documentació del mòdul headers-more la podem trobar aquí

Mòduls per habilitar o almenys tenir en compte en Apache

  • userdir: Permet configurar un espai web per a cadascun dels usuaris del sistema que tinguem creats. Podem escollir la ubicació i nom de la carpeta a crear. Per defecte serà el directori $HOME/public_html. Aquest pot canviar-se de nom i fins i tot de lloc.

  • alias: defineix els alias tot i que seran per a tots els sites, ja que, en carregar el mòdul es defineix en el context de server.

    Sovint definirem els alias dins de cadascun dels Hosts Virtuals.

  • autoindex: el tenim normalment ja habilitat, però és interessant veure el contingut de autoindex.confper si volem canviar les icones per defecte de cada extensió de fitxer.

  • dir: defineix la directiva DirectoryIndex pel context de servidor. Tot i això, podem redefinir-lo en cas necessari a altres contextos com server config, virtual host, directory i .htaccess.

  • info: permet accedir a http://ipDelServidor.cat/server-info i veure'n informació del servidor. Per a provar-ho possiblement cal modificar la línia Require local pel que creiem oportú.

  • status: permet accedir a http://ipDelServidor.cat/server-status i veure'n informació de l'estat. Per a provar-ho possiblement cal modificar la línia Require local pel que creiem oportú.