HTTPD: le serveur web de la fondation Apache ******************************************** La fondation Apache distribue un des meilleurs serveur web: httpd Il existe aussi bien en version windows qu'unix. La version unix est toujours en avance mais le serveur windows reste très performant. Ce document a pour but de présenter l'installation, le paramétrage et l'utilisation du serveur httpd sous windows Installation ============ Il suffit d'aller télécharger sur http://apache.crihan.fr/dist//httpd/binaries/win32/ pour télécharger la dernière version du serveur. lors de l'installation je déconseille l'installation de la documentation et de l'outil de gestion du service apache. .. figure:: data/20130513_01.png Si tout ce passe bien à la fin de l'installation vosupouvez arrêter et redémarrer le service Apache2.2 :: C:\Program Files>net stop Apache2.2 Le service Apache2.2 s’arrête. Le service Apache2.2 a été arrêté. C:\Program Files>net start Apache2.2 Le service Apache2.2 démarre. Le service Apache2.2 a démarré. et sur votre navigateur, avec l'url http://127.0.0.1 on peut voir .. figure:: data/20130508_1.png Configuration ============= Le principe de base de la configuration d'un serveur apache est la modification du fichier httpd.conf. Nous trouvons ce fichier dans C:/Program Files/Apache Software Foundation/Apache2.2/conf Afin de faciliter la maintenance du serveur nous allons modifier au minimum httpd.conf mais de créer un fichier de configuration par site. Pour cela créer un dossier sites-available dans C:/Program Files/Apache Software Foundation/Apache2.2/conf :: C: |_ Program Files |_ Apache Software Foundation |_ Apache2.2 |_ conf |_ httpd.conf |_ sites-available Notre objectif est de créer sur poste de travail 2 sites web pouvant être atteint par: - test1: http://www.test1.fr - test2: http://www.test2.fr Chaque site aura la même source pour le répertoire image: http://www.test1.fr/img sera le même que http://www.test2.fr/img On personnalisera les ereurs 404 ON géra des logs différenciers pour ces deux sites. .. note:: la notion d'alias peut être utile si on ne veut pas tout les fichiers du site au même endroit Donc nous allons créer 2 sites sur: - la même adresse IP (127.0.0.1) - le même port (80) Gestion d'un dns local ---------------------- Nous allons modifier windows afin que la résolution de test1.fr et test2.fr pointe sur l'ip 127.0.0.1 pour cela il faut modifier le fichier C:/Windows/System32/drivers/etc/hosts et y ajouter :: 127.0.0.1 test1.fr 127.0.0.1 www.test1.fr 127.0.0.1 test2.fr 127.0.0.1 www.test2.fr maintenant nous avons ce résultat concernant les ping :: C:\Program Files>ping test1.fr Envoi d'une requête 'ping' sur test1.fr [127.0.0.1] avec 32 octets de données : Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128 Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128 Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128 Gestion des sites web --------------------- Il faut créer la structure suivante :: C: |_ www |_ test1 | |_ index.html | |_ missing.html | |_ logs | |_ access.log | |_ error.log |_ test2 | |_ index.html | |_ missing.html | |_ logs | |_ access.log | |_ error.log |_ common |_ img |_ httpd.png contenu de index.html du site 1 .. code-block:: html

TEST 1 !!!!!!

contenu de index.html du site 2 .. code-block:: html

TEST 2 !!!!!!

contenu de missing.html .. code-block:: html

OUPS !!!!!!

Configuration de httpd ---------------------- Nous allons créer la structure suivante :: C: |_ Program Files |_ Apache Software Foundation |_ Apache2.2 |_ conf |_ httpd.conf |_ sites-available |_ test1.conf |_ test2.conf le fichier httpd.conf contient déjà "Listen 80" qui indique que apache écoute le port 80 pour toutes les adresses ip du serveur. Nous allons rajouter à la fin du fichier https.conf :: #Listen 80 NameVirtualHost *:80 Include conf/sites-available/*.conf cela permet d'indiquer que chaque VirtualHost utilise toutes les adresses IP en écoute sur le port 80 De plus on inclu tout les fichier .conf du dossier sites-available .. note:: par la suite pour supprimer un site du serveur apache il suffira de renommer son fichier conf: site.conf en site.old contenu du fichier test1.conf .. code-block:: xml # conf/site-available/test1.conf ServerName test1.fr ServerAlias *.test1.fr DocumentRoot "C:/www/test1" AllowOverride None Options None Order allow,deny Allow from all Alias /img "C:/www/common/img" Order allow,deny Allow from all DirectoryIndex index.html ErrorDocument 404 /missing.html ErrorLog "C:/www/test1/logs/error.log" LogLevel info LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common #CustomLog "C:/www/test1/logs/access.log" common CustomLog "|bin/rotatelogs.exe C:/www/test1/logs/access-%Y_%m_%d_%H_%M.log 86400" common #CustomLog "|bin/rotatelogs.exe C:/www/test1/logs/access-%Y_%m_%d.log 5M" common contenu du fichier test2.conf .. code-block:: xml # conf/site-available/test2.conf ServerName test2.fr ServerAlias *.test2.fr DocumentRoot "C:/www/test2" AllowOverride None Options None Order allow,deny Allow from all Alias /img "C:/www/common/img" Order allow,deny Allow from all DirectoryIndex index.html ErrorDocument 404 /missing.html ErrorLog "C:/www/test2/logs/error.log" LogLevel info LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common #CustomLog "C:/www/test2/logs/access.log" common CustomLog "|bin/rotatelogs.exe C:/www/test2/logs/access-%Y_%m_%d_%H_%M.log 86400" common #CustomLog "|bin/rotatelogs.exe C:/www/test2/logs/access-%Y_%m_%d.log 5M" common quelques explications: - ServerName et ServerAlias indique pour quelle url le VirtualHost utilise - DocumentRoot indique ou on trouve les fichiers du site - Directory indique surtout des notions de droit - Alias img indique ou on trouve les fichiers pour les url /img - DirectoryIndex indique les fichiers à charger si on indique pas de fichier - ErrorDocument 404 indique le fichier à charger en cas d'erreur 404 - ErrorLog et LogLevel indique l'emplacemnt et le niveau du fichier d'erreur - LogFormat et CustomLog permet de mettre en place le fichier log concernant les accès .. note:: dans notre exemple comme le fichier access.log grossit très vite nous avons paramétrer une rotation journalière (86400 secondes) on pourrait gérer une rotation basé sur la taille du fichier (5M) on sans rotation .. note:: Il est possible de gérer l'autorisation d'accès via pache (même si cela est souvent réalisé de façon fonctionnelle) On peut par exempel autoriser toutes les adresses IP du réseau 192.168.0 sauf la 192.168.0.42 en paramétrant ainsi :: Order allow,deny Allow from 192.168.0 Deny from 192.168.0.42 Résultat -------- :: C:\Program Files>net stop Apache2.2 Le service Apache2.2 s’arrête. Le service Apache2.2 a été arrêté. C:\Program Files>net start Apache2.2 Le service Apache2.2 démarre. Le service Apache2.2 a démarré. .. figure:: data/20130508_2.png .. figure:: data/20130508_3.png .. figure:: data/20130508_4.png .. figure:: data/20130508_5.png .. figure:: data/20130508_6.png Autres configurations --------------------- Il est possible d'imaginer d'autres configurations. En effet httpd peut: - travailler sur plusieurs IP - écouter plusieurs port par IP - et pour chaque couple ip/port router sur plusieurs sites Fonctionnement de plusieurs serveurs virtuels par nom sur une seule adresse IP :: # Apache doit écouter sur le port 80 Listen 80 # Toutes les adresses IP doivent répondre aux requêtes sur les # serveurs virtuels NameVirtualHost *:80 DocumentRoot /www/example.com ServerName www.example1.com # Autres directives ici DocumentRoot /www/example.org ServerName www.example2.org # Autres directives ici Servir le même contenu sur des adresses IP différentes (telle qu'une adresse interne et une externe). :: NameVirtualHost 192.168.1.1 NameVirtualHost 172.20.30.40 DocumentRoot /www/server1 ServerName server.example.com ServerAlias server Servir différents sites sur différents ports. :: Listen 80 Listen 8080 NameVirtualHost 172.20.30.40:80 NameVirtualHost 172.20.30.40:8080 ServerName www.example.com DocumentRoot /www/domain-80 ServerName www.example.com DocumentRoot /www/domain-8080 ServerName www.example.org DocumentRoot /www/otherdomain-80 ServerName www.example.org DocumentRoot /www/otherdomain-8080 ébergements virtuels mixtes basés sur les ports et sur les IP :: Listen 172.20.30.40:80 Listen 172.20.30.40:8080 Listen 172.20.30.50:80 Listen 172.20.30.50:8080 DocumentRoot /www/example.com-80 ServerName www.example.com DocumentRoot /www/example.com-8080 ServerName www.example.com DocumentRoot /www/example.org-80 ServerName www.example.org DocumentRoot /www/example.org-8080 ServerName www.example.org Utilisation avancée =================== le serveur httpd possède plusieurs module permettant: - de gérer des proxy - de gérer de l'authentification - de gérer des outils de programmation L'utilisation d'outils annexe permettant de rendre le web dynamique est facilité par l'utilisation de trois méthodes: * cgi cette méthode permet de lancer un programme externe à *chaque* demande http. Cela est souvent peut rapide car chaque demande la mise en mémoire de l'ensemble du programme , de l'importation de tout les modules nécessaires * module intégré cette méthode impose d'avoir un interpréteur embarqué dans le serveur httpd. L'interpréteur n'est lancé qu'une fois ce qui rend cete méthode rapide * serveurs tiers les requêtes http sont transmise à un serveur tiers qui fournit alors la réponse adéquate. Cela nécessite un serveur tiers et donc des ressources supplémentaire mais cetet méthode est la plus rapide et la plus fiable. Modification du Charset ======================= Dans le fichier /etc/apache2/conf.d/charset ou default vous trouvez: .. code-block:: bash AddDefaultCharset UTF-8 il faut obtenir: .. code-block:: bash AddDefaultCharset ISO-8859-1 Sécurisation des accès ====================== Configuration d’Apache pour .htaccess Le fichier de configuration pour Apache : default, se trouve dans /etc/apache2/sites-available/default . D’origne, il contient les éléments suivants .. code-block:: bash Options Indexes Includes FollowSymlinks MultiViews AllowOverride None Order allow,deny Allow from all Il faut ajouter une instruction (AllowOverride AuthConfig) pour indiquer que nous voulons protéger les dossiers suivants .. code-block:: bash Options Indexes Includes FollowSymlinks MultiViews AllowOverride AuthConfig Order allow,deny Allow from all AllowOverride AuthConfig demande à Apache de prendre en compte le fichier .htacess dans le répertoire /var/www/ et tous ses sous-répertoires. Le fichier .htaccess ==================== Avec votre éditeur préféré (vim), vous éditez un fichier .htaccess dans le répertoire que vous souhaitez protéger. Et voici ce qe vous devez y mettre .. code-block:: bash AuthUserFile /var/www/pass/.htpasswd AuthName "Accès protégé" AuthType Basic Require valid-user On indique que le fichier .htpasswd (qui contient les logins et les mots de pass) se trouve dans /var/www/pass/. Il est préférable de mettre de fichier hors du site lui même. Sinon on ajoute un fichier .htaccess dans le répertoire où se trouve .htpasswd pour en empêcher l’accés. Dans ce cas là, le fichier .htaccess contient : deny from all Création du fichier .htpasswd ============================= Vous devez bien sûr mettre le fichier .htpasswd dans le répertoire que vous avez indiqué dans .htaccess. Il se compose toujours comme suit .. code-block:: bash login:passwd Ces mots de passe doivent être cryptés. Vous obtenez le mot de passe crypté au moyen de la commande htpasswd. Par exemple je souhaite que l’utilisateur toto accede à ma page web avec le mot de passe ‘supertoto’, je tape la commande .. code-block:: bash [[root@glop root]]# htpasswd -c /var/www/pass/.htpasswd toto New password: Re-type new password: Adding password for user toto L’option -c de htpasswd permet de créer le fichier .htpasswd avec le premier couple login:passwd. Si vous souhaité ajouter un deuxième utilisateur, il faut enlever l’option -c .. code-block:: bash [[root@glop root]]# htpasswd /var/www/pass/.htpasswd tutu New password: Re-type new password: Adding password for user tutu remarque il est possible d’écrire le fichier .htpasswd sans être crypté.: .. code-block:: bash JFPillou:Toto504 Damien:Robert(32) Comma:Joe[[leTaxi]] Utilisation de httpd comme proxy web ==================================== Pour différente raison il est parfois utile de mettre en place un proxy web. L'objectif est de rendre transparent pour l'utilisateur le routage de ces requêtes web vers un autre serveur web que celui visé. Par exemple vous avez un serveur web A qui est accessible depuis l'extérieur. Vous avez aussi un serveur B sur lequel vous avez un service (par exemple FileZ) et qui n'est pas accessible depuis l'extérieur. Vous avez deux solutions: - faire que le serveur B possède une adresse public - faire en sorte que les requêtes serveurA\filez soit routé sur le serveur B cela s'appelle un proxy Pour cela sur le serveur A il faut activer le module proxy .. code-block:: bash a2enmod proxy proxy_http /etc/init.d/apache2 restart Puis sur le serveur A rajouter un virtual host permettant la redirection .. code-block:: apacheconf ServerAdmin postmaster@domaine.tld ServerName serveurA ProxyPass /filez http://localhost:8000/ ProxyPassReverse /filez http://localhost:8000/ ProxyPreserveHost On