Configurer LAMP et Virtual Hosts [Apache2]

Demandez et postez vos petites astuces, répertoire des tutoriels et astuces
Verrouillé
Avatar du membre
cyrille
Messages : 2931
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nord - Avesnois
Contact :

Configurer LAMP et Virtual Hosts [Apache2]

Message par cyrille » jeu. 2 mai 2019 19:39

Utilisation des Virtuals Hosts sous Apache 2 et configuration Serveur LAMP local.

Sous Mint 18 / 19.

Attention :
Tuto de base, aucune notion de sécurité n'est abordée, ce n'est pas un tutorial pour transformer son PC en serveur WEB pour la toile, qu'on soit bien d'accord, juste pour apprendre les bases de fonctionnement d'APACHE2.

OBJECTIF : installer un serveur LAMP (Apache, MySQL, PHP), fonctionnel afin de pouvoir faire du développement local et tester ses sites avant de les publier sur son serveur internet ou pour apprendre un langage orienté côté serveur (style php ou autre). Apprendre la configuration de base d' APACHE2.

PLAN
1. Installer un serveur LAMP
2. Configurer le répertoire de publication web local
3. Configurer les Virtuals hosts
4. Editer et configurer le fichier /etc/hosts
5. Le module php
6. La base de données : mysql
7. Gérer la base de données : Phpmyadmin / adminer
8. Au sein de son réseau local


1. Installer le LAMP

Dans cet exemple, le réseau local est derrière une box et est géré en 192.168.0.*
L'IP local du serveur est fixe : 192.168.0.35
(à adapter à votre réseau / besoins)

Code : Tout sélectionner

sudo aptitude install apache2 php libapache2-mod-php mysql-server php-mysql
[sudo] Mot de passe de libres09 : 
Les NOUVEAUX paquets suivants vont être installés :     
  apache2 apache2-bin{a} apache2-data{a} apache2-utils{a} libaio1{a} libapache2-mod-php libapache2-mod-php7.0{a} libapr1{a} libaprutil1{a} 
  libaprutil1-dbd-sqlite3{a} libaprutil1-ldap{a} libevent-core-2.0-5{a} liblua5.1-0{a} mysql-client-5.7{a} mysql-client-core-5.7{a} mysql-common{a} 
  mysql-server mysql-server-5.7{a} mysql-server-core-5.7{a} php php-common{a} php-mysql php7.0{a} php7.0-cli{a} php7.0-common{a} php7.0-fpm{a} 
  php7.0-json{a} php7.0-mysql{a} php7.0-opcache{a} php7.0-readline{a} 
Les paquets suivants sont RECOMMANDÉS mais ne seront pas installés :
  libhtml-template-perl 
0 paquets mis à jour, 30 nouvellement installés, 0 à enlever et 99 non mis à jour.
Il est nécessaire de télécharger 25,1 Mo d'archives. Après dépaquetage, 186 Mo seront utilisés.
Voulez-vous continuer ? [Y/n/?] y
On répondra à l'installation du serveur MySQL en fournissant un mot de passe et un login
Image

A ce stade, on doit accéder à la configuration par défaut d'Apache2 (message d'accueil pour dire que tout fonctionne)

Via un navigateur, saisir
http://localhost/
http://127.0.0.1/
http://IP-DU-POSTE/ , ici http://192.168.1.35/

Image
Image
Image

Reste maintenant à créer nos sites....




2. Configurer le répertoire de publication web local


Une fois le serveur installé, on va le configurer pour qu'il gére 2 sites internet différents (méthode identique pour plus ou pour moins ; il suffira de réitérer ces entrées).

Les répertoires racines de ces sites seront situés dans /var/www/LeNomDuSite/public_html
(ce qui laissera possible une évolution par la suite avec la création d'une partie private_html ;), on verra si j'ai le courage de faire un autre tuto....

On crée la structure :

Code : Tout sélectionner

sudo mkdir -p /var/www/site-1.com/public_html
sudo mkdir -p /var/www/site-2.com/public_html
On leur donne les droits pour que notre user puisse écrire dedans (ici, ils appartiennent les 2 à l'user libres09 (à adapter à votre configuration) :

Code : Tout sélectionner

sudo chown -R libres09: /var/www/site-1.com
sudo chown -R libres09: /var/www/site-2.com
(si plusieurs utilisateurs doivent gérer les mêmes sites, préférer une méthode basée sur un groupe commun (exemple, créer un groupe www-data et collez ici les utilisateurs, puis modifier en conséquence les droits)


Dans chacun de ces sites, on va y placer les fichiers d'accueil suivants

Code : Tout sélectionner

$ cat /var/www/site-1.com/public_html/index.html 
<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <title>Site 1</title>
  </head>
  <body>
    <h1>Cool, site 1 disponible :)</h1>
  </body>
</html>

Code : Tout sélectionner

$ cat /var/www/site-2.com/public_html/index.html 
<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <title>Site 2</title>
  </head>
  <body>
    <h1>Cool, site 2 disponible :)</h1>
  </body>
</html>
Il s'agit juste d'une page html pour annoncer que ça fonctionne.

3. Configurer les Virtuals hosts

La configuration des Virtual Hosts se fait dans ce répertoire /etc/apache2/sites-available/
Les fichiers créés doivent obligatoirement se terminer par l'extension .conf
Pour une meilleure lisibilité, les fichiers de configuration porteront le même nom que les sites locaux.

On crée 2 fichiers de conf nouveau

Code : Tout sélectionner

$ cd /etc/apache2/sites-available/
$ sudo touch site-1.com.conf  site-2.com.conf
Avec le contenu suivant :

Code : Tout sélectionner

$ cat site-1.com.conf
<VirtualHost *:80>
    ServerName site-1.com
    ServerAlias www.site-1.com
    ServerAdmin webmaster@site-1.com
    DocumentRoot /var/www/site-1.com/public_html

    <Directory /var/www/example.com/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

Code : Tout sélectionner

$ cat site-2.com.conf 
<VirtualHost *:80>
    ServerName site-2.com
    ServerAlias www.site-2.com
    ServerAdmin webmaster@site-2.com
    DocumentRoot /var/www/site-2.com/public_html

    <Directory /var/www/example.com/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

Une fois créé, ces fichiers doivent être activés, il s'agit juste d'un lien symbolique de ce répertoire vers le répertoire /etc/apache2/sites-enabled/

Code : Tout sélectionner

$ ls -l /etc/apache2/sites-enabled/
total 0
lrwxrwxrwx 1 root root 35 mai    1 15:16 000-default.conf -> ../sites-available/000-default.conf
lrwxrwxrwx 1 root root 34 mai    1 14:35 site-1.com.conf -> ../sites-available/site-1.com.conf
lrwxrwxrwx 1 root root 34 mai    1 15:00 site-2.com.conf -> ../sites-available/site-2.com.conf
Les distributions basées sur DEBIAN disposent d'outils afin de réaliser cordialement cette opération

Code : Tout sélectionner

a2disconf  a2dismod   a2dissite  a2enconf   a2enmod    a2ensite   a2query 
Les utilitaires avec dis sont à utiliser pour désactiver et les en pour activer les conf, modules ou sites

Donc pour activer nos 2 sites

Code : Tout sélectionner

$ sudo a2ensite site-1.com
Enabling site site-1.com.
To activate the new configuration, you need to run:
  service apache2 reload

Code : Tout sélectionner

$ sudo a2ensite site-2.com
Enabling site site-2.com.
To activate the new configuration, you need to run:
  service apache2 reload
Dès lors activés, on recharge la configuration d'Apache pour qu'ils soient pris en compte

Code : Tout sélectionner

$ sudo service apache2 reload
On peut aussi redémarrer le service entier

Code : Tout sélectionner

$ sudo systemctl restart apache2
Les sites sont activés mais si vous essayez de vous y connecter, vous allez taper dans des sites extérieurs (normal la requête tapera dans les DNS d'internet). Dernère étape donc, demander à votre système de rester en local pour ces sites et c'est le rôle du fichier /etc/hosts

4.Editer et configurer le fichier /etc/hosts

Code : Tout sélectionner

$ cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	libres09-Latitude-E6410

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Ce fichier devrait plus ou moins être comme celui-ci.

Il suffit d'ajouter nos 2 virtuals hosts pour que toutes requêtes sur ceux-ci restent en local.

On ajoutera donc ces 2 ligne avec la ligne 127.0.0.1 localhost

Code : Tout sélectionner

127.0.0.1	site-1.com  
127.0.0.1	site-2.com 
Ce qui donnera

Code : Tout sélectionner

cat /etc/hosts
127.0.0.1	localhost
127.0.0.1	site-1.com  
127.0.0.1	site-2.com  
127.0.1.1	libres09-Latitude-E6410

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Dernières choses : si un test dans le navigateur ne procure pas le résultats attendu, penser à vider le cache de celui-ci.

Image

5. Le module PHP
Bien sûr, Apache c'est cool, mais l'enjeu reste le développement PHP pour la plupart d'entre eux nous
(tous les autres langages peuvent être utilisés également, mais ici nous ne parlerons que de PHP).

On va reprendre le premier site créé et on va créer un fichier php tout simple

Code : Tout sélectionner

$ cat  /var/www/site-1.com/public_html/index.php
<?php
phpinfo();
?>
(PS ce fichier affichera la configuration de votre module php, lisez le attentivement, il y a plein d'informations importantes)

Allez sur le site : http://site-1.com/
Et c'est toujours l'ancienne page qui s'affiche, normal les pages html sont prioritaires sur les pages php.
Donc pour l'avoir : http://site-1.com/index.php

Si vous voulez que le fichier d'index php soient constamment prioritaires au fichier d'index html, il suffit d'ajouter cette option dans le virtual hosts en question sous l'entrée DocumentRoot

Code : Tout sélectionner

    DirectoryIndex index.php  


Si besoin de modifier les options de configuration de php, ça se passe là

Code : Tout sélectionner

$ cat /etc/php/7.0/apache2/php.ini 
Penser à relancer Apache pour la prise en compte.

Recharger la configuration d'apache

Code : Tout sélectionner

$ sudo service apache2 reload
Et dès http://site-1.com/ affichera le fichier index.php et non index.htm
Image

6. La base de données mysql
Elle a été installée et configurée lors de l'installation du LAMP

La commande suivante vous donnera sa version.

Code : Tout sélectionner

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using  EditLine wrapper
Pour l'instant, on ne peut lui parler qu'avec la console

Code : Tout sélectionner

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.26-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
A cette invite, quelques commandes de base

show databases vous montrera les bases
use databasename en sélectionnera une
show tables vous montrera les tables d'une base,
etc... tout est dans la doc...


Exemples : liste les tables :

Code : Tout sélectionner

mysql> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0,00 sec)

On sélectionne celle nommée mysql

Code : Tout sélectionner

mysql> use mysql ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
On regarde à l'intérieur

Code : Tout sélectionner

mysql> show tables ;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
31 rows in set (0,00 sec)
(on peut passer des requêtes SQL via cette console mais je doute que ça intéresse grand monde)

Mais c'est trivial, je l'accorde.

On va donc utiliser une interface graphique qui fera l'interprête ;). Et phpmyadmin pointe le bout de son nez ;)

7. Gérer la base de données : phpmyadmin et adminer

Code : Tout sélectionner

$ sudo aptitude install phpmyadmin 
Image
Image
Image

Et pour s'y connecter
http://localhost/phpmyadmin
Image
Image


Pour les allergiques à phpmyadmin, il existe une alternative : adminer
Tout simple

Code : Tout sélectionner

sudo aptitude install adminer
Pour on le charge dans la conf d'Apache

Code : Tout sélectionner

echo "Alias /adminer.php /usr/share/adminer/adminer/index.php" | sudo tee /etc/apache2/conf-available/adminer.conf
On l'active

Code : Tout sélectionner

sudo a2enconf adminer.conf
Et on relance le serveur....

Image
Image




8. Au sein de son réseau local
Reste maintenant à configurer le réseau local pour accéder au serveur LAMP de ce poste.
Bien entendu, il est préférable que ce poste ait une IP fixe.
Il suffit pour avoir la page par défaut du virtual issue de l'installation de saisir l'IP de ce poste.

Ici, on saisira
http://192.168.0.35
Image
Sur la capture d'écran on voit bien que le client (http://192.168.0.11/)a une réponse positive du serveur (http://192.168.0.35/)qui lui renvoie la page par défaut.

Bon mais pour les virtuals hosts qui hébergent les sites site-1.com et site-2.com ?
Il suffit simplement de modifier les fichiers /etc/hosts du client de cette manière et le tour est joué.

Code : Tout sélectionner

root@asgard-freeBSD:~ # 
::1			localhost localhost.my.domain
127.0.0.1		localhost localhost.my.domain
192.168.0.35 		site-1.com
192.168.0.35		site-2.com
Image
Image

Au fait, vous avez compris que le fichier /etc/hosts propose un routage interne donc mettez des noms de sites explicites qui n'existent pas sur la toile, style .local, sinon vous risquez de ne plus accéder à ces sites ;)

Pour toutes réactions, commentaires, avis , ne pas utiliser ce thread mais celui ci :
viewtopic.php?f=12&t=13035
# Me : DELL Lat E5430, SSD, 64-bit, RAM 8Go [ FreeBSD 12.0, xfce / Openbox ; DEBIAN SID via VirtualBox] | E7440, SSD, amd64, RAM 8Go [ DEBIAN SID, xfce]
# Me : VPS : 1 vCore 2 GHz , SSD, RAM 2Go, Local RAID, DEBIAN STABLE https://cbiot.fr
# Work : Serveur HP ProLiant ML 310e Gen 8 v2, DEBIAN STABLE | Parc DELL Lat E6* LINUX MINT, 18.3 Sylvia, amd64, XFCE.

All you need : #!/bin/bash | SVP les chiants pas de MP...

Verrouillé