Systemes-reseaux ( 35 articles - Voir la liste )

Astuce Qui utilise le port ?

Sous Windows, pour savoir quel processus utilise un port, lancez la commande Get-Process dans Powershell :

Exemple pour le port 5433 :

Get-Process -Id (Get-NetTCPConnection -LocalPort 5433).OwningProcess

Astuce Analyser l’occupation de l’espace disque

Sous Linux, l’utilitaire ncdu (pour NCurses Disk Usage) permet de trouver quel fichier ou répertoire vous bouffe tout votre espace disque.

Il est disponible sur les dépôts officiels Debian et Ubuntu et donc facile à installer.

sudo apt install ncdu
ncdu

Note : ncdu a été réécrit dans une v2 encore récente. Selon la version des dépôts, c’est peut-être la v1 qui sera installée.

Erreur Docker écrase le réseau VPN

Lorsque docker crée des réseaux virtuels entre ses conteneurs, il utilise des plages IP.
En général pas de problème, il utilise des plages non couramment utilisées.

Par contre, si ses plages habituelles ne sont pas disponibles (ou pour d'autres raisons ?), il est possible qu'il en utilise une autre, par exemple 192.168.x.x.
Cela peut alors être problématique, surtout si vous utilisez un VPN ou des ressources réseaux en parallèle, car cette plage est classiquement utilisée. On peut alors avoir un conflit d'adressage et les ressources réseaux ou du VPN peuvent ne plus être accessibles.

Pour corriger ça, une première approche consiste à killer le réseau (créé par docker) qui pose problème puis à le recréer.
Pour cela :

# Listage des réseaux créés par docker
docker network list

# Identifiez le réseau correspondant au conteneur qui a causé le problème (copiez son ID)
# Pour vérifier la plage IP qu'il utilise :
docker network inspect <ID>

# Suppression du réseau qui pose problème
docker network rm <ID>

Si cela ne suffit pas, essayez la suite de la procédure proposée ici.

Astuce Bypasser un runlevel

Pendant le lancement du système, des services sont démarrés.
L'ordre de lancement a une importance, car beaucoup de services ont besoin d'autres services pour fonctionner.

Sous linux il y a donc la notion de runlevel (cf. wikipédia). Les runlevels (niveau d'exécution) vont de 0 à 6 et se font un à un dans l'ordre croissant.

Il arrive qu'une erreur se produise lors du lancement d'un service à un certain runlevel, bloquant ainsi le démarrage.
Il est possible de forcer le passage au niveau suivant, même si tout n'est pas encore terminé.

Pour cela appuyez sur les touches suivantes durant l'initialisation : CTRL + ALT + F<NIVEAU>
Avec <NIVEAU> le niveau de runlevel vers lesquels passer (ex: CTRL + ALT + F4 pour passer au niveau 4).

Astuce Supprimer les images/conteneurs/volumes docker

Pour supprimer tous les conteneurs docker :

docker rm $(docker ps -a -q)

Pour supprimer toutes les images docker :

docker rmi $(docker images -q)

Pour supprimer tous les volumes docker :

docker volume prune

Astuce Savoir quel processus utilise un port

Sous Linux, vous pouvez utiliser la commande suivante pour savoir quel processus utilise un port :

# Pour le port 80
netstat -tlnp | grep 80

Cela retournera par exemple :

tcp6       0      0 :::80                   :::*                    LISTEN      32198/apache2

L'ID du processus étant ici 32198.

Remarque : Pour voir tous les processus, il sera peut-être nécessaire de lancer la commande en tant que root (ou avec sudo).

Astuce Virtual host avec contexte d'URL

Si vous voulez accéder à votre application via un contexte spécifique, il faut ajouter cette ligne dans votre virtual host apache :

Alias /mon-contexte /chemin/vers/mon_appli/web

Si votre virtual host répond au nom de domaine www.mon-site.com par exemple, votre site sera maintenant accessible via l'URL www.mon-site.com/mon-contexte.

Astuce Installation de PHP

Installation

PHP et ses extensions

Pour installer la version de PHP disponible par défaut sur le dépôt (PHP 5.6 pour Debian 8), procédez comme suit. Pour installer PHP 7, suivez cet article à la place.

  • Installez PHP via le gestionnaire de paquets :
sudo apt-get install libapache2-mod-php5
  • Installez les extensions dont vous avez besoin. Probablement au moins gd, mcrypt, php-pear, intl :
sudo apt-get install php5-gd php5-mcrypt php-pear php5-intl

Pour curl, il s'agit du paquet php5-curl.

Configuration de PHP

  • Modifiez le fichier /etc/php5/apache2/php.ini. À la fin de la section [Miscellaneaous], ajoutez la ligne suivante pour spécifier la locale à utiliser :
date.timezone = "Europe/Paris"
  • Redémarrez Apache :
sudo service apache2 restart

Vérification

  • Supprimez le fichier index.html de votre site (ex : /var/www/mon-site/index.html) et créez le fichier index.php à la place :
<?php
phpinfo();
?>
  • Appelez l'URL de votre site et vérifier qu'Apache vous retourne bien toute la configuration de PHP.

Composer

Si vous avez besoin de Composer, installez-le via ces commandes :

sudo apt-get install curl 
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer 

# Vérification
composer --version

Astuce Installation de PostgreSQL

Remarque :

Si vous préférez MySQL, vous pouvez suivre ce tutoriel à la place.

Il vous faudra peut-être également ajouter la ligne suivante au fichier /etc/apache2/apache2.conf puis redémarrer Apache :

Include /etc/phpmyadmin/apache.conf

Installation

  • Exécutez simplement la commande suivante :
sudo apt-get install postgresql postgresql-client postgresql-doc
  • Vérifiez votre version de postgres (ex: 9.4)
    ls /etc/postgresql/
  • Forcez postgreSQL à utiliser l'UTF-8. (Adaptez les commandes suivantes avec la bonne version) :
sudo  pg_dropcluster --stop 9.4 main
sudo  pg_createcluster --start -e UTF-8 9.4 main

Configuration générale

Connexion distante

Par défaut, PostgreSQL n'est pas accessible à distance (ex: avec votre IDE sur votre poste de dev).

Pour l'autoriser, modifiez le fichier le fichier de configuration /etc/postgresql/<version>/main/pg_hba.conf, en remplaçant la ligne suivante par celle du dessous :

#local   all         all                               peer
local   all         all                               trust

Redémarrez le service postgresql :

sudo /etc/init.d/postgresql reload

Adminer

Quand on utilise MySQL, on le couple souvent avec PHPMyAdmin, pour pouvoir l'administrer via une interface web. Côté PostgreSQL, il n'y a pas d'outil aussi abouti.

Adminer ne s'en tire tout de même pas si mal. D'ailleurs, il permet aussi de se connecter à plein d'autres SGBD, dont MySQL.

Pour l'installer, suivez les commandes suivantes :

sudo mkdir /var/www/adminer
sudo cd /var/www/adminer
sudo wget https://www.adminer.org/latest.php
sudo mv latest.php index.php
sudo chown -R phpuser:phpuser .

Ensuite si vous utilisez les virtual host pour votre site, ajoutez-en un pour adminer. Pour cela créez par exemple le fichier /etc/sites-available/adminer.conf :

<VirtualHost *:80>
    ServerName db.adminer.dev
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/adminer

    ErrorLog ${APACHE_LOG_DIR}/adminer.error.log
    CustomLog ${APACHE_LOG_DIR}/adminer.access.log combined
</VirtualHost>

Remarques :

  • Vous pouvez bien sur adapter ces configurations, en particulier le nom de domaine db.adminer.dev.
  • Vous devrez probablement ajouter ce nom de domaine dans le fichier hosts de votre poste de dev pour pouvoir l'utiliser.

Activez maintenant ce virtual host et redémarrez Apache :

sudo a2ensite adminer
sudo service apache2 reload

Configuration pour votre site

Par défaut, la base de données postgres a été créée. Son propriétaire s'appelle aussi postgres. Un nouvel utilisateur système postgres a lui aussi été créé.

  • Connectez vous en tant qu'utilisateur postgres (qui est administrateur postgreSQL) :
sudo su - postgres
  • Créez un nouvel utilisateur :
createuser --interactive mypguser

Avec les options suivantes :

  • Super-utilisateur : Non
  • Créateur de base de données : Oui
  • Création de nouveaux rôles : Non

Modifiez son mot de passe :

psql
> ALTER USER mypguser WITH PASSWORD 'new_password';
  • Créez une nouvelle base de données :
createdb -O mypguser mypgdatabase
  • Si besoin, connectez-vous-y pour rendre votre utilisateur propriétaire du schéma public :
psql mypgdatabase
> ALTER SCHEMA public OWNER TO mypguser;
  • Redémarrez le service postgresql :
sudo /etc/init.d/postgresql reload

Utilisation

Connectez-vous à la base avec le nouvel utilisateur :

psql -d mypgdatabase -U mypguser

Si vous n'avez pas d'erreur, alors c'est prêt (\q pour quitter la console postgreSQL).

Astuce Installer PHP 7 sous Debian 8

Par défaut, les dépôts de Debian 8 propose d'installer PHP 5.6. Si vous voulez la version 7, procédez ainsi.

  • Ajoutez un nouveau dépôt pour apt, en tant que super administrateur :
echo 'deb http://packages.dotdeb.org jessie all' > /etc/apt/sources.list.d/dotdeb.list
wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt update
  • Installez PHP 7, avec les extensions que vous souhaitez. Probablement au moins gd, mcrypt, php-pear, intl :
apt-get -y install php7.0 libapache2-mod-php7.0 php-pear php7.0-gd php7.0-mcrypt php7.0-intl

Globalement, les paquets portent le même nom que ceux pour PHP 5.6.

Astuce Installation d'Apache

Installation

Lancez simplement la commande suivante :

sudo apt-get install apache2

Configuration générale

Modification du charset

  • Éditez le fichier de configuration du charset :
sudo nano /etc/apache2/conf-available/charset.conf
  • Décommentez la ligne :
AddDefaultCharset UTF-8

Utilisateur Apache

Pour éviter des problèmes de droits, vous pouvez modifier l'utilisateur et le groupe unix utilisés par Apache.

Par défaut avec Debian, il s'agit de www-data:www-data.

Pour en changer, modifiez le fichier /etc/apache2/envvars avec les droits administrateur :

export APACHE_RUN_USER=phpuser 
export APACHE_RUN_GROUP=phpuser

Activation du module de réécriture d'URL

Pour activer le module rewrite d'Apache et redémarrez Apache, utilisez ces commandes :

sudo a2enmod rewrite
sudo service apache2 restart

Configuration propre à votre site

Initialisation de votre site

  • Créez le répertoire racine pour votre site :
cd /var/www
sudo mkdir mon-site
sudo chown -R phpuser:phpuser mon-site
  • Créez un fichier index.html à l'intérieur, contenant par exemple <h1>Hello world !</h1>

Configuration du virtual host

Si vous souhaitez accéder à votre site via un nom de domaine spécifique (plutôt que par son IP), ou si vous en avez besoin de plusieurs pour accéder à votre application, il vous faut configurer un virtual host.

Créez un nouveau fichier .conf dans le répertoire des sites disponibles d'Apache /etc/apache2/sites-available/. (Ex: /etc/apache2/sites-available/mon-site.conf).

<VirtualHost *:80>
    ServerAdmin admin@mon-site.com
    ServerName www.mon-site.com
    ServerAlias *.mon-site.com
    DocumentRoot /var/www/mon-site/
    <Directory /var/www/mon-site/>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/mon-site.log
    ServerSignature Off
</VirtualHost>

Explications :

  • ServerAdmin : Adresse email de la personne à prévenir en cas de problème côté Apache.
  • ServerName : Nom de domaine que vous souhaitez associer au serveur. Il doit être dans les DNS du serveur (ou si vous êtes en mode dev, dans votre fichier /etc/hosts).
  • ServerAlias : Autres domaines ou sous domaines qui prendront en compte le même fichier vHost.
  • DocumentRoot : Répertoire vers lequel Apache redirigera les adresses IP et ports spécifiés plus haut (*:80).
  • Directory : Cette instruction permet d'ajouter des options et règles au répertoire web :
    • FollowSymLinks : Active le suivi des liens symboliques dans ce répertoire.

Activez votre virtual host, désactivez éventuellement celui par défaut puis redémarrez Apache :

sudo a2ensite mon-site
sudo a2dissite default
sudo service apache2 restart

Vérification

Appelez la page d'accueil de votre site via un navigateur ou wget depuis votre répertoire utilisateur :

cd ~
wget mon-site.com
cat index.html

Vous devez retrouver le contenu de votre fichier index.html :

<h1>Hello world !</h1>

Astuce Installation d'un environnement LAPP sous Debian

Cette suite d'articles donne un exemple d'installation d'un environnement LAPP sous Debian, destiné au développement (= pas pour la production). Il peut tout à fait servir de base pour un LAMP (= MySQL à la place de PostgreSQL)

Le wizard d'installation de Debian

Dans cet exemple les configurations choisies sont en italique.

  • Choisissez 64 bit install au boot sur le CD.
  • Choisissez la langue et la localisation -> France
  • Indiquez le nom de la machine (= celui visible sur le réseau) -> debian-server
  • Indiquez le domaine réseau -> (laisser vide si vous n'êtes pas dans un réseau d'entreprise, sinon renseignez-le)
  • Indiquez et confirmer le mot de passe root -> **
  • Indiquez le nom de l'utilisateur courant à créer -> phpuser
  • Indiquez les identifiants (login/mot de passe) pour cet utilisateur -> phpuser/phpuser
  • Choisissez la méthode de partitionnement -> Assisté - utiliser un disque entier
  • Choisissez le disque à partitionner ->
  • Choisissez le schéma de partitionnement -> Tout dans une seule partition
  • Terminez le partitionnement et appliquez les changements
  • Appliquez les changements sur les disques
  • Configurez l'outil de gestion des paquets :
    • Langue -> France
    • Miroir -> ftp.fr.debian.org
    • Mandataire ->
  • Refusez l'envoi de statistiques à propos des paquets installés
  • Sélectionnez les ensembles de logiciels que vous voulez installer (au moins Serveur SSH) :
    • Environnement de bureau Debian (= mode graphique)
    • Serveur d'impression
    • Serveur SSH
    • Utilitaires usuels du système
  • Acceptez l'installation de GRUB
  • Continuez en démarrant le nouveau système

Modification du système

Installation de sudo

  • Connectez-vous en administrateur -> root/******
  • Installez la commande sudo :
apt-get install sudo

Configuration du sudo

Ajoutez l'utilisateur phpuser au groupe sudo :

adduser phpuser sudo

Autoriser la connexion SSH en root

Par défaut, Debian 8 n'autorise pas cette connexion, ce qui est gênant lors de l'utilisation d'un outil comme WinSCP, Filezilla ou Nautilus pour explorer les fichiers.

Pour l'autoriser, modifiez le fichier /etc/ssh/sshd_config et remplacer la ligne :

PermitRootLogin without-password

par

PermitRootLogin yes

Redémarrez ensuite le service SSH :

service ssh restart

Amélioration de la console

Modifier le fichier .bashrc permet d'améliorer l'affichage de la console et d'ajouter des alias de commande.

  • Connectez-vous avec l'utilisateur -> phpuser/phpuser
  • Modifiez le fichier .bashrc avec nano et décommentez les lignes suivantes :
alias ll='ls -l'
alias la='ls -1'
alias l='ls -CF'

Si vous voulez avoir une console colorée, décommentez la ligne suivante :

force_color_prompt=yes

et modifiez la ligne suivante en la remplaçant par celle du dessous :

#PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' 
PS1='\[\e[33;01m\]\u \[\033[31;01m\][\[\033[0;37m\]\w\[\033[31;01m\]] \$\[\033[00m\] '
  • Ajouter cette ligne à la fin du fichier, pour pouvoir exécuter les commandes de /usr/sbin facilement :
export PATH=$PATH:/usr/sbin
  • Enregistrez les modifications avec Ctrl+X

Mise à jour de la distribution et de la liste des paquets

  • Lancez les commandes suivantes pour procéder à la mise à jour :
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
  • Acceptez d'installer les éventuels paquets à mettre à jour
  • Modifiez le fichier /etc/apt/sources.list avec nano en tant qu'administrateur :
deb http://security.debian.org/ etch/updates main contrib non-free
  • Mettez à jour la liste des dépôts et installez les bibliothèques de base :
sudo apt-get update
sudo apt-get install build-essential

Autre

Installez les outils dont vous avez besoin (ex: Screen, ...).

Astuce Connaître le poids et le nombre de fichiers d'un répertoire

Poids total

Pour connaître le poids total des fichiers (et sous-répertoires) que contient un répertoire, vous pouvez utiliser la commande du :

du -shL mon/repertoire

Explication :

Les options s, h et L permettent respectivement de faire la somme, afficher un poids lisible par un humain (en Ko, Mo, ...) plutôt qu'en octets et suivre les liens symboliques (plutôt que de compter le poids du lien).

Nombre de fichiers

Pour connaître le nombre de fichiers il faut cette fois composer avec plusieurs commandes :

find -L mon/repertoire -type f | wc -l

Explications :

  • La commande find avec l'option -type f permet de lister les fichiers
  • L'option -L permet de suivre les liens symboliques
  • La commande wc -l compte le nombre de lignes (ici celles retournées par find)

Astuce Rechercher un paquet

Si vous êtes sous une distribution avec apt d'installé, vous pouvez rechercher un paquet avec la commande suivante :

apt-cache search terme1 terme2

Remarques :

  • Si vous indiquez plusieurs termes, seuls les résultats avec chacun d'eux seront retournés
  • Les regexp sont gérées (au moins en partie). Ex : apt-cache search php.*memcach.

Si vous avez aptitude d'installé, une commande plus simple à mémoriser existe :

aptitude search terme1 terme2

Astuce Créer un lien symbolique

Pour créer un lien symbolique sou linux, il suffit d'utiliser la commande suivante :

ln -s chemin/vers/la/cible/du/lien chemin/vers/lien

Le premier paramètre contient le répertoire ou fichier à cibler, et le second le chemin/nom du lien à créer.

Les chemins peuvent-être relatifs ou absolus.

Astuce Changer l'utilisateur d'Apache

Il est parfois utile de choisir avec quel utilisateur système Apache est exécuté.

Pour le modifier, éditez le fichier /etc/apache2/envvars et modifiez les lignes suivantes :

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

www-data est la valeur par défaut. Il suffit de mettre l'utilisateur et le groupe que vous souhaitez.

Astuce Monter automatiquement un disque partagé au démarrage

Avec Virtualbox, on peut partager des répertoires depuis son hôte vers la machine virtuelle.

Par défaut, Virtualbox les monte dans /media/sf_<nom_partage> et attribut le répertoire à l'utilisateur vboxsf.

Pour monter automatiquement le répertoire à l'endroit de votre choix, vous pouvez modifiez le fichier /etc/rc.local, et ajouter cette ligne :

mount -o uid=500,gid=500,umask=002 --bind /media/sf_<nom_partage> /mon/repertoire/cible

Remarque :

Les options uid et gid permettent d'attribuer le répertoire à un utilisateur et à un groupe spécifique. 500 correspond par exemple à l'utilisateur d'Apache www-data (la plupart du temps).

Astuce Connaître l'espace disque restant

Sous linux, vous pouvez rapidement connaître l'espace disque restant grâce à la commande :

df -h

Note : comme pour beaucoup d'autres commandes Linux, l'option -h permet un affichage plus humain, notamment pour le poids des fichiers (ie. 1.2mo au lieu de 1200000).

Astuce Vérifier la configuration d'Apache avec WampServer

Lorsque vous lancez les services de WampServer, il arrive qu'Apache n'arrive pas à démarrer à cause d'une erreur de syntaxe dans sa configuration.

Pour savoir quel fichier (httpd.conf, httpd-vhosts.conf, ...) et quelle ligne pose problème, vous pouvez lancer Apache en ligne de commande :

cd D:\Dev\wamp\bin\apache\apache2.2.22\bin
httpd

Remarque : Adaptez le chemin en fonction d'où est installé WampServer et la version d'Apache que vous utilisez.

Exemple : Vérifier la configuration d'Apache avec WampServer

Astuce Restreindre l'accès à un répertoire avec Apache

Pour restreindre l'accès à un répertoire ou à un site entier, vous pouvez le protéger par un mot de passe :

Authentification HTTP

Prérequis

Modules Apache

Pour pouvoir utiliser cette fonctionnalité d'Apache, vous aurez besoin des modules suivants : mod_auth_basic, mod_authn_file et mod_authz_user.

Génération du fichier de mots de passe

Vous devez également générer un fichier de mots passe, via l'utilitaire htpasswd fourni avec Apache. Il se trouve probablement dans le répertoire bin/ de votre installation apache.

Pour cela, lancez la commande suivante :

htpasswd -c /chemin/vers/un/repertoire/protege/passwords nom_utilisateur

Remarques :

  • Vous par exemple créer le fichier passwords dans /usr/local/apache/passwd/.
  • Pour ajouter un autre utilisateur, utilisez la même commande sans l'option -c.

Le fichier généré pourra ressembler à a ça :

user1:.G.h/4RfP93fd
user2:RlPRITNDHefEpl 

Configuration de base

Cette configuration peut se faire au niveau de votre virtualhost :

<VirtualHost *:80>
    DocumentRoot /var/www/mon_site
    ServerName mon-site.com

    <Directory /var/www/mon_site>
        Options FollowSymLinks
        Order allow,deny
        allow from all
    </Directory>

    <Directory /var/www/mon_site/protected>
        Order allow,deny
        Allow from all
        AllowOverride None

        AuthType Basic
        # Intitulé de la mire de connexion
        AuthName "Acces restreint"
        # Type de provider
        AuthBasicProvider file
        # Fichier contenant les utilisateurs et leur mots de passe cryptés
        AuthUserFile /chemin/vers/mon/fichier/passwords
        Require valid-user
    </Directory>
</VirtualHost>

Explications :

  • Ce virtualhost définit des règles différentes selon les dossiers du site :
    • La racine du site (mon_site/) et ses sous-répertoires sont accessibles à tous
    • Le répertoire protected/ lui, est protégé par un mot de passe
  • L'authentification basique est utilisée.
  • On indique le fichier contenant les utilisateurs et leurs mots de passe cryptés, autorisés à accéder au répertoire.

Remarque :

Pour plus de sécurité, il est également judicieux de passer le site en HTTPS.

Des groupes d'utilisateurs

Si vous voulez gérer des accès avec plusieurs utilisateurs, il est possible de les organiser par groupe.

Vous pourrez ainsi définir que tel utilisateur appartient à tel ou tel groupe, et que tel ou tel groupe à accès à tel ou tel répertoire.

Le virtualhost est alors un peu modifié :

<VirtualHost *:80>
    DocumentRoot /var/www/mon_site
    ServerName mon-site.com

    <Directory /var/www/mon_site>
        Options FollowSymLinks
        Order allow,deny
        allow from all
    </Directory>

    <Directory /var/www/mon_site/protected>
        Order allow,deny
        Allow from all
        AllowOverride None

        AuthType Basic
        # Intitulé de la mire de connexion
        AuthName "Acces restreint"
        # Type de provider
        AuthBasicProvider file
        # Fichier contenant les utilisateurs et leur mots de passe cryptés
        AuthUserFile /chemin/vers/mon/fichier/passwords
        # Fichier contenant les groupes et leurs utilisateurs
        AuthGroupFile /chemin/vers/mon/fichier/groups
        Require group_name
    </Directory>
</VirtualHost>

Explication :

La propriété AuthUserFile a été ajoutée, pour définir où se trouve le fichier contenant la liste des groupes. La règle de restriction a également changé, elle définit maintenant le nom du groupe ayant accès au répertoire.

Remarques :

  • Pour utiliser ce système de groupes, vous aurez besoin du module mod_authz_groupfile d'Apache.

  • Le fichier groups contient quelque chose comme ça :

    group1: user1 user2
    group2: user2 user3
  • Contrairement au fichier passwords, il n'est pas crypté et peut donc être créé via un éditeur de texte classique.

Astuce Rediriger vers le site mobile

Si vous avez deux versions de votre site, une desktop et une autre mobile, vous voudrez probablement qu'un utilisateur sur mobile soit automatiquement redirigé vers la version adaptée.

Cette configuration peut être définie au niveau de vos virtualhost.

Cas basique

Imaginons que vous ayez deux virtualhost basiques, un pour chaque version.

Site desktop

<VirtualHost *:80>
    DocumentRoot /var/www/site_desktop
    ServerName www.mon-site.com

    <Directory /var/www/site_desktop>
        Options FollowSymLinks
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Site mobile

<VirtualHost *:80>
    DocumentRoot /var/www/site_mobile
    ServerName m.mon-site.com

    <Directory /var/www/site_mobile>
        Options FollowSymLinks
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Si vous voulez rediriger un utilisateur qui accède au site desktop via son mobile, vers le site mobile, le premier virtualhost deviendra :

<VirtualHost *:80>
    DocumentRoot /var/www/site_desktop
    ServerName www.mon-site.com

    <IfModule mod_rewrite.c>
        RewriteEngine on

        # Si le client est un navigateur mobile
        RewriteCond %{HTTP_USER_AGENT} mobi [NC]

        # Redirection vers le site mobile
        RewriteRule ^(.*)$ http://m.mon-site.com [R=301,L]
    </IfModule>

    <Directory /var/www/site_desktop>
        Options FollowSymLinks
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Explications :

  • Si le module de réécriture d'Apache est présent, on l'active
  • Si le nom du navigateur (HTTP_USER_AGENT) contient la chaîne mobi, on applique la règle de redirection, vers le site mobile

Remarque :

Vous pouvez bien sûr faire l'inverse (mobile vers desktop), en ajoutant un ! :

<VirtualHost *:80>
    DocumentRoot /var/www/site_mobile
    ServerName m.mon-site.com

    <IfModule mod_rewrite.c>
        RewriteEngine on

        # Si le client n'est pas un navigateur mobile
        RewriteCond %{HTTP_USER_AGENT} !mobi [NC]

        # Redirection vers le site desktop
        RewriteRule ^(.*)$ http://www.mon-site.com [R=301,L]
    </IfModule>

    <Directory /var/www/site_mobile>
        Options FollowSymLinks
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Règles supplémentaires

Selon votre architecture ou vos besoins, vous serez sans doute amené à ajouter d'autres conditions (RewriteCond) avant la règle de réécriture (RewriteRule) :

# 1. Si le client n'est pas sur iPad
RewriteCond %{HTTP_USER_AGENT} !ipad [NC]

# 2. Si le nom de domaine appelé ne commence pas par "m."
RewriteCond %{HTTP_HOST} !^m\..*

# 3. Si l'URL demandée ne commence pas par "/api/mobile/"
RewriteCond %{REQUEST_URI} !(/api/mobile/)

Explications :

  1. Les iPad ayant une résolution importante, il peut être préférable de conserver la version desktop pour leurs utilisateurs. Vous pouvez également ajouter d'autres tablettes : !ipad|tablet [NC]. Plus d'informations sur le site Mozilla.
  2. Si vous avez un serveur apache en frontal, qui gère les deux noms de domaine (mon-site.com et m.mon-site.com) dans un seul virtualhost, vous aurez besoin de cette ligne pour éviter une boucle de redirection infinie.
  3. Si votre site desktop fournit des webservices à votre site mobile qui les consomme en AJAX, il ne faut pas que les requêtes en question soient redirigées.

Laisser le choix à l'utilisateur

En général, un site mobile ne propose pas toutes les fonctionnalités du site desktop. De plus, en fonction de la taille de l'appareil de l'utilisateur, ce dernier peut préférer utiliser le site desktop.

L'idéal est de proposer un lien vers la version desktop sur le site mobile (éventuellement l'inverse).

Le problème, c'est qu'avec les règles de redirection définies précédemment, l'utilisateur sera automatiquement redirigé en cliquant sur le lien.

Une solution est d'ajouter un paramètre à l'url, et de stocker l'information en cookie. Le lien depuis le site mobile vers le site desktop aura par exemple pour URL http://www.mon-site?mobile=0.

Pour cela, la règle concernant la redirection doit être améliorée :

<IfModule mod_rewrite.c>
    RewriteEngine on

    # Si l'URL contient le paramètre 'mobile', égal à 1
    RewriteCond %{QUERY_STRING} (^|&)mobile=1(&|$)
    # On ajoute un cookie
    RewriteRule ^ - [CO=mobile:1:%{HTTP_HOST}]

    # Si l'URL contient le paramètre 'mobile', égale à 0
    RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$)
    # On ajoute un cookie
    RewriteRule ^ - [CO=mobile:0:%{HTTP_HOST}]

    # Si l'URL contient le paramètre 'mobile', égale à 1
    RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$)
    # On saute la prochaine RewriteRule
    RewriteRule ^ - [S=1]

    # Si le client est un navigateur mobile
    RewriteCond %{HTTP_USER_AGENT} mobi [NC]

    # Si le cookie n'est pas égal à 0
    RewriteCond %{HTTP:Cookie} !\mobile=0(;|$)

    # Redirection vers le site desktop
    RewriteRule ^(.*)$ http://m.mon-site.com [R=301,L]
</IfModule>

Astuce Configurer un site en HTTPS

Prérequis

Pour pouvoir utiliser le SSL/TLS et passer votre site en HTTPS, les paquets suivants doivent être installés sur votre serveur :

  • openssl : API de chiffrement
  • mod_ssl : Module apache

De plus, vous aurez besoin d'un certificat pour effectuer le chiffrement.

Celui-ci doit être obtenu auprès d'une autorité de certification et stocké dans un endroit sécurisé de votre serveur.

À des fins de test, ou pour un site privé, il est possible de générer son propre certificat et de l'auto-signer.

Générer un certificat auto-signé

Pour cela vous devez probablement être connecté en root sur votre serveur (ou sudo) :

# Génération d'une clé privée
openssl genrsa -out my_certif.key 2048
# Génération d'un fichier CSR
openssl req -new -key my_certif.key -out my_certif.csr
# Génération de la clé auto-signée
openssl x509 -req -days 365 -in my_certif.csr -signkey my_certif.key -out my_certif.crt

Vous avez maintenant deux fichiers particuliers :

  • my_certif.crt
  • my_certif.key

Configuration Apache

httpd.conf

Voici les paramètres standards d'Apache pour utiliser le HTTPS :

##
## SSL Global Context
##
## All SSL configuration in this context applies both to
## the main server and all SSL-enabled virtual hosts.
##

LoadModule ssl_module modules/mod_ssl.so

#
# When we also provide SSL we have to listen to the
# the HTTPS port in addition.
#
Listen 443

# Necessary if you have several virtual hosts on 443 port
NameVirtualHost *:443 

# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
# The filtering dialog program ('builtin' is a internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog builtin

# Inter-Process Session Cache:
# Configure the SSL Session Cache: First the mechanism
# to use and second the expiring timeout (in seconds).
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300

# Semaphore:
# Configure the path to the mutual exclusion semaphore the
# SSL engine uses internally for inter-process synchronization.
SSLMutex default

# Pseudo Random Number Generator (PRNG):
# Configure one or more sources to seed the PRNG of the
# SSL library. The seed data should be of good random quality.
# WARNING! On some platforms /dev/random blocks if not enough entropy
# is available. This means you then cannot use the /dev/random device
# because it would lead to very long connection times (as long as
# it requires to make more entropy available). But usually those
# platforms additionally provide a /dev/urandom device which doesn't
# block. So, if available, use this one instead. Read the mod_ssl User
# Manual for more details.
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random 512
#SSLRandomSeed connect file:/dev/random 512
#SSLRandomSeed connect file:/dev/urandom 512

#
# Use "SSLCryptoDevice" to enable any supported hardware
# accelerators. Use "openssl engine -v" to list supported
# engine names. NOTE: If you enable an accelerator and the
# server does not start, consult the error logs and ensure
# your accelerator is functioning properly.
#
SSLCryptoDevice builtin
#SSLCryptoDevice ubsec

Très souvent, apache propose un fichier de configuration dédié à ce paramétrage (ex: ssl.conf). Vérifiez qu'il est bien inclus par le httpd.conf, ou créez-le.

Virtualhost

Il faut ensuite configurer un virtualhost pour le port 443 (celui par défaut pour le HTTPS) :

<VirtualHost *:443>
DocumentRoot /var/www/mon_site
ServerName mon-site.com

# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

# SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect. Disable SSLv2 access by default:
SSLProtocol all -SSLv2

# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /chemin/vers/certifs/my_certif.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /chemin/vers/certifs/my_certif.key

# SSL Protocol Adjustments:
# The safe and default but still SSL/TLS standard compliant shutdown
# approach is that mod_ssl sends the close notify alert but doesn't wait for
# the close notify alert from client. When you need a different shutdown
# approach you can use one of the following variables:
# o ssl-unclean-shutdown:
# This forces an unclean shutdown when the connection is closed, i.e. no
# SSL close notify alert is send or allowed to received. This violates
# the SSL/TLS standard but is needed for some brain-dead browsers. Use
# this when you receive I/O errors because of the standard approach where
# mod_ssl sends the close notify alert.
# o ssl-accurate-shutdown:
# This forces an accurate shutdown when the connection is closed, i.e. a
# SSL close notify alert is send and mod_ssl waits for the close notify
# alert of the client. This is 100% SSL/TLS standard compliant, but in
# practice often causes hanging connections with brain-dead browsers. Use
# this only for browsers where you know that their SSL implementation
# works correctly.
# Notice: Most problems of broken clients are also related to the HTTP
# keep-alive facility, so you usually additionally want to disable
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
# Similarly, one has to force some clients to use HTTP/1.0 to workaround
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
# "force-response-1.0" for this.
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

<Directory /var/www/mon_site>
    #Options FollowSymLinks
    #AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost>

Explication :

Le virtualhost contient les informations habituelles (nom de domaine, répertoire racine, ...) mais également des configurations propres au SSL/TLS et les chemins vers les certificats que vous avez générés ou obtenus auprès d'une Autorité de certification.

De plus, il répond sur le port 443 et non le 80 habituel.

Forcer le HTTPS

Pour éviter que les utilisateurs du site n'aient aucune réponse lorsqu'ils tapent (http://)mon-site.com dans leur navigateur, il est judicieux de rediriger les accès en HTTP vers l'URL en HTTPS.

Pour cela, ajoutez un second virtualhost gérant la redirection :

<VirtualHost *:80>
    DocumentRoot /var/www/mon_site
    ServerName mon-site.com
    Redirect permanent / https://mon-site.com:443/
</VirtualHost>

Astuce Connaitre sa version de Linux

Pour connaitre votre distribution et sa version, utilisez la commande suivante :

lsb_release -a

Remarque :

Cette commande n'est pas forcément installée par défaut sur votre machine. Elle se trouve sûrement dans le dépôt officiel et peut être ajoutée grâce à yum ou apt.

Astuce Screen : le multiplexeur de terminaux

Screen permet d'ouvrir plusieurs terminaux dans une même console, de passer de l'un à l'autre et de les mémoriser pour les récupérer plus tard.

Si vous avez une interface graphique sous Linux, vous avez souvent plusieurs consoles d'ouvertes, ou même une seule avec plusieurs onglets.

Mais si vous n'avez pas d'interface graphique, ou si vous accédez à votre machine linux avec PuTTY, vous n'avez pas cette possibilité. C'est là que Screen entre en jeu.

Installation

Screen est disponible sur les dépôts standards. Vous pouvez donc l'installez simplement via apt ou yum.

Remarque :

Sous Debian, vous devrez peut-être ajouter des dépôts supplémentaires (Ex: Debian 7.x)

Utilisation

Voici un cas d'utilisation classique de Screen.

  • Vous accédez à votre serveur en SSH depuis votre machine A au boulot.
  • Vous tapez plusieurs commandes dont une partie connectée avec l'utilisateur user1, et l'autre avec user2.
  • Vous quittez le boulot et rentrez chez vous. Vous souhaitez récupérer sur votre machine B votre console telle que laissée en quittant la machine A.

Tout ça est possible avec Screen et ces quelques commandes

  • Accédez au serveur en SSH comme d'habitude, depuis votre machine A au boulot

  • Créez un nouveau screen en nommant la session :

    screen -S ma_session
  • Exécutez une commande, connecté en user1

  • Ouvrez un nouveau terminal avec CTRL + A, puis C

  • Changez d'utilisateur (user2) et exécutez une commande

  • Naviguez vers l'autre terminal (connecté en user1) avec CTRL + A, puis N

  • Exécutez une commande, connecté en user1

  • Détachez le screen (il reste actif mais vous n'y êtes plus connecté) avec CTRL + A, puis D

  • Éteignez la machine A, retournez à la maison

  • Allumez votre machine B à la maison, et connectez-vous au serveur en SSH comme d'habitude.

  • Récupérez votre session screen :

    screen -r

Vous récupérez ainsi les deux terminaux dans l'état où vous les avez laissés.

Remarque :

Si vous avez plusieurs sessions en cours, screen -r vous en affichera la liste. Il faudra utiliser screen -r nom_de_session pour choisir celle que vous souhaitez récupérer.

Bonus

  1. Pour fermer le terminal courant : CTRL + D. Si c'était le seul, cela quittera screen.
  2. Pour naviguer rapidement entre les deux derniers terminaux utilisés : CTRL + A, puis A
  3. Pour pouvoir scroller dans votre terminal lorsque tout n'est pas affiché : CTRL + A, puis ECHAP Vous pouvez maintenant naviguer avec les flèches et pageUp/pageDown.
  4. Pour se connecter à un screen encore attaché : screen -x ma_session
  5. Pour supprimer une session, connectez-vous-y et tapez exit
  6. Pour forcer une session à se détacher (par exemple si vous avez fermé votre terminal sans avoir détaché votre session) : screen -d ma_session
  7. Pour renommer une session : CTRL + Apuis tapez :nom_session new_nom_session et validez avec Entrée
  8. Pour personnaliser l'apparence de screen, et même lancer/récupérer automatiquement un screen dès votre connexion, suivez cet article et ses commentaires.

Astuce Personnaliser l'apparence de l'invite de commande

Sous Linux, vous pouvez personnaliser l'invite de commande, pour y mettre un peu de couleur ou modifier ce qu'il y a avant le prompt.

Ex :

Invite de commande personnalisé

Pour cela, éditez/créez le fichier ~/.bashrc de votre utilisateur en y ajoutant cette ligne :

PS1='\[\e[33;01m\]\u \[\033[31;01m\][\[\033[0;37m\]\w\[\033[31;01m\]] \$\[\033[00m\] '

Dans cette ligne, les blocs de la forme \[\e[33;01m\], \[\033[31;01m\] et \[\033[0;37m\] définissent les couleurs à utiliser : respectivement jaune, rouge et gris clair.

\u affiche l'utilisateur et \w le chemin courant. \$ affiche $ pour un utilisateur et # pour le root.

Il y a plein d'autres paramètres disponibles, pour afficher l'heure, le nom de la machine, ...

Astuce Créer un lien symbolique entre deux répertoires sous Windows

Pour créer un lien symbolique sous Windows, il faut utiliser la commande symlink :

mklink [[/D] | [/H] | [/J]] <Lien> <Cible>

Pour cela, lancez une invite de commande :

  • Menu démarrer
  • Exécuter...
  • Tapez cmd et validez

Si par exemple vous souhaitez pouvoir accéder au répertoire C:\Windows\System32\drivers\etc directement via C:\etc, tapez cette commande :

mklink /J C:\etc C:\Windows\System32\drivers\etc

Remarques :

  • Selon le lien que vous souhaitez créer, vous devrez peut-être être admin de votre machine (ou lancer l'invite de commande en mode administrateur).
  • Si vous voulez créer un lien vers un répertoire qui n'existe pas (encore) sur votre système, utilisez l'option /D et non pas /J. Cela créera un lien symbolique et non pas une jonction.

Astuce Utiliser l'autocomplétion de l'invite de commande Windows

Sous Linux, vous avez l'habitude d'utiliser la touche TAB pour trouver automatiquement la fin du nom d'un fichier ou d'un répertoire.

La même fonctionnalité existe pour Windows sous DOS, mais vous devez utiliser des antislash \ au lieu des slash / dans vos chemins.

Astuce Afficher les tâches planifiées

Sous Linux, pour savoir les tâches planifiées pour l'utilisateur courant, utilisez la commande suivante :

crontab -l

Astuce Autoriser une machine distante à accéder à un serveur web

Par défaut, le pare-feu bloque les ports utilisés par Apache, à savoir 80 et 443.

Pour autoriser une machine distante à se connecter à Apache, ajoutez les lignes suivantes au début du fichier /etc/sysconfig/iptables :

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

Redémarrez maintenant le pare-feu pour qu'il prenne en compte la modification :

service iptables restart

Astuce Connaître les modules chargés par Apache

Sous Linux, pour connaitre les modules chargés par Apache, utilisez la commande :

/usr/local/apache/bin/httpd -M

Remarque :

Selon votre distribution, remplacez httpd par apache ou apachectl.

Erreur Erreur au lancement d'Apache

Lorsque vous lancez Apache sous Linux, via une commande du type :

/sbin/service apache start

Vous pouvez obtenir l'erreur suivante :

Syntax error on line xxx of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied

Pour corriger l'erreur, exécutez la commande suivante :

chcon -t textrel_shlib_t /usr/local/apache2/modules/libphp5.so

Astuce Ajouter des variables d'environnement

Pour ajouter une variable d'environnement ou en modifier la valeur, utilisez la commande :

export INSTALL4J_JAVA_HOME='/var/lib/jdk1.6.0_33'

en remplaçant INSTALL4J_JAVA_HOME par le nom de la variable à définir et en modifiant la valeur entre 'quotes'.

Pour que cette variable soit définie automatiquement lorsque vous utilisez la console, il faut modifier le fichier .bashrc dans le dossier home de l'utilisateur pouvant utiliser cette variable. Pour l'utilisateur root par exemple, il s'agit du fichier /root/.bashrc.

Dans ce fichier, ajoutez la même commande :

export INSTALL4J_JAVA_HOME='/var/lib/jdk1.6.0_33'

Astuce Modifier le chemin par défaut de l'invite de commande Windows

S'il vous arrive d’utiliser l’outil de ligne de commande DOS sous Windows, vous savez que par défaut, celui-ci se positionne dans votre répertoire personnel. C'est assez pénible car à chaque fois, vous êtes obligé de faire plein de cd machin pour arriver au répertoire de votre choix.

Solution badasse

Pour éviter de refaire cette manip à chaque fois (surtout si c'est pour se rendre toujours au même endroit), vous pouvez modifier le chemin utilisé par défaut.

Il suffit d’aller dans la base de registre (Démarrer > Exécuter... > regedit) et de naviguer jusqu’à la clé HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor.

Créez ensuite une nouvelle valeur chaîne dans la zone de droite et nommez-la Autorun.

Modifiez ensuite cette clé et donnez-lui la valeur suivante en remplaçant bien sûr mon\chemin par celui de votre choix :

cd /d d:\mon\chemin

Et voilà, les changements s'appliquent instantanément sans besoin de redémarrer. (Relancez tout de même votre invite de commande si elle était déjà ouverte.)

Remarque importante :

Cette manip semble poser problème dans certains scripts batch utilisant %CD%.

Solution pacifique

Rendez-vous dans le répertoire où vous souhaitez ouvrir votre invite de commande, via l'explorateur Windows.

Faites Shift + Clic droit et choisissez Ouvrir un invite de commande ici. Et voilà c'est fait.

Cette solution est beaucoup moins intrusive et plus simple mais vous devez refaire la manip à chaque fois.

Astuce Créer et extraire une archive tar.gz

Pour créer une archive tar.gz sans le dossier conteneur, utilisez la commande :

cd mon/repertoire/conteneur
tar -czf ../archive.tar.gz ./

Pour extraire une archive tar.gz, utilisez la commande :

tar -xvzf archive.tar.gz

Astuce Supprimer les répertoires enfants vides

Pour supprimer récursivement tous les répertoires vides d'une arborescence, utilisez la commande :

find -depth -type d -empty -exec rmdir {} \;