Product SiteDocumentation Site

11.2. Servidor web (HTTP)

The Falcot Corp administrators decided to use the Apache HTTP server, included in Debian Bullseye at version 2.4.52.

11.2.1. Instal·lació d'Apache

Instal·lar el paquet apache2 és tot el que es necessita. Conté tots els mòduls, incloent-hi els Multi-Processing Modules o “mòduls multiprocés” (MPMs) que determinen com Apache maneja el processament paral·lel de moltes sol·licituds, que solien proporcionar-se en paquets separats apache2-mpm-*. També estirarà apache2-utils que conté les utilitats de la línia d'ordres que descobrirem més endavant.
L'MPM que s'usi afectarà significativament la forma en què Apache manegarà les peticions concurrents. Amb el «worker» MPM, utilitza fils (processos lleugers o «threads»), mentre que amb la «prefork» MPM utilitza un conjunt de processos creats prèviament. Amb «event» MPM també utilitza fils, però les connexions inactives (en particular les que es mantenen obertes per la característica HTTP «keep-alive») es retornen a un fil dedicat a gestió.
The Falcot administrators also install libapache2-mod-php so as to include the PHP 7.4 support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead. To use the event MPM one can use php-fpm.
Apache és un servidor modular, i moltes característiques són implementades per mòduls externs que el programa principal carrega durant la inicialització. La configuració per defecte només activa els mòduls més comuns, però activar altres mòduls és qüestió simplement d'executar a2enmod mòdul; per inhabilitar un mòdul, la comanda és a2dismod mòdul. Aquests programes en realitat només creen (o eliminen) enllaços simbòlics a /etc/apache2/mods-enabled/, apuntant als fitxers reals (desats a /etc/apache2/mods-available/).
Amb la configuració per defecte, el servidor web escolta al port 80 (com es configura a /etc/apache2/ports.conf), i serveix pàgines del directori /var/www/html/(com es configura a /etc/apache2/sites-enabled/000-default.conf).

11.2.2. Afegir suport per a SSL

Apache 2.4 ja duu inclòs el mòdul SSL (mod.ssl) necessari per a HTTP segur (HTTPS). Només cal habilitar-ho amb a2enmod ssl, i després cal afegir les directives necessàries als arxius de configuració. Es proporciona un exemple de configuració a /etc/apache2/sites-available/default-ssl.conf.
Si voleu generar certificats de confiança, podeu seguir la secció Secció 10.2.1, «Creació de certificats de confiança de franc» i després ajustar les següents variables:
SSLCertificateFile      /etc/letsencrypt/live/DOMINI/fullchain.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/DOMINI/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/DOMINI/chain.pem
SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
Some extra care must be taken if you want to favor SSL connections with Perfect Forward Secrecy (those connections use ephemeral session keys ensuring that a compromise of the server's secret key does not result in the compromise of old encrypted traffic that could have been stored while sniffing on the network). Have a look at Mozilla's recommendations in particular:
As an alternative to the standard SSL module, there is an extension module called mod_gnutls, which is shipped with the libapache2-mod-gnutls package and enabled with the a2enmod gnutls command. Unfortunately the version packaged for Debian had serious issues and even security implications and is therefor not part of the Debian Bullseye release.

11.2.3. Configuració de servidors virtuals («virtual hosts»)

Un servidor virtual és una identitat addicional per al servidor web.
Apache considera dos tipus diferents de servidors virtuals: aquells que es basen en l'adreça IP (o el port), i aquells que es basen en el nom de domini del servidor web. El primer mètode requereix l'assignació d'una adreça IP diferent (o port) per a cada lloc, mentre que el segon pot treballar en una adreça IP única (i port), i els llocs estan diferenciats pel nom d'amfitrió enviat pel client HTTP (que només funciona en la versió 1.1 del protocol HTTP - afortunadament aquesta versió és prou antiga i tots els clients ja l'utilitzen).
L'escassetat (creixent) d'adreces IPv4 normalment afavoreix el segon mètode; no obstant això, es fa més complex si els servidors virtuals també necessiten proporcionar HTTPS, ja que el protocol SSL no sempre ha proporcionat l'allotjament virtual basat en noms; l'extensió SNI («Server Name Indication») que permet aquesta combinació no és acceptada per tots els navegadors. Quan diversos llocs HTTPS han d'executar-se en el mateix servidor, normalment es diferenciaran executant-se en un port diferent o en una adreça IP diferent (IPv6 pot facilitar les coses aquí).
La configuració predeterminada per a Apache 2 permet servidors virtuals basats en noms. A més, es defineix un amfitrió virtual per defecte al fitxer /etc/apache2/sites-enabled/000-default.conf; aquest servidor virtual s'utilitzarà si no es troba cap servidor que coincideixi amb la sol·licitud enviada pel client.
Cada servidor virtual extra és descrit per un fitxer emmagatzemat a /etc/apache2/sites-available// La creació d'un lloc web per al domini de falcot.org és, per tant, una qüestió tan senzilla com crear el següent fitxer, i després habilitar el servidor virtual amb a2ensite www.falcot.org.

Exemple 11.13. El fitxer /etc/apache2/sites-available/www.falcot.org.conf

<VirtualHost *:80>
ServerName   www.falcot.org
ServerAlias  falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
El servidor Apache, tal com està configurat fins ara, utilitza els mateixos fitxers de registre per a tots els servidors virtuals (encara que això es podria canviar afegint directives CustomLog a les definicions dels servidors virtuals). Per tant, té sentit personalitzar el format d'aquest fitxer de registre perquè inclogui el nom del servidor virtual. Això es pot fer creant un fitxer /etc/apache2/conf-available/customlog.conf que defineix un nou format per a tots els fitxers de registre (amb la directiva LogFormat) i habilitant-lo amb a2enconf customlog) La línia CustomLog també s'ha d'eliminar (o comentar) del fitxer /etc/apache2/sites-available/000-default.conf.

Exemple 11.14. El fitxer /etc/apache2/conf-available/customlog.conf

# Nou format de registre incloent el nom del servidor (virtual)
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# Ara usem aquest format "vhost" per defecte
CustomLog /var/log/apache2/access.log vhost

11.2.4. Directives comunes

Aquesta secció revisa breument algunes de les directives de configuració Apache més usades.
El fitxer de configuració principal normalment inclou diversos blocs Directory; permeten especificar diferents comportaments per al servidor depenent de la ubicació del fitxer que s'estigui servint. Aquest bloc inclou normalment directives Opcions i allowOverride.

Exemple 11.15. Bloc «Directory»

<Directory /srv/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
La directiva DirectoryIndex conté una llista de fitxers per cercar quan la sol·licitud del client coincideix amb un directori. El primer fitxer existent de la llista s'utilitza i s'envia com a resposta.
La directiva Options és seguida per una llista d'opcions per habilitar. El valor None inhabilita totes les opcions; en conseqüència, All els activa tots excepte MultiViews. Les opcions disponibles inclouen:
  • ExecCGI indica que els «scripts» CGI poden ser executats.
  • FollowSymlinks indica al servidor que es poden seguir els enllaços simbòlics, i que la resposta hauria de contenir el contingut de l'objectiu d'aquests enllaços.
  • SymlinksIfOwnerMatch also tells the server to follow symbolic links, but only when the link and its target have the same owner.
  • Includes habilita «Server Side Includes» (o “Inclusions a la banda de servidor”, SSI per abreujar). Es tracta de directives inserides en pàgines HTML i executades sobre la marxa per a cada sol·licitud.
  • IncludesNOEXEC permet Server Side Includes (SSI) però inhabilita l'ordre exec i limita la directiva include a fitxers de text o de marques.
  • Indexes indica al servidor que llisti els continguts d'un directori si la sol·licitud HTTP enviada pel client apunta a un directori sense fitxer d'índex (és a dir, quan no hi ha cap dels fitxers esmentats per la directiva DirectoryIndex).
  • MultiViews permet la negociació de contingut; això pot ser utilitzat pel servidor per retornar una pàgina web que coincideixi amb l'idioma preferit que tingui configurat el navegador.
La directiva allowOverride llista totes les opcions que es poden activar o desactivar mitjançant un fitxer .htaccess. Un ús comú d'aquesta opció és restringir ExecCGI, de manera que l'administrador tria quins usuaris poden executar programes sota la identitat del servidor web (l'usuari www-data).

11.2.4.1. Requerir autenticació

In some circumstances, access to part of a website needs to be restricted, so only legitimate users who provide a username and a password are granted access to the contents. These feature are provided by the mod_auth* modules.

Exemple 11.16. Fitxer .htaccess que requereix autenticació

Require valid-user
AuthName "Directori privat"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
El fitxer /etc/apache2/authfiles/htpasswd-private conté una llista d'usuaris i contrasenyes; es manipula habitualment amb l'ordre htpasswd. Per exemple, la següent ordre s'utilitza per afegir un usuari o canviar la seva contrasenya:
# htpasswd /etc/apache2/authfiles/htpasswd-private user
New password:
Re-type new password:
Adding password for user user

11.2.4.2. Restringint l'accés

La directiva Require controla les restriccions d'accés per a un directori (i també els seus subdirectoris, recursivament).
Es pot utilitzar per restringir l'accés basant-se en molts criteris; ens aturarem a descriure la restricció d'accés basada en l'adreça IP del client, però pot ser molt més potent que això, especialment quan diverses directives Require es combinen dins d'un bloc RequireAll.

Exemple 11.17. Permetre només des de la xarxa local

Requerir la ip 192.168.0.0/16

11.2.5. Analitzadors de registres

Un analitzador de registres és instal·lat sovint en un servidor web, ja que el primer proporciona als administradors una idea precisa dels patrons d'ús del servidor.
Els administradors de Falcot Corp han seleccionat AWStats (Advanced Web Statistics) per analitzar els fitxers de registre d'Apache.
El primer pas de configuració és la personalització del fitxer /etc/awstats/awstats.conf. Els administradors de Falcot el deixen tal com està excepte els següents paràmetres:
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
Tots aquests paràmetres estan documentats amb comentaris al fitxer de plantilla. En particular, els paràmetres LogFile i LogFormat descriuen la ubicació i el format del fitxer de registre i la informació que conté; SiteDomain i HostAliases llisten els diversos noms sota els quals es coneix el lloc web principal.
Per a llocs amb trànsit alt, DNSLookup normalment no s'hauria d'establir a 1; per a llocs més petits, com el de Falcot descrit anteriorment, aquest ajustament permet obtenir informes més llegibles que inclouen noms de màquina complets en lloc de simples adreces IP.
AWStats també s'habilitarà per a altres servidors virtuals; cada servidor virtual necessita el seu propi fitxer de configuració, com ara /etc/awstats/awstats.www.falcot.org.conf.

Exemple 11.18. Fitxer de configuració de l'AWStats per a un servidor virtual

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats uses many icons stored in the /usr/share/awstats/icon/ directory. In order for these icons to be available on the web site, the Apache configuration needs to be adapted to include the following directive (check out /usr/share/doc/awstats/examples/apache.conf for a more detailed example):
Alias /awstats-icon/ /usr/share/awstats/icon/
Després d'uns minuts (i una vegada que l'script s'hagi executat unes quantes vegades), els resultats estaran disponibles en línia: