Étiquette : PostgreSQL

Spatialiser une base de données postGIS

Même si PostgreSQL a été installé conjointement avec PostGis, la base de données n’est pas, par défaut, spatialisée.

Un rapide coup d’oeil aux tables nous montre l’absence des deux principales tables nécessaires à PostGIS, geometry_columns et spatial_ref_sys.

Voilà comment les ajouter, ainsi que l’ensemble des fonctions nécessaires à la spatialisation de la base colloque:

sudo su - postgres
createlang plpgsql colloque
psql -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql -d colloque
psql -f /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql -d colloque

Pour ajouter les droits d’usage sur ces tables à l’utilisateur, saisir :

sudo –s –u postgres
psql colloque
ALTER TABLE geometry_columns OWNER TO colloque;
ALTER TABLE spatial_ref_sys OWNER TO colloque;


No stress   😉

Création d’un serveur web virtualisé dédié au webmapping – partie 4, fin

C’est pas tout de créer des serveur web et bases de données, faut savoir els exploiter. Dans ce tutoriel, vous trouverez comment réaliser un petit script pour tester votre serveur en mettant en oeuvre Ajax.

Premier site avec Ajax

L’objectif est de créer une page web avec une zone de saisie couplée à un liste de suggestion issue d’une base de données. A chaque saisie de l’utilisateur, une requete Ajax est soumise au serveur qui va interroger la base de données pour vérifier que le nom d’une ville commençant par les lettres saisies existe pas dans la table villes. Si c’est le cas, le serveur renvoi la liste des villes correspondant. Les villes renvoyées peuvent être cliquées pour remplir automatiquement la zone de saisie.

Créons notre table

Dans Postgresql, on créé la table avec le code SQL suivant

CREATE TABLE villes
(
nom character varying(50) NOT NULL,
CONSTRAINT villes_pkey PRIMARY KEY (nom)
)

Il est téléchargé sur Jquery.com la bibliothèque Javascript JQuery qui est enregistrée à la racine du site. Pour fonctionner, le site est constitué des 3 principaux fichiers suivants:

index.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<!-- Vital, afin que le site soit bien interprété par le
navigateur en termes de caractères -->
<title>Mon premier site utilisant Ajax</title>
<script type="text/javascript" src="jquery.js"></script>
<!-- lien vers la bibliothèque jquery téléchargées depuis jquery.com -->
<script type="text/javascript" src="suggest.js"></script>
<!-- lien vers le fichier personnel suggest.js qui s'exécuter après
le chargement du DOM -->
<link rel="stylesheet" href="suggest.css" media="screen" />
<!-- lien vers le fichier personnel CSS -->
</head>
<body>
<div>
Saisir un mot: <input type="text" />
<!-- C'est ici que l'utilisateur sélectionnera
les première lettre du nom à trouver  -->
</div>
<div>
Suggestions: <span id="suggest"></span>
<!-- c'est dans ce span -élément inline- que s'écrira le résultat
de la requete ajax  -->
</div>
</body>
</html>

suggest.js (exécuté côté client: le navigateur web):

$(document).ready(function() {
// $(document).ready() s'exécute dès que le DOM est chargé,
// avant que toutes les ressources soient téléchargées (ex: images)
$('#txt1').keyup(function() {
// inscrit dans le gestionnaire d'événement que la fonction propose() est
// à lancer lorsque la touche du clavier est lachée sur le contrôle txt1
propose();  // fonction à appeler sur le keyup de l'input txt1
});
});
function propose(){
if($('#txt1').val() == '') { // si l'input d'id=txt1 est vide ou vidé
$('#suggest').html(''); // vide le span d'id=suggest
return; // sort de la fonction
}
$.ajax({  // exécute une requete Ajax
type: 'GET',  // en mode GET
url: 'suggest.php',  // vers le fichier suggest.php
data: 'txt='+$("#txt1").val(),  // avec les paramètres suivant donc suggest.php?txt=...
dataType:'text',  // le serveur renverra une réponse de suggest.php sous forme texte
success: function(msg){ $('#suggest').html(msg); }
// si Ajax réussi, écrit dans le span d'id=suggest
// la réponse du serveur suggest.php?txt=
});
}

suggest.php(exécuté côté serveur et restituant au client de l’HTML)

<?php
session_start();   // démarrer la gestion des sessions
header("Content-Type: text/plain ; charset=utf-8");
// renvoie un réponse au format MIME text avec les caractères utf-8
header("Cache-Control: no-cache, private"); // anti cache pour HTTP/1.1
header("Pragma: no-cache"); // anti cache pour HTTP/1.0
if (!isset($_SESSION['chaineconnexion'])) {
// si la variable $_SESSION['chaineconnexion'] n'est pas définie alors:
$_SESSION['chaineconnexion']='host=localhost port=5432 user=form password=form dbname=form';
}
if(isset($_REQUEST['txt'])){ // si la variable $_REQUEST['txt'] est bien définie alors:
$conn=pg_connect($_SESSION['chaineconnexion']); // on créé la connexion avec la base PGSQL
$sql = "SELECT nom FROM villes WHERE nom LIKE '".$_REQUEST['txt']."%'";
// on définit la requete à exécuter
$result = pg_query($conn,$sql);
// on exécute la requete, le flux de données généré sera représenté par $result
while($row = pg_fetch_assoc($result)){
// on boucle ligne à ligne (à chaque appel de pg_fetch_array,
// $row récupèrera sous forme de table la ligne de données)
echo '<div onclick=\'$("#txt1").val("'.$row['nom'].
'");$("#suggest").hide();\'>'.$row['nom'].'</div>';
// exemple, renverra: <div onclick='$("#txt1").val("Montpellier");
// $("#suggest").hide();'>Montpellier</div>
}
}
?>

Mise en forme

Pour mettre en forme notre site, on applique une feuille de style simple

suggest.css

root {
display: block;
}

#suggest {
position:fixed;
top:33px;
left:130px;
background-color:#86B0D8;
border-style:solid;
border-width:1px;
margin:5px;
cursor : wait;
}

div:hover{
background-color:white;
}

Voilà, c’est fini. Les prochains articles seront plus « webmapping » avec la spatialisation des bases de données, et leur exploitation.

Premier site avec Ajax

L’objectif est de créer une page web avec une zone de saisie couplée à un liste de suggestion issue d’une base de données. A chaque saisie de l’utilisateur, une requete Ajax est soumise au serveur qui va interroger la base de données pour vérifier que le nom d’une ville commençant par les lettres saisies existe pas dans la table villes. Si c’est le cas, le serveur renvoi la liste des villes correspondant. Les villes renvoyées peuvent être cliquées pour remplir automatiquement la zone de saisie.

Dans Postgresql, on créé la table avec le code SQL suivant

CREATE TABLE villes

(

nom character varying(50) NOT NULL,

CONSTRAINT villes_pkey PRIMARY KEY (nom)

)

Il est téléchargé sur Jquery.com la bibliothèque Javascript JQuery qui est enregistrée à la racine du site. Pour fonctionner, le site est constitué des 3 principaux fichiers suivants:

index.xhtml

<?xml version= »1.0″ encoding= »UTF-8″?>

<!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 »>

<head>

<meta http-equiv= »Content-Type » content= »text/html; charset=UTF-8″/>

<!– Vital, afin que le site soit bien interprété par le

navigateur en termes de caractères –>

<title>Mon premier site utilisant Ajax</title>

<script type= »text/javascript » src= »jquery.js »></script>

<!– lien vers la bibliothèque jquery téléchargées depuis jquery.com –>

<script type= »text/javascript » src= »suggest.js »></script>

<!– lien vers le fichier personnel suggest.js qui s’exécuter après

le chargement du DOM –>

<link rel= »stylesheet » href= »suggest.css » type= »text/css » media= »screen » />

<!– lien vers le fichier personnel CSS –>

</head>

<body>

<div>

Saisir un mot: <input type= »text » id= »txt1″ />

<!– C’est ici que l’utilisateur sélectionnera

les première lettre du nom à trouver –>

</div>

<div>

Suggestions: <span id= »suggest »></span>

<!– c’est dans ce span -élément inline- que s’écrira le résultat

de la requete ajax –>

</div>

</body>

</html>

suggest.js

$(document).ready(function() {

// $(document).ready() s’exécute dès que le DOM est chargé,

// avant que toutes les ressources soient téléchargées (ex: images)

$(‘#txt1’).keyup(function() {

// inscrit dans le gestionnaire d’événement que la fonction propose() est

// à lancer lorsque la touche du clavier est lachée sur le contrôle txt1

propose(); // fonction à appeler sur le keyup de l’input txt1

});

});

function propose(){

if($(‘#txt1’).val() ==  ») { // si l’input d’id=txt1 est vide ou vidé

$(‘#suggest’).html( »); // vide le span d’id=suggest

return; // sort de la fonction

}

$.ajax({ // exécute une requete Ajax

type: ‘GET’, // en mode GET

url: ‘suggest.php’, // vers le fichier suggest.php

data: ‘txt=’+$(« #txt1 »).val(), // avec les paramètres suivant donc suggest.php?txt=…

dataType:’text’, // le serveur renverra une réponse de suggest.php sous forme texte

success: function(msg){ $(‘#suggest’).html(msg); }

// si Ajax réussi, écrit dans le span d’id=suggest

// la réponse du serveur suggest.php?txt=

});

}

suggest.php

<?php

session_start(); // démarrer la gestion des sessions

header(« Content-Type: text/plain ; charset=utf-8 »);

// renvoie un réponse au format MIME text avec les caractères utf-8

header(« Cache-Control: no-cache, private »); // anti cache pour HTTP/1.1

header(« Pragma: no-cache »); // anti cache pour HTTP/1.0

if (!isset($_SESSION[‘chaineconnexion’])) {

// si la variable $_SESSION[‘chaineconnexion’] n’est pas définie alors:

$_SESSION[‘chaineconnexion’]=’host=localhost port=5432 user=form password=form dbname=form’;

}

if(isset($_REQUEST[‘txt’])){ // si la variable $_REQUEST[‘txt’] est bien définie alors:

$conn=pg_connect($_SESSION[‘chaineconnexion’]); // on créé la connexion avec la base PGSQL

$sql = « SELECT nom FROM villes WHERE nom LIKE ‘ ».$_REQUEST[‘txt’]. »%' »;

// on définit la requete à exécuter

$result = pg_query($conn,$sql);

// on exécute la requete, le flux de données généré sera représenté par $result

while($row = pg_fetch_assoc($result)){

// on boucle ligne à ligne (à chaque appel de pg_fetch_array,

// $row récupèrera sous forme de table la ligne de données)

echo ‘<div onclick=\’$(« #txt1 »).val(« ‘.$row[‘nom’].

‘ »);$(« #suggest »).hide();\’>’.$row[‘nom’].'</div>’;

// exemple, renverra: <div onclick=’$(« #txt1 »).val(« Montpellier »);

// $(« #suggest »).hide();’>Montpellier</div>

}

}

?>

Mise en forme

Pour mettre en forme notre site, on applique une feuille de style simple suggest.css

root {

display: block;

}

#suggest {

position:fixed;

top:33px;

left:130px;

background-color:#86B0D8;

border-style:solid;

border-width:1px;

margin:5px;

cursor : wait;

}

div:hover{

background-color:white;

}

Spatialiser la base de données colloque

Même si PostgreSQL a été installé conjointement avec PostGis, la base de données n’est pas par défaut spatialisée. Un rapide coup d’oeil aux tables nous montre l’absence des deux principales tables nécessaires à PostGIS, geometry_columns et statial_ref_sys.

Voilà comment les ajouter, ainsi que l’ensemble des fonctions necessaires à la spatialisation de la base colloque:

sudo su – postgres

createlang plpgsql colloque

psql -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql -d colloque

psql -f /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql -d colloque

Pour ajouter les droits d’usage sur ces tables à l’utilisateur, saisir :

sudo –s –u postgres

psql colloque

ALTER TABLE geometry_columns OWNER TO colloque;

ALTER TABLE spatial_ref_sys OWNER TO colloque;

Création d’un serveur web virtualisé dédié au webmapping – partie 3

Dans cette partie, nous nous consacrerons à créer les alias permettant l’hébergement de sites web.


Pour héberger un site web, vous devez créer un espace dédié. Il s’agit en fait de créer un alias vers lequel toute requête http sera redirigée vers un répertoire du serveur, répertoire stockant les fichiers et scripts du site internet hébergé.

Cas d’étude

Exemple de la mise en place de répertoires et droits pour 3 sites web et 2 webmestres: Comment créer les espaces disques ainsi que les utilisateurs (les webmestres) pour ces sites?

Sites web:

  • http://site1/: dont les données stockées sur /var/www/site1
  • http://site2/: dont les données stockées sur /home/site-web/site2
  • http://site3/: dont les données stockées sur /home/site-web/site3

2 webmasters:

  • webmaster1: accès au site1 et site2,
  • webmaster2: accès au site2 et site3.

Création du site1

Créons le site1:

sudo -s
cd /var/www
mkdir site1
ls -la

Cette commande permet de voir que le dossier site1 a été créé mais avec les droits root:root.

Changeons le le propriétaire:

chown farah:www-data site1

Cette commande équivaut à:

chown farah site1
chgrp www-data site1
ls – la

Cette commande permet de voir que le dossier site1 a les droits passés à  farah:www-data

cd site1

Copions le fichier /var/www/index.html vers /var/www/site1/

cp ../index.html .

ls -la

On voit ici que index.html est root:root. Donnons les droits à farah sur le fichier

chown farah:www-data index.html
exit

Cette dernière commande, tout comme [CTRL]+[d] permet de se déconnecter de root

Éditons le fichier index.html

gedit index.html

Son contenu est:

<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
Ajouter dans la première ligne le mot Farah et enregistrer
<html><body><h1>It works! Farah</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>

Voir dans le navigateur le résultat à l’adresse suivante: http://localhost/site1/

L'alias vers site1 fonctionne

Remarque: si on retire les droits de lecture au groupe voici ce qui se passe

chmod 700 index.html
Le retrait des droits de lecture empêche Apache d'aller lire les fichiers de l'alias site1

On remet les droits par de lecture

chmod 644 index.html
Les droits ont été attribués normalement

A ce niveau, nous avons bien créé un espace web, mais l’adresse http://site1/ n’est pas encore fonctionnelle, seule l’adresse http://localhost/site1/ est opérationnelle. L’alias site1, n’est pas encore activé.

Création du site2

On décide de monter les autres sites dans un répertoire différent (par exemple, le disque / est plein, on doit donc monter un second disque dur qui aura comme rôle d’héberger tous les sites web /home/siteweb/

On créera le site2 dans ce répertoire /home/sitesweb/site2 et on utilise un lien pour pointer le site 2 vers les fichiers du site2 stockés sur /home/sitesweb/site2/

Positionnons nous rapidement sur le homedirectory par la commande:

cd

Créons le dossier site2 dans /home/sitesweb/

cd ..
sudo mkdir sitesweb
cd sitesweb
sudo mkdir site2

Cette dernière commande créée le répertoire site2 mais celui-ci appartient au groupe root

ls -la

donne pour le répertoire site2:

drwxr-xr-x  2 root root 4096 2010-03-16 15:33 site2

Il faut attribuer le dossier au groupe www-data

sudo chgrp www-data site2
ls -la

donne:

drwxr-xr-x  2 root www-data 4096 2010-03-16 15:33 site2

Le site2 appartient maintenant bien à www-data

Pour pouvoir consulter le site 2 depuis localhost, il faut créer un lien symbolique de /var/www/ vers /home/sitesweb/site2
cd /var/www
sudo ln -s /home/farah/sitesweb/site2 ./site2

Ici, on ne tape que ./site2 car on est déjà positionné dans /var/www/

ls -la

donne

lrwxrwxrwx  1 root    root       29 2010-03-16 15:40 site2 -> /home/sitesweb/site2/

Dans le navigateur http://localhost/site2/ donne ce qu’on attend bien:

L'alias site2 fonctionne, mais n'est pas sécurisé

Notez qu’il il faut ici sécuriser un minimum le serveur pour avoir un Forbidden (on verra plus tard).

On fait de même pour le site3

On créé ensuite 2 utilisateurs de nom « webmaster1 » et « webmaster2 »

sudo adduser  webmaster1
sudo adduser  webmaster2

Les alias avec Apache2

À supposer que nous disposions de la gestion des noms de domaine pour notre institut, nous souhaitons créer deux sites avec des noms de domaines que nous gérons.

Pour accéder au site web site2, on doit taper actuellement http://localhost/site2

Or, on veut accéder au site via l’url http://site2/ (site2  étant un domaine que nous gérons et dont nous contrôlons les DNS).

Éditons /etc/hosts

sudo gedit /etc/hosts

Dans le fichier, nous pouvons voir ce contenu notamment:

127.0.0.1 localhost
127.0.1.1 farah-laptop

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Ce qui est écrit dans les premières lignes, c’est que toute requete http://localhost/ ou http://farah-laptop renvoie vers la machine 127.0.0.1 soit le serveur lui même.

On ajoute donc les nouveaux sites:

  • 127.0.0.1         site1
  • 127.0.0.1         site2
  • 127.0.0.1         site3

Ce qui donne le fichier /etc/hosts suivant :

127.0.0.1 localhost
127.0.1.1 farah-laptop
127.0.0.1 site1
127.0.0.1 site2
127.0.0.1 site3

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Ainsi, toute adresse saisie dans un explorateur de type http://site3/ sera redirigée vers http://localhost/ (et non vers http://localhost/site3/ )

Attention, ceci n’est valable que sur la machine virtuelle (vu qu’on redirige vers localhost). Vu du réseau, la machine virtuelle doit être contactée par son adresse IP.

Pour rediriger http://site3/ vers  http://localhost/site3/ , il faut l’expliciter dans /etc/apache2/sites-available/ en copiant le fichier default et en créant un nouveau fichier du nom que l’on veut avoir, ici site3

On ajoute dans ce nouveau fichier l’alias par le code suivant en créant un nouveau fichier site1, site2 puis site3 sur la base du fichier default

On va dans le répertoire qui contient les site disponibles (sites-available)

cd /etc/apache2/sites-available/
sudo cp ./default ./site2

Dans cette précédente ligne, on copie le fichier default en un nouveau fichier site2 (il faut faire de même pour site1 et site3)

On édite le nouveau fichier, pour:

  • ajouter la ligne ServerName site2
  • modifier DocumentRoot /www/var/site2
  • modifier RootDirectory par /www/var/site2/

Ceci se fait par la commande:

sudo gedit site2

Le site2 est déclaré dans sites-available, il faut maintenant l’activer:

cd ../sites-enabled

On créé un lien symbolique pour activer le site site2 dans sites-enabled vers sites-available

sudo ln -s ../sites-availabled/site2

Enfin, il faut redémarrer le serveur web pour prendre en compte les modifications

sudo /etc/init.d/apache2 restart

Rappel: pensez à sécurisation le serveur Apache2

Référence biblio: http://doc.ubuntu-fr.org/tutoriel/securiser_apache2

Dans la partie 4, la dernière de ce tutoriel, nous verrons comment vérifier que le serveur fonctionne correctement. Pour cela, on fera un petit script php/html avec un brin d’Ajax pour que tout ça soit plus fun.

Création d’un serveur web virtualisé dédié au webmapping – partie 2

Installation du serveur web avec Apache2 et PostgreSQL

Dans Ubuntu, l’installation des logiciels se fait via APT ou APTITUDE.

Advanced Packaging Tool est un système complet et avancé de gestion de paquets, permettant une recherche facile et efficace, une installation simple et une désinstallation propre de logiciels et utilitaires. Il permet aussi de facilement tenir à jour votre distribution Ubuntu avec les paquets en versions les plus récentes et de passer à une nouvelle version de Ubuntu, lorsque celle-ci est disponible. Il prend en charge en termes de mise à jour, l’ensemble des logiciels qui sont installé par son intermédiare, ce qui rend ltout système Ubuntu très facile à maintenir au niveau des mises à jours de sécurité.

Les logiciels sont proposés sous forme de « paquets ».

Une interface graphique pour l’installation des logiciels existe. Il s’agit de Synaptic (accessible via le menu Système \ Administration \ Synaptic).

Nous allons installer le serveur web et ses différents composants par Synaptic et en lignes de commandes pour information.

Installation d’Apache2 (le serveur web)

Dans Synaptic, chercher « apache2 » puis cliquez droit sur le paquet apache2 et choisir « Sélectionnez pour installation ».

Synaptic va vous proposer d’installer un certain nombre d’autres paquets à installer, il s’agit des dépendances. Sans eux, Apache2 ne peut fonctionner correctement, vous devez donc les installer également. L’installation se déroule en deux parties: au début, Synaptic télécharge l’ensemble des paquets nécessaires pour Apapche2 puis les installe. Il peut arriver que durant la phase d’installation, Des questions vous soient posées (ce n’est pas le cas pour Apache2, mais ça l’est si vous installez par exemple MySQL). Cliquez sur « Appliquer » et valider jusqu’à la fin de l’installation.

Apache2 est installé et opérationnel.

Dans un navigateur de votre machine virtuelle, tapez http://localhost/ ou depuis votre machine hôte Windows tapez http://192.168.0.154/ (il faut en fait tapez l’adresse IP de votre VM Ubuntu trouvée grâce à la commande ifconfig).

Pour qu’Apache puisse exécuter des scripts PHP, il faut également installer le paquet PHP5.

Pour la forme, nous allons lancer cette installation en ligne de commande. Dans une console, tapez:

sudo aptitude update

La liste des paquets disponibles est mise à jour.

Notez que la commande:

sudo aptitude upgrade

… installe tous les nouveaux paquets (cela force votre système à se mettre à jour).

Recherchons tous les paquets avec le nom php

sudo aptitude search php

On voit que le paquet php5 est disponible. Installons le avec la commande:

sudo aptitude install php5

Votre serveur web Apache2 et le moteur de script PHP5 est opérationnel.

Installation de PostgreSQL, PostGIS et pgAdminIII

Nous allons installer PostgreSQL et son module spatial PostGIS en ligne de commande (décidément, nous nous enfonçons dans le purisme linuxien…):

Tapez dans une console:

sudo aptitude search postgres

Nous allons installet la version 8.3 de PostgreSQL et PostGIS d’un même coup grâce au paquet postgres8.3-postgis. Tapez dans la console:

sudo aptitude install postgresql-8.3-postgis

Notez que pour l’installation d’une base de données MySQL, il faut renseignez durant l’installation les différentes options. La version 8.4 est, au 17 juin 2010 disponible via le paquet postgresql-8.4-postgis

Installons maintenant l’interface graphique pgAdminIII permettant de gérer en mode graphique PostgreSQL. Dans la console, tapez:

sudo aptitude install pgadmin3

PgAdmin III est accessible depuis le menu Application / Programmation

Pour pouvoir utiliser les fonctions Postgresql natives dans PHP, il faut installer également, le paquet php5-pgsql depuis synaptic ou en ligne de commande par aptitude

sudo aptitude install php5-pgsql

L’installation de PostgreSQL et la configuration d’Apache2 est achevée.

Création d’un utilisateur sous PostgreSQL

Nous allons créer un utilisateur avec un rôle d’administrateur de la base de données. Il sera nommé formation, son mot de passe sera aussi formation. En ligne de commande, dans une console, tapez:

sudo -s -u postgres
psql
CREATE USER formation ;
ALTER ROLE formation WITH createdb ;
ALTER USER formation WITH encrypted password 'formation' ;
\q

Création d’une base de données sous PostgreSQL

Nous allons créer une base de données nommée formation pour l’utilisateur précédemment créé:

CREATE DATABASE formation OWNER formation ;

Lancer pgAdmin III et créer une nouvelle connexion avec les données suivantes:

  • Hôte: localhost
  • port TCP: 5432
  • Base de maintenance: postgres
  • Utilisateur: formation
  • Mot de passe: formation

Vous avez alors accès à tout ce qui est nécessaire pour gérer votre propre base de données PostgreSQL.

Gérer le super utilisateur de votre serveur de base de données Postgresql

Par défaut le mot de passe du gestionnaire de base de données (utilisateur nommé « postgres ») est celui de l’utilisateur sudo d’Ubuntu.

Il est très fortement conseillé, en production, de choisir un mot de passe différent.

Pour cela, tapez :

sudo -s -u postgres
psql
ALTER USER postgres WITH encrypted password ‘lenouveaumotdepasse’ ;
\q

Remarque : Le fait d’attribuer (ou de forcer si vous voulez…) un mot de passé different du sudo d’Ubuntu, vous permet d’utiliser l’utilisateur postgres via l’interface graphique pgAdminIII. Si vous n’avez pas attribué un mot de passe à postgres (donc si vous utiliser pour vous connecter à postgres le mot de passe sudo), alors vous ne pourrez vous connecter via pgAdminIII à votre serveur postgresql.

Remarque : si vous devez donner des droits à un utilisateur tiers sur une base de donnée et que cet utilisateur n’est pas le propriétaire de la base de données en question, vous devez alors, en tant qu’utilisateur ‘postgres’, créer un rôle de groupe, puis spécifier que le rôle (de l’utilisateur, dit rôle de connexion) appartient au rôle de groupe. Enfin il faut donner les droits d’usage (SELECT ou INSERT ou …) de la base de façon générale (clic droit sur « Propriétés… » de la base), ou des tables (clic droit sur « Propriétés… » de Tables (xxx)), ou d’une table (clic droit sur « Propriétés… » de la table) au groupe de rôle et tout ceci directement depuis l’interface de PgAdminIII.


Dans la partie 3, nous verrons comment mettre en place les sites web (les alias)

Création d’un serveur web virtualisé dédié au webmapping – partie 1

Février 2010, avec l’un de mes collègues du Cirad Alain Clopès, j’ai donné un cours sur la création d’un serveur web virtualisé dédié au webmapping. Alors, autant que ça serve à d’autres, voici un petit topo du cours.

Nous allons mettre en œuvre un serveur web fonctionnant sous Linux (avec Ubuntu 9.10 Karmic Koala) virtualisé sous Windows XP à l’aide du logiciel gratuit VirtualBox de Sun MicroSystem.

Il s’agit ici de se créer un environnement de développement avec les serveurs installés sur une machine virtuelle pour ne pas ralentir sa machine lorsqu’on ne développe pas. La sécurisation réalisée dans ces notes est donc extrêmement faible. Vous devez, pour un serveur en production, impérativement consulter les ressources disponibles sur internet (notamment sur http://doc.ubuntu-fr.org/tutoriel/securiser_apache2 pour sécuriser votre serveur web correctement).

Installation d’une machine virtuelle de type Linux

Logo Virtualbox

Sous Windows, installer VirtualBox (dans notre cas, en version 3.1.4). De nombreux tutoriels existent pour l’installation de VirtualBox couplée à une installation d’Ubuntu. Recherchez en un avec Google si nécessaire (mots clé: tutoriel VirtualBox Ubuntu)

Télécharger la dernière version de Ubuntu (http://www.ubuntu-fr.org/telechargement, il faut récupérer un fichier iso de Ubuntu 9.10 par exemple mais il n’est pas nécessaire de la graver sur un support optique, VirtualBox va se charger d’émuler grace à ce fichier iso, un CD-ROM)

Dans VirtualBox, créez une machine virtuelle de type Linux Ubuntu, avec un disque dur virtuel d’au minimum 10Go. Vous pouvez également créer un disque dur virtuel dynamique.

A ce stade, les ressources clavier et souris sont capturées par la machine virtuelle lorsque vous cliquez dans celle-ci. Pour récupérer la souris dans Windows, il faut utiliser la touche [CTRL] droite qui désactive la capture. Cette touche [CTRL] droite est la touche ressource dans VirtualBox pour tout ce qui concerne les fonctions « facilitatrices » de VirtualBox.

Après l’installation d’Ubuntu, lancez les mises à jours qui sont nécessaires. Il se peut que le système vous demande de redémarrer la machine virtuelle.

Installation des VBoxGuestAdditions

Afin de rendre plus agréable l’utilisation conjointe de Windows XP et d’une machine virtuelle, VirtualBox propose d’installer un ensemble d’utilitaires appelés VBoxGuestAdditions. Pour cela, montez le disque iso nommé VboxGuestAddition.iso accessible depuis le menu « Périphériques/Périphériques optiques » de votre machine virtuelle.

Pour information, ce fichier iso se situe dans le répertoire d’installation de VirtualBox (C:/Program Files/Sun/VirtualBox). Un CD apparaît sur le bureau d’Ubuntu. Ne le lancez pas comme il vous l’est proposé (en fait, ce CD n’est pas bootable, cela ne servirait à rien).

Dans Ubuntu, dans la console (menu Application/Accessoires/Terminal), installez les VBoxGuestAddition par la commande suivante:

sudo /media/cdrom/VBoxLinuxAddition-x86.run

La commande sudo permet d’exécuter le script en mode superutilisateur (Super Utilisateur Do).

Après avoir redémarré, il n’est plus utile d’utiliser la touche [CTRL] droite pour récupérer dans Windows la souris ou le clavier. C’est l’un des grands avantages des VBoxGuestAdditions. Vous pouvez également passer en mode plein écran. Par exemple [CTRL]  + [F] (fait passer ou sortir la machine virtuelle en mode plein écran ). [CTRL]  + [G] permet par exemple d’ajuster la taille de l’écran automatiquement.

Partage de ressource de type disques durs et répertoires

Pour partager une ressource disque de Windows vers votre Ubuntu virtualisé, créez un répertoire partagé (menu Périphérique/Répertoires partagés). Partagez en accès complet par exemple votre disque D: de Windows XP (utilisez par exemple le nom de partage donné par défaut D_DRIVE.

Sous Ubuntu, créez, par exemple sur votre Bureau, un nouveau dossier (ce sera le dossier avec lequel nous accèderons à votre disque dur D: partagé sous le nom de D_DRIVE). Nommez ce dossier explicitement, par exemple DISQUE_D_WINDOWS sur le bureau et dans une console, tapez cette ligne de commande:

sudo mount -t vboxsf /home/farah/Bureau/D_DRIVE DISQUE_D_WINDOWS

Après cette commande, en le dossier du bureau nommé  DISQUE_D_WINDOWS, vous aurez accès à votre disque dur D: en lecture et écriture (faites d’ailleurs attention…)

Pour rendre permanent le partage de ressources, il faut éditer le fichier rc.local par la commande

sudo gedit /etc/init.d/rc.local

et ajouter la ligne suivante en fin de fichier

mount –t vboxsf D_DRIVE /home/farah/Bureau/DISQUE_D_WINDOWS

Rendre accessible depuis votre réseau votre machine virtuelle Ubuntu

VirtualBox configure par défaut les machines virtuelles en mode NAT, c’est-à-dire que la machine virtuelle Ubuntu (VM) accède au LAN (le réseau local) à travers la machine hôte par un routage NAT. La machine virtuelle partage donc l’adresse IP de la machine hôte. Internet est accessible depuis votre VM Ubuntu, mais votre VM Ubuntu n’est pas accessible depuis votre réseau local.

Confirmons cela: dans la console Ubuntu, trouvez votre adresse ip (de votre contrôleur réseau eth0) par la commande:

ifconfig

La réponse a ce format:

eth0      Link encap:Ethernet  HWaddr 08:00:27:2d:23:17
inet adr:10.0.2.15 Bcast:192.168.0.122  Masque:255.255.255.0
adr inet6: fe8c::ac0:27fc:fa2d:2317/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
Packets reçus:451 erreurs:0 :0 overruns:0 frame:0
TX packets:118 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
Octets reçus:58668 (58.6 KB) Octets transmis:19732 (19.7 KB)
Interruption:10 Adresse de base:0xd020

Votre adresse IP est signalée en rouge ci-dessus. On voit que l’adresse IP de votre machine virtuelle est de la forme 10.0.2.15. Sous Windows exécutez la console par la commande (menu Démarrer/Exécuter…):

cmd

puis  pinguez votre machine virtuelle par la commande windows:

ping 10.0.2.15

L’adresse n’est pas pinguable… votre machine virtuelle n’est donc pas accessible depuis votre machine hôte (ici Windows XP ou Vista) et d’une façon générale, depuis votre réseau local.

Passage du réseau du mode « NAT » en mode « Pont réseau »:

Pour rendre accessible votre MV Ubuntu, il faut modifier les préférences de la machine virtuelle dans VirtualBox et passer de mode réseau NAT à mode « Accès par pont ». Arrêtez votre machine virtuelle et allez dans ses préférences depuis VirtualBox. Dans l’onglet réseaux, choisissez le mode « Accès par un pont réseau » et choisissez la carte réseau par laquelle la machine hôte est connectée au réseau local. La machine virtuelle sera alors vue par le routeur du réseau comme une machine à part entière, avec une adresse MAC propre, et votre VM Ubuntu récupèrera du DHCP (s’il existe) une adresse « normale ». S’il n’y a pas de DHCP, il vous faudra attribuer à votre VM Ubuntu une adresse IP (masque et DNS) que vous donnera votre administrateur réseau

Relancez votre machine virtuelle Ubuntu et confirmez que votre machine est accessible depuis le réseau local.

Dans la console Ubuntu, trouvez votre adresse ip (de votre contrôleur réseau eth0) par la commande:

ifconfig

La réponse a ce format:

eth0      Link encap:Ethernet  HWaddr 08:00:27:2d:23:17
inet adr:192.168.0.154 Bcast:192.168.0.255  Masque:255.255.255.0
adr inet6: fe80::a00:27ff:fe2d:2317/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
Packets reçus:451 erreurs:0 :0 overruns:0 frame:0
TX packets:118 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
Octets reçus:58668 (58.6 KB) Octets transmis:19732 (19.7 KB)
Interruption:10 Adresse de base:0xd020

Votre adresse IP est signalée en rouge ci-dessus. On voit que l’adresse IP de votre machine virtuelle est maintenant de la forme 192.168.0.154. Sous Windows exécutez la console par la commande (menu Démarrer/Exécuter…):

cmd

puis  pinguez votre machine virtuelle par la commande windows:

ping 192.168.0.154

L’adresse est accessible !!! Votre machine virtuelle est accessible depuis votre réseau local et répondra, par exemple, une fois un serveur web créée, à toute requête de type http://192.168.0.154/

Nous avons à ce niveau une machine, soit virtuelle, mais qui se comporte exactement comme n’importe quelle autre machine du réseau local, comme n’importe quel serveur…

A partir de maintenant, toutes les commandes ci-dessous se réaliserons uniquement sous la machine virtuelle Ubuntu.

Virtualbox en action: Ubuntu, Ubuntu tournant sous Windows Seven

Petits rappels sur Linux:

La commande man dans une console, donne l’aide d’un programme. Exemple:

man crontable

Pour sortir de l’aide, taper

:q

D’autres méthodes permettent d’obtenir l’aide d’une commande, notamment le – – help

ln --help

Voir les processus:

sudo ps -e

Les droits sur Linux

Une référence: http://www.ac-creteil.fr/reseaux/systemes/linux/debian/deb-tp-droits.html

Une autre référence: http://www.tuteurs.ens.fr/unix/droits.html

L’utilisateur par défaut sur serveur web apache sera nommé www-data. Il appartiendra au groupe www-data (noté www-data:www-data).

Un utilisateur appartient forcément à un groupe. Il peut être seul dans son propre groupe. Un groupe peut avoir plusieurs utilisateurs. Un utilisateur peut être dans plusieurs groupes.

La commande chmod modifier les droits. La commande suivante les droits d’exécution à tout le monde:

chmod a+x /mondossier

Elle est l’équivalement des 3 commandes suivantes:

chmod u+x /mondossier
chmod g+x /mondossier
chmod o+x /mondossier

… ce qui est aussi l’équivalent de

chmod 711 /mondossier

Ajout d’un utilisateur:

Cette commande créée l’utilisateur et le groupe s’il n’existe pas ainsi que le répertoire /home/toto/

sudo adduser toto:totogr

Arborescence des fichiers linux

Rappel rapide sur l’arborescence des fichiers linux (avec en mémoire cet adage: sous Linux, tout est fichier):

/   (c'est la racine )
|---boot (noyaux linux nécessaires au démarrage de la machine)
|---etc (contient tous les fichiers de configuration)
|---bin (contient tous les exécutables et utilitaires de Linux)
|---usr (contient le bazar utilisateurs compléments au répertoire bin)
|---|---bin
|---|---local / bin
|---|---lib
|---└---sbin (c'est là où il y apache notamment)
|---home (c'est le homedirectory : les données utilisateur y sont
|                 stockées)
|---|---farah           (répertoire perso de Farah)
|---└---abderrazzak     (répertoire perso d'Abderrazzak)
|---var (contient la messagerie, les mails arrivant, partants,
|   |             les spool d'impression, les logs système, ...)
|---|---www (fichiers affichés à la racine du serveur
|   |                   ex: http://localhost/ )
|---|---mail (les mails entrants, sortants, ..)
|---|---spool
|---└---log

Enfin, si vous avez une longue série de commande en sudo à taper, passer en sudo permanent (attention, d’une façon générale, c’est déconseillé) par la commande:

sudo -s

Prochaine étape, la partie 2: Serveur web Apache et PostgreSQL