L'architecture client-serveur\footnote{http://www.faqs.org/faqs/client-server-faq/} se r<>sume <20> la demande de services d'un programme client <20> un programme serveur. Il s'agit de l'extension logique du partitionnement des logiciels importants en modules donnant la possibilit<69> de d<>veloppement et de maintenance plus ais<69>s. Les modules "demandeurs" sont appel<65>s client et les modules appel<65>s sont appel<65>s service. Ainsi les diff<66>rents modules fonctionnent sur des plateformes diff<66>rentes et appropri<72>es <20> leur fonction. Par exemple, les syst<73>mes de gestion de base de donn<6E>es tournent sur des plateformes logicielles et mat<61>rielles con<6F>ues pour optimiser les requ<71>tes, ou les serveurs de fichiers tournent sur des plateformes adapt<70>es pour la gestion de fichiers.\\
~\\
Le client est donc un programme qui envoie un message <20> un programme serveur, demandant au serveur un service. Les programmes client sont en g<>n<EFBFBD>ral constitu<74>s d'une interface permettant de valider les donn<6E>es entr<74>es par l'utilisateur et d'un programme permettant de traiter et d'envoyer les requ<71>tes aux programmes serveur.\\
~\\
Le programme contient donc un certain nombre de facilit<69>s pour interagir avec l'utilisateur. Ainsi, il acc<63>de aux ressources locales (<28>cran, clavier, processeur, p<>riph<70>riques, etc.).\\ Un des <20>l<EFBFBD>ments souvent pr<70>sent sur une machine de type poste de travail est une interface graphique : GUI (Graphical User Interface).\\
Normalement, c'est le Windows Manager qui d<>tecte les actions de l'utilisateur, g<>re les diff<66>rentes fen<65>tres et affiche les donn<6E>es.\\
~\\
Le serveur est un programme qui r<>pond aux demandes du client en r<>alisant la t<>che demand<6E>e. Les programmes serveur recoivent en g<>n<EFBFBD>ral des requ<71>tes des programmes client, ex<65>cutent des requ<71>tes et mises-<2D>-jour sur une base de donn<6E>es, contr<74>lent l'int<6E>grit<69> des donn<6E>es et r<>pondent aux programmes clients. Le programme serveur devrait <20>tre sur une machine ind<6E>pendante sur le r<>seau mais souvent plusieurs programmes serveur sont sur la m<>me machine et dans certains cas, la machine h<>bergeant le service est un poste de travail. Le programme serveur peut souvent acc<63>der <20> des resources locales telles que les bases de donn<6E>es, imprimantes, interfaces et processeur(s).\\
~\\
\section{Le protocole HTTP}
\subsection{Diff<EFBFBD>rentes versions}
HTTP/0.9 : premi<6D>re version du protocole HTTP, tr<74>s simple, permettant uniquant une requ<71>te GET et une r<>ponse sans m<>ta-donn<6E>es. \\
HTTP/1.0 : ancienne version du protocole HTTP, encore utilis<69>e par certains logiciels. Le serveur HTTP ferme encore la connexion d<>s qu'il a envoy<6F> sa r<>ponse. \\
HTTP/1.1 : version la plus r<>pandue du protocole HTTP. Elle permet notamment les connexions persistantes, la n<>gociation du contenu, et une meilleure gestion du cache.~\\
~\\
\subsection{M<EFBFBD>thodes :}
~\\
GET : requ<71>te d'une ressource \\
HEAD : requ<71>te uniquement des ent<6E>te d'une ressource \\
POST : envoi de donn<6E>es <20> une ressource \\
Il existes d'autres m<>thodes moins utilis<69>es (PUT, DELETE, TRACE, CONNECT) \\
~\\
\subsection{Codes d'<27>tat :}
\begin{itemize}
\item{1xx} : Information (peu utilis<69>)
\item{2xx} : Succ<63>s, notamment le code 200 correspondant <20> OK
\item{3xx} : Redirection, notamment 301 (d<>placement d<>fintif) et 302 (d<>placement temporaire)
\item{4xx} : Erreur du client, notamment 404 (non trouv<75>) et 403 (non autoris<69>)
\item{5xx} : Erreur du serveur, notamment 500 (erreur interne)
\end{itemize}
\subsection{Champs d'ent<6E>te :}
\begin{itemize}
\item{Allow}
\item{Authorization}
\item{Content-Encoding}
\item{Content-Length}
\item{Date}
\item{Expires}
\item{From}
\item{If-Modified-Since}
\item{Last-Modified}
\item{Location}
\item{Pragma}
\item{Referer}
\item{Server}
\item{User-Agent}
\item{WWW-Authenticate}
\item{etc.}
\end{itemize}
\section{Pr<EFBFBD>sentation}
~\\
Le logiciel Apache est un serveur HTTP. Apparu en 1995, il est d<>riv<69> de nombreux patches pour le serveur NCSA HTTPD\footnote{http://hoohoo.ncsa.uiuc.edu/}. Compl<70>tement r<><72>crit, son nom serait tir<69> officieusement de l'appelation "a patchy server", c'est-<2D>-dire un serveur fait de patches. La version officielle indique que le nom a <20>t<EFBFBD> choisi en l'honneur de la tribu Apache, bien connue pour son sens aigu de la strat<61>gie guerri<72>re et pour son endurance. D<>s 1996, il devenait le serveur HTTP le plus r<>pandu sur Internet et sa popularit<69> ne cesse de cro<72>tre car en 1999, il <20>tait pr<70>sent sur 57\% des serveurs et en 2004, le chiffre atteind 67\%\footnote{http://news.netcraft.com/archives/web\_server\_survey.html}.\\
La fondation Apache, Apache Software Foundation\footnote{http://www.apache.org/foundation/}, a <20>t<EFBFBD> cr<63><72>e en 1999 afin de soutenir le d<>veloppement d'Apache mais aussi de nombreux autres projets orient<6E>s web (Jakarta, Spamassassin, etc.).\\
Apache est l'un des logiciels libres - sous licence Apache\footnote{http://www.apache.org/licenses/} souvent cit<69> en exemple quand on parle des logiciels libres car il est notamment r<>put<75> pour sa s<>curit<69> et sa fiabilit<69>.\\
On distingue actuellement la version 1.x de la version 2.x qui comprend de nombreuses avanc<6E>es telles qu'une nouvelle API, le support natif de l'IPv6 et la possibilit<69> d'installation sur des plateformes non UNIX. Apache poss<73>de <20>galement de nombreux modules (CGI, Perl, PHP, authentification avanc<6E>e, etc.) offrant des possibilit<69>s de mise en oeuvre de services complexes.\\
\section{Installation}
\subsection{Compilation}
~\\
Comme la plupart des logiciels libres, il est possible de compiler Apache <20> partir des sources. Cela permet de compiler uniquement avec les options que l'on a besoin et d'avoir des binaires bien adapt<70>s <20> sa machine.\\
Pour la compilation en elle-m<>me, on applique donc la proc<6F>dure classique. On va reprendre en d<>tail cette proc<6F>dure.\\
~\\
On t<>l<EFBFBD>charge les sources mais <20>galement le hash MD5 des sources ainsi que la signature PGP (et les cl<63>s des d<>veloppeurs Apache) de ces sources~:
On v<>rifie le bon d<>roulement du t<>l<EFBFBD>chargement des sources en comparant le r<>sultat des commandes suivantes~:
\begin{verbatim}
$ md5sum apache_x.y.z.gz
$ cat apache_x.y.z.tar.gz.md5
\end{verbatim}
~\\
On importe les cl<63>s des d<>veloppeurs Apache et on v<>rifie l'int<6E>grit<69> des sources~:
\begin{verbatim}
$ gpg --import KEYS
$ gpg --verify apache_x.y.z.tar.gz.asc
\end{verbatim}
On peut ensuite d<>compresser et d<>sarchiver les sources~:
\begin{verbatim}
tar -zxvf apache_x.y.z.tar.gz
cd apache_x.y.z.tar.gz
\end{verbatim}
On prend ensuite connaissance des options qui s'offrent <20> nous gr<67>ce <20> la commande~:
\begin{verbatim}
./configure --help
\end{verbatim}
On distinguera les options d'administration (noms des r<>pertoires, chemins des librairies, etc.). Par exemple~:
\begin{verbatim}
--sysconfdir=/etc/apache2 --sbindir=/usr/sbin ;
\end{verbatim}
Et les options relatives aux fonctionnalit<69>s, par exemple~:
\begin{verbatim}
--with-mpm=worker --enable-ssl --enable-rewrite
--enable-cgi --enable-dav-fs --enable-dav
\end{verbatim}
On aura bien s<>r besoin de nombreuses librairies de d<>veloppement pour compiler Apache (l'<27>tape suivante sert bien s<>r <20> v<>rifier leurs pr<70>sences). Ensuite, on sp<73>cifie les options choisies avant de lancer l'<27>tape de v<>rification :\\
~\\
\texttt{./configure [options]}\\
~\\
On compile :\\
~\\
\texttt{make}\\
~\\
Et on proc<6F>de <20> l'installation :\\
~\\
\texttt{make install}\\
~\\
\subsection{Paquets}
~\\
Les paquets offrent plusieurs avantages sur la compilation <20> partir des sources. Ils permettent notamment de gagner du temps, et parfois de g<>rer les d<>pendances. On distinguera les paquets RPM\footnote{http://www.rpm.org/}, DEB\footnote{http://www.debian.org/distrib/packages}, etc.\\
ssl-cert :& surcouche pour g<>n<EFBFBD>rer des certificats\\
\hline
libldap2 :& librairies OpenLDAP\\
\hline
libgnutls11 :& librairies GNU TLS\\
\hline
libgcrypt11 :& librairies cryptographiques LGPL\\
\hline
libgpg-error0 :& librairie pour erreurs/messages composants GnuPG\\
\hline
liblzo1 :& librairies de compression LZO\\
\hline
libopencdk8 :& Kit "Open Crypto Development"\\
\hline
libtasn1-2 :& librairies structures ASN.1\\
\hline
zlib1g :& librairies de compression gzip\\
\hline
libsasl2 :& librairies SASL v2\\
\hline
\end{tabular}
\end{center}
\section{Configuration}
On v<>rifiera sa configuration gr<67>ce <20> la commande :\\
~\\
\texttt{apache2ctl configtest}\\
~\\
La configuration d'Apache 2 se trouve dans le r<>pertoire /etc/apache2/ \\
La configuration principale est dans le fichier apache2.conf \\
\textit{Note :} Selon les syst<73>mes (distributions Linux, BSD, etc.), cela peut varier : la commande peut <20>tre apachectl, le r<>pertoire de configuration peut <20>tre /etc/httpd ou /usr/local/etc/apache22 par exemple, et la configuration peut <20>tre dans un fichier httpd.conf \\
~\\
Passons en revue quelques options <20> conna<6E>tre gr<67>ce <20> un exemple de fichier de configuration.\\
D<EFBFBD>taillons la premi<6D>re partie correspondant <20> l'environnement et aux modules :\\
~\\
\begin{verbatim}
### Section 1: Environnement
# mode d'execution du serveur : inetd ou standalone
ServerType standalone
# repertoire de configuration
ServerRoot /etc/apache2
# lock and PID file
LockFile /var/lock/apache.lock
PidFile /var/run/apache.pid
# temporisation pdt laquelle Apache attend temps total r<>ception requ<71>te GET
# ou entre r<>ception paquets TCP lors d'une requ<71>te POST ou PUT etc.
Timeout 300
# connexions persistentes
#KeepAlive On
# nombre de requ<71>tes permises pour une connexion unique
# lorsque la directive KeepAlive est activ<69>e
#MaxKeepAliveRequests 100
# nombre de secondes pendant lesquelles Apache
# attendra une requ<71>te post<73>rieure avant de rompre une connexion.
#KeepAliveTimeout 15
# nombre minimum de processus fils en attente qu'un serveur pourra conserver
#MinSpareServers 5
# nombre maximal de processus fils en attente
#MaxSpareServers 10
# nombre de processus fils cr<63><72>s d<>s le d<>marrage du serveur
#StartServers 5
# nombre limite de requ<71>tes simultan<61>es pouvant <20>tre accept<70>es par le serveur
MaxClients 150
# nombre limite de requ<71>tes qu'un processus serveur fils peut tra<72>ter
MaxRequestsPerChild 100
# modules
LoadModule ...
LoadModule ...
LoadModule ...
# MIME
<IfModule mod_negotiation.c>
LanguagePriority fr en da nl et de el it ja pl pt pt-br ltz ca es sv
\textbf{<Location ...></Location>} est similaire <20> <Directory></Directory> <20> la diff<66>rence que les directives sont valables sur les chemins d'URL\\
~\\
Exemple~:
\begin{verbatim}
<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 192.168.176.53
</Location>
\end{verbatim}
Dans \textbf{<Files ...></Files>} :\\
~\\
Directives portant sur les fichiers.\\
~\\
Exemple :\\
\begin{verbatim}
<Files ~".(mp3|ogg|avi|mpeg)\$">
Order allow,deny
Deny from all
</Files>
\end{verbatim}
~\\
\textbf{<Limit ... ></Limit>} impose des restrictions sur certaines m<>thodes du protocole HTTP.
~\\
Exemple :\\
\begin{verbatim}
<Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
Order deny,allow
Deny from all
</Limit>
\end{verbatim}
~\\
Par d<>faut, la configuration d'Apache est souvent r<>partie dans plusieurs
fichiers pour une meilleure gestion. Ainsi, sous Debian, on retrouve
le partitionnement suivant, indiqu<71> dans le fichier de configuration principal :\\
\begin{verbatim}
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
Include /etc/apache2/conf.d/[^.#]*
Include /etc/apache2/sites-enabled/[^.#]*
\end{verbatim}
~\\
~\\
\textbf{Les modules :}\\
~\\
On trouve les r<>pertoires mods-available et mods-enabled dans le r<>pertoire de configuration. mods-available contient des fichiers NOM.load et NOM.conf : un fichier NOM.load contient la directive permettant le chargement d'un module disponible :\\
\begin{verbatim}
LoadModule /chemin/NOM.so
\end{verbatim}
~\\
Le fichier NOM.conf contient les <20>ventuelles options de configuration du mod<6F>le, par exemple :\\
\texttt{
<IfModule mod\_NOM.c>\\
...\\
</IfModule>\\
}
~\\
Pour activer un module, on fait simplement un lien symbolique du fichier NOM.load (et NOM.conf si il existe) vers le r<>pertoire mods-enabled.\\
Utilis<EFBFBD> pour les directives suppl<70>mentaires
(vide par d<>faut)\\
~\\
-Le fichier \texttt{ports.conf} :
\begin{verbatim}
Listen 80
Listen IP:80
Listen domain.tld:80
\end{verbatim}
La troisi<73>me possibilit<69> est <20><20>viter si possible\footnote{http://httpd.apache.org/docs-2.2/dns-caveats.html}\\
~\\
\subsection{VirtualHost}
~\\
Le terme de VirtualHost se r<>f<EFBFBD>re <20> la pratique de faire tourner plusieurs sites Internet sur une seule machine alors que l'utilisateur final ne se rend pas compte que les diff<66>rents sites tournent physiquement sur la m<>me machine.\\
~\\
Apache est capable d'avoir des VirtualHost bas<61>s sur les adresses IP et sur les noms. Attention, les ports d'<27>coute sont d<>finis avec le param<61>tre Listen. Les VirtualHost ne font que "rediriger" les requ<71>tes entrantes.\\
~\\
\begin{verbatim}
NameVirtualHost IP:*
NameVirtualHost *
<VirtualHost 10.1.2.3:>
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>
\end{verbatim}
~\\
Exemple complexe :\\
\begin{verbatim}
Listen IP1:80
Listen IP2:8080
NameVirtualHost IP1:80
<VirtualHost IP1:80>
DocumentRoot /www/ip1
ServerName www.name1.tld
</VirtualHost>
<VirtualHost IP1:80>
DocumentRoot /www/ip2
ServerName www.name2.tld
</VirtualHost>
#bas<61> sur l'IP
<VirtualHost IP2:8080>
DocumentRoot /www/ip3
ServerName www.name3.tld
</VirtualHost>
\end{verbatim}
~\\
<EFBFBD> l'int<6E>rieur d'un VirtualHost, on peut sp<73>cifier de nombreuses directives. Souvent il s'agira de~:\\
\begin{verbatim}
DocumentRoot
ServerAdmin
ServerName
ServerAlias
ErrorLog
TransferLog
LogLevel
CustomLog
ServerSignature
ErrorDocument
Rewrite*
etc.
\end{verbatim}
~\\
Ainsi que le <Directory /></Directory> sp<73>cifiant les droits par d<>faut sur les r<>pertoires concern<72>s (DocumentRoot, script CGI, script Perl, icones, manuel, ...)\\
~\\
Voir dans la documentation, les param<61>tres pouvant s'appliquer dans un VirtualHost.\\
~\\
Lien:\url{http://httpd.apache.org/docs/vhosts/}\\
~\\
\subsection{Configuration des sites en ligne}
~\\
La configuration d'Apache fonctionne souvent avec des VirtualHost... m<>me pour un seul site mis en ligne ! On trouve les r<>pertoires \textit{sites-enabled} et \textit{sites-available} dans le r<>pertoire de configuration. Par exemple, le fichier \textit{default} :
\begin{verbatim}
NameVirtualHost *
<VirtualHost *>
ServerName www.example.com
ServerAlias example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/
<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
</Directory>
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ServerSignature On
</VirtualHost>
\end{verbatim}
Pour activer un site, on fait simplement un lien symbolique du fichier dans le r<>pertoire sites-available vers le r<>pertoire sites-enabled. Par contre, Apache passe en revue les liens du r<>pertoire sites-enabled dans l'ordre alphanum<75>rique/alphab<61>tique. Il faut donc nommer les liens selon ses pr<70>f<EFBFBD>rences. Ainsi, on cr<63>ra un lien :
Ce module permet l'ex<65>cution de scripts CGI (les scripts CGI peuvent <20>tre <20>crits en C, Perl, Shell, etc.).\\
~\\
\textbf{Configuration :}
~\\
\begin{verbatim}
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory /usr/lib/cgi-bin/>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
\end{verbatim}
~\\
\textbf{Exemple} :
~\\
date.cgi :
\begin{verbatim}
#!/bin/sh
tmp=`/bin/date`
cat << EndFile
Content-type: text/html
<HTML><HEAD><TITLE>Date du serveur</TITLE></HEAD>
<BODY>
<CENTER>
<H1>La date du serveur est</H1>
$tmp
</CENTER>
</BODY>
</HTML>
EndFile
\end{verbatim}
\subsection{mod\_perl}
~\\
Lien:\url{http://perl.apache.org/}\\
~\\
Ce module permet d'ex<65>cuter des scripts Perl. Il offre de nombreux avantages par rapport aux scripts CGI en Perl (rapidit<69>, optimisation, etc.)\\
On rappelle la proc<6F>dure de g<>n<EFBFBD>ration d'un certificat auto-sign<67>~:\\
~\\
On cr<63>e une "demande" de certificat en se basant sur des param<61>tres al<61>atoires ainsi que sur une cl<63> priv<69>e \texttt{privkey.pem} prot<6F>g<EFBFBD>e par un mot de passe~:
\begin{verbatim}
$ openssl req -new > demande.csr
\end{verbatim}
Si l'on veut supprimer ce mot de passe de protection (utile dans le cas d'un serveur), on ajoute l'argument \texttt{-out cleprivee.pem} et l'on obtient une cl<63> priv<69>e \texttt{cleprivee.pem} non prot<6F>g<EFBFBD>e~:
\begin{verbatim}
$ openssl rsa -in privkey.pem -out cleprivee.pem
\end{verbatim}
Enfin, on g<>n<EFBFBD>re le certificat bas<61> sur la demande et sign<67> par la cl<63> priv<69>e~: