34. Serveur Web TP

34.1. Travaux pratiques : première partie

34.1.1. Installation de base

Le but de cet exercice est de mettre en place un serveur Web.

  • Créez un utilisateur et un groupe.

    Sous Redhat, ce n'est pas le groupe www-data qui est utilisé mais tout simplement le groupe apache. Je vais donc utiliser celui-ci.

    Maintenant, je vais créer un utilisateur qui sera membre du groupe apache.

    [adminbdd ~]$ useradd -s /sbin/nologin -d /var/www/html/monsiteweb -g apache monsiteweb
    [adminbdd ~]$ groups monsiteweb
    
    monsiteweb : apache
    
    [adminbdd ~]$ grep monsiteweb /etc/passwd
    
    monsiteweb:x:9002:48::/var/www/html/monsiteweb:/sbin/nologin
    
  • Créez la hiérarchie de répertoires pour accueillir votre site, en la justifiant. Quel est l’intérêt d’une telle séparation ?

    Ma hiérarchie est assez simple : un répertoire (et un utilisateur) par site web pour la racine du site. Il peut être également intéressant de prévoir un accès ftp pour l'utilisateur du site web.

    [adminbdd html]$ tree
    
    .
    `-- monsiteweb
        |-- log
        `-- www
    
    3 directories, 0 files
    
  • Modifiez le fichier de configuration fourni dans la distribution d’Apache pour l’adapter à votre installation

    Dans le fichier d'origine, /etc/httpd/conf/httpd.conf, il il y une directive intéressante qui permet d'éclater son fichier de configuration en plusieurs autres.

    [adminbdd conf]$ grep conf.d httpd.conf
    
    # Load config files from the config directory "/etc/httpd/conf.d".
    Include conf.d/*.conf
    

    On va donc créer notre virtual host dans le répertoire conf.d.

    [adminbdd conf.d]$ cat monsiteweb.conf
    
    <VirtualHost *:80>
        ServerAdmin admin@monsiteweb.com
        DocumentRoot /var/www/html/monsiteweb/www
        ServerName monsiteweb.com
        ServerAlias monsiteweb.fr
        Header add X-Robots-Tag noindex,follow
        ErrorLog /var/www/html/monsiteweb/log/error_monsiteweb_com.log
        CustomLog /var/www/html/monsiteweb/log/access_monsiteweb_com.log combined
    
        <Directory "/var/www/html/monsiteweb/www">
            Options +Indexes
            AllowOverride All
        </Directory>
    </VirtualHost>
    

    Vérifions notre nouvelle configuration :

    [adminbdd conf.d]$ apachectl -t
    
    Syntax OK
    

    Il faut maintenant procéder au redémarrage du service (ou un reload pour les sites en production !).

    [adminbdd conf.d]$ /etc/init.d/httpd restart
    
    Arrêt de httpd :                                           [  OK  ]
    Démarrage de httpd :                                       [  OK  ]
    
  • Créez quelques fichiers et répertoires à la racine de votre site et essayez d’y accéder depuis votre navigateur Web.

    Avant de continuer, nous allons ajouter une entrée dans le fichier /etc/hosts pour faciliter les tests. Créons maintenant un index à la racine du site :

    [adminbdd www]$ cat > index.html << EOF
    
    > <html>
    > <head><title>www.monsiteweb.com</title></head>
    > <body>
    > <h2>It works !</h2>
    > </body>
    > </html>
    > EOF
    

    Modification de quelques droits :

    [adminbdd www]$ chown monsiteweb:apache index.html
    [adminbdd www]$ chmod 744 index.html
    [adminbdd www]$ ls -l
    
    total 4
    -rwxr--r-- 1 monsiteweb apache 97 juin  8 17:23 index.html
    

    Test d'accès à notre super site web (via le navigateur Iron) :

    Figure 8. monsiteweb.com

    Vérification des logs d'accès :

    [adminbdd log]$ tail access_monsiteweb_com.log
    
    192.168.10.204 - - [08/Jun/2012:17:05:04 +0200] "GET / HTTP/1.1" 403 312 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    192.168.10.204 - - [08/Jun/2012:17:05:04 +0200] "GET /favicon.ico HTTP/1.1" 403 323 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    192.168.10.204 - - [08/Jun/2012:17:13:00 +0200] "GET / HTTP/1.1" 200 - "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    192.168.10.204 - - [08/Jun/2012:17:13:00 +0200] "GET /favicon.ico HTTP/1.1" 404 319 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    192.168.5.53 - - [08/Jun/2012:17:15:19 +0200] "GET / HTTP/1.0" 200 - "-" "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8e-fips-rhel5"
    192.168.10.204 - - [08/Jun/2012:17:27:17 +0200] "GET / HTTP/1.1" 200 97 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    192.168.10.204 - - [08/Jun/2012:17:27:17 +0200] "GET /favicon.ico HTTP/1.1" 404 319 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    192.168.5.53 - - [08/Jun/2012:17:29:21 +0200] "GET / HTTP/1.0" 200 97 "-" "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8e-fips-rhel5"
    192.168.10.204 - - [08/Jun/2012:17:29:48 +0200] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    192.168.10.204 - - [08/Jun/2012:17:29:48 +0200] "GET /favicon.ico HTTP/1.1" 404 319 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5"
    
  • Quelles doivent être les permissions de vos fichiers pour qu’Apache puisse y accéder ?

    Etant donné qu'Apache s'éxécute en tant qu'utilisateur apache membre du groupe apache [...]

    [adminbdd log]$ grep apache$ /etc/httpd/conf/httpd.conf
    
    User apache
    Group apache
    

    [...] il lui suffit d'avoir un accès "r" pour les fichiers et "rx" pour les dossiers pour qu'il puisse y accéder (que ce soit en tant que groupe ou autre).

34.1.2. Analyse du protocole

Pour changer d'air et ne plus utiliser Telnet (pour une fois), je vais installer et essayer netcat (même si au final c'est la même chose) :

[adminbdd log]$ yum install nc.x86_64
Loaded plugins: fastestmirror, rhnplugin
Loading mirror speeds from cached hostfile
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nc.x86_64 0:1.84-10.fc6 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================================
 Package                Arch                       Version                          Repository                          Size
=============================================================================================================================
Installing:
 nc                     x86_64                     1.84-10.fc6                      centos5-x86_64                      56 k

Transaction Summary
=============================================================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 56 k
Is this ok [y/N]: y
Downloading Packages:
nc-1.84-10.fc6.x86_64.rpm                                                                             |  56 kB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : nc                                                                                                    1/1

Installed:
  nc.x86_64 0:1.84-10.fc6

Complete!

Une simple requête HTTP pourrait être par exemple :

[root@CentOS_AdminBDD agilan]# nc www.w3.org 80 > output
GET / HTTP/1.1
Host: www.w3.org
[root@CentOS_AdminBDD agilan]# head -n 20 output
HTTP/1.1 200 OK
Via: 1.1 LILSISAFWPX
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 31765
Expires: Fri, 29 Jun 2012 07:57:42 GMT
Date: Fri, 29 Jun 2012 07:47:42 GMT
Content-Location: Home.html
Content-Type: text/html; charset=utf-8
ETag: "7c15-4c38a0e14f400;89-3f26bd17a2f00"
Server: Apache/2
Vary: negotiate,accept
TCN: choice
Last-Modified: Thu, 28 Jun 2012 15:33:36 GMT
Accept-Ranges: bytes
Cache-Control: max-age=600
P3P: policyref="http://www.w3.org/2001/05/P3P/p3p.xml"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

Néanmoins, il est possible de simplifier encore. La requête HTTP la plus courte est : GET / HTTP/1.1

34.1.3. Publication de pages des utilisateurs

Apache permet aux utilisateurs de posséder leur propre espace Web.

Mettons en place un système identique à l’aide de mod_userdir.

L'activation du module userdir se fait très facilement. Pour cela, il suffit de l'activer dans le fichier de configuration /etc/httpd/conf/httpd.conf.

<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    #UserDir disabled

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    #
    UserDir public_html

</IfModule>

Ensuite, il ne reste plus qu'à créer le dossier public_html et à redémarrer le service httpd.

[root@CentOS_AdminBDD cvanvincq]# mkdir public_html; cd public_html/
[root@CentOS_AdminBDD public_html]# cat > index.php << EOF
> <?php
> echo "<h2>It works !</h2>";
> ?>
> EOF
[root@CentOS_AdminBDD public_html]# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

Il ne reste plus qu'à aller sur l'url http://127.0.0.1/~cvanvincq/ pour obtenir le message "It works !".