Publié le

Créer des domaines depuis Virtualmin

Créer un nouveau domaine est maintenant très facile. La version que j’utilise est ancienne, ce n’est pas la version #ANNEE#. Faites comme sur l’image. Attention, si vous avez mis des restrictions sur les mots de passe avec mysql_secure_installation, vous devez respecter ces restrictions sinon vous aurez une erreur.

Créer un domaine depuis Virtualmin

Si vous être pressé d’aller voir le résultat, vous aurez le message d’erreur suivant :Forbidden
You don’t have permission to access / on this server.
Apache/2.4.18 (Ubuntu) Server at web-presence.ch Port 80C’est bêtement que vous n’avez rien dans votre dossier public_html. Si vous mettez un fichier index.html Il va s’afficher. À ce stade, vous devez encore autoriser votre domaine à exécuter les fichier php. Si vous ne le faites pas le fichier php ne sera pas exécuté, mais sera téléchargé. Pour cela ajouter les lignes suivantes dans votre fichier etc/apache2/sites-available/votre_domaine.conf

#Mettez le bout de script après la ligne suivante:
#FCGIWrapper /home/web-presence/fcgi-bin/php7.0.fcgi .php7.0
php_admin_flag engine on
php_admin_flag engine on
On redémarre apache ...
/etc/init.d/apache2 restart
C'est terminé, votre domaine devrait normalement être maintenant fonctionnel.
Si vous avez un problème avec les DNS, c'est peut-être que vous n'autorisez pas BIND DNS Server à écouter au bon endroit.
La façon la plu simple et de l'autoriser a écouter partout de la façon suivante:
etc/bind/named.conf.options
listen-on {
 any;
};
Publié le

Installation Serveur Ubuntu 16.04

Erreur possible

Avant d’aller plus loin et pour être sûr que vous allez le lire, il faut dire que Virtualmin n’est pas disponible pour toutes les versions d’Ubuntu. En cas d’incompatibilité, vous aurez le message suivant:

Virtualimin : Failed to detect operating system

Allez voir dans le fichier etc/issue. Il doit avoir contenir votre OS par exemple: Ubuntu 16.04 LTS. Si ce n’est pas le cas, c’est peut-être que virtualmin n’est pas encore compatible avec votre version.

Si vous activez mysql_secure_installation


Dans le shell ci-dessous, il vous est demandé si vous désirez utiliser le script mysql_secure_installation. Si vous répondez oui vous avez certaine contrainte sur les mots de passes. Pour plus d’infos allez lire mon article.

mysql_secure_installation a des incidences sur le choix de votre mot de passe. Si vous l’activez, un mauvais mot de passe va générer des erreurs.

Niveaux de sécurité et directives pour les mots des de passes.

LOW: Longueur de plus de 7 caractères.
MEDIUM: Longueur de plus de 7 caractères, avoir des majuscules et minuscules et caractères spéciaux.
STRONG : Longueur de plus de 7 caractères, avoir des majuscules et minuscules et caractères spéciaux et ne doit pas être dans un fichier de dictionnaire s’il a été défini.

Installation Mysql / Phpmyadmin / Vitrualmin sur Ubuntu 16.04

Je vous donne ci-dessous toutes les commandes a effectuer pour installer les bases d’un serveur web

Installation Ubuntu 16.04 script shell
######### INSTALL Apache et modules php 7 #########
sudo apt-get update 
sudo apt-get upgrade 
sudo apt-get install apache2
service apache2 restart

### Voir la liste des modules php7 disponible -> sudo apt-cache search php7-* 
### On installe maintenant les module que l'on a besoin
sudo apt-get install php7.0-mysql php7.0-curl php7.0-json php7.0-cgi  php7.0-mcrypt php7.0-mbstring libapache2-mod-php7.0

######### Install mysql #########  
sudo apt-get install mysql-server
sudo mysql_secure_installation

######### Install Phpmyadmin #########
sudo apt-get install phpmyadmin 
/etc/init.d/apache2 restart 
service mysql restart 

######### Install virtualmin #########
mkdir /virtualmin
cd /virtualmin
wget http://software.virtualmin.com/gpl/scripts/install.sh
chmod +x install.sh
sh install.sh


sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf
sudo a2dismod mpm_event && sudo a2enmod mpm_prefork && sudo a2enmod php7.0
sudo apt-get install php libapache2-mod-php

sudo a2enmod rewrite

/etc/init.d/apache2 restart

Actuellement, phpmyadmin ne devrait pas s’exécuter mais afficher le code php. Pour qu’il s’exécute, allez modifier le fichier etc/apache2/apache2.conf et ajouter les lignes suivantes après le texte en commentaire.

# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.

SetHandler application/x-httpd-php

ServerSignature Off
ServerTokens Prod

A cette étape, je redémarre la machine pour être certain que tout a bien été prix en compte.

reboot

Vous pouvez maintenant vous connecter sur phpmyadmin à l’adresse suivante: Http://votre_ip/phpmyadmin.
Connectez-vous ensuite sur Webmin à l’adresse http://votre_ip:10000/ et terminer l’installation.


Fin de l’installation de virtualmin

Installation et activation de modules utiles

Vous pouvez maintenant installer les modules dont vous avez besoin. Pour ma part j’installe toujours la liste suivant. Reportez-vous à mon pour plus d’infos sur ce sujet.

sudo apt-get install zip
sudo apt-get install rar
# Optimisation d'images
apt-get install jpegoptim
apt-get install optipng

sudo a2enmod headers
sudo a2enmod expires
sudo /etc/init.d/apache2 restart

Configurer upload_max_filesize

Si vous utiliser l’upload d’images, vous serez peut-être amenez à augmenter la taille maximale des fichier téléchargeable. Par défaut elle est de 2MB. Pour ce faire modifier votre php.ini de la sorte et rdémarrer apache (/etc/init.d/apache2 restart):etc/php/7.0/apache2/php.iniupload_max_filesize = 5M
max_file_uploads = 40

Pour savoir ou se trouve votre php.ini, afficher phpinfo(); et regarder la variable: Loaded Configuration File

Publié le

Commandes de base linux

Liste de commandes de base pour l’administration et l’utilisation d’un serveur linux. Je regroupe ici toutes les commandes que j’utilise très régulièrement et dont je veux être certain de la syntaxe avant de les exécuter.

Affichage des fichiers et dossiers

cd ..Monte dans le rep parent
cd /home/web-presenceAller dans un rep chemin depuis la racine
cd public_css/imgAller dans un rep chemin depuis le rep courant
lsLister le contenu du répertoire courant
ls -1 |wc -lCompte de nombre de fichiers ou dossiers du rep.

Taille des fichiers et dossiers (Disk Usage)

du –max-depth=1Affiche la taille des dossiers du rep. courant.
du –max-depth=1 | sort -nAffiche la taille des dossiers du rep courant trié par taille
du |sort -n Affiche la taille des dossiers du rep courant et des enfants trié par taille
du |sort -n Même chose mais du plus grand au plus petit

Gestion des fichiers et dossiers

m log.txtSupprime le fichier (Pas de confirmation)
mkdirCréer un dossier
rm -rf *Supprimer tous le contenu du répertoire courant (Pas de confirmation)
rmdir logSupprimer le répertoire
rm -rf var/generation/Supprime le dossier var/generation
find . -name « sess_a* » -exec rm {} \;Supprime tous les fichiers ayant un nom commençant par sess_s dans le dossier courant. Utile si le dossier est trop long et que si rm -rf retourne « bash: /bin/rm: Argument list too long »
rm -rf var/generation/*Supprime le contenu du dossier var/generation
chown -R www-data:www-data *Change le user et le group du rep. courant et des enfants
chown -h www-data:www-data enChange le user et le group d’un lien symbolique. dans notre cas le dossier ‘en’
chmod -R 755 /home/web-presence/public _html/cssChange les droits récursivement dans les dossiers.

Administration

rebootReboot le serveur
/etc/init.d/mysql restart
/etc/init.d/apache2 restart
/etc/init.d/bind9 restart
Redémarre des processus
topConsommation des processus
ssh root@nsxxx.ovh.netConnexion en root à un serveur.

Backup, bases de données et transferts

tar -cvf web-presence.tar /home/web-presence/Backuper un dossier et son contenu et en faire un fichier .tar
tar -xvf web-presence.tarDécompresser un fichier .tar
scp dump_databse.sql root@ksxxx.kimsufi.com:/home/backup/Copie un fichier du répertoire courant sur un autre serveur dans le fichier home/backup/
wget http://test.com/test.shTélécharge un fichier dans le répertoire courant.
gzip test.tar Compresser fichier en .gz
zip -r log_file.log.zip laravel.log Compresser fichier en .zip
zip -r logs_folder.zip logs/Compresser répertoire en .zip
gzip -d archive.gz
unzip archive.zip
Decompresser des fichier zip ou .gz
mysqldump -uroot -pPassworRoot –default-character-set=utf8 ma_database > ma_database.sql Faire un dump d’une base de données
mysql -uroot -pPassworRoot ma_database < ma_database.sql Monter une base de données

Recherche

find -mmin -10
find /home/web-presence -mmin -10
Affiche les fichiers modifiés il y a moins de 10 minutes dans le rep. courant et sous-rep.
locate .css

Recherche les fichiers css sous le dossier courant. Nécessite l’installation:
sudo apt-get install mlocate
sudo updatedb
Publié le

Problème de lecture de vidéos sur android

J’ai dernièrement été confronté au problème suivant, les vidéos mp4 étaient lu sur les desktop mais pas sur les mobiles Android et autres malgré que le html ne pouvait être faux et que si je mettais les vidéos sur un autre serveur, ça fonctionnait…

<video width="100%"  controls>
<source src="http://..../video.mp4" type='video/mp4'>
<source src="http://..../video.ogg" type="video/ogg">
<source src="http://..../video.ogg" type="video/webm">
</video>

Après de nombreuses tentative comme mettre à jours avconv et ffmpeg car les vidéos étaient convertient sur le server, j’ai fait comme proposé sur de nombreux sites modifié le fichier htacces en ajoutant les lignes suivantes mais sans succès:

AddType video/ogg .ogv
AddType video/mp4 .mp4
AddType video/webm .webm

Mais ca ne marchait pas. J’ai ensuite contrôlé les fichier que je recevait et j’ai vu que mes vidéos étaient compressé en GZIP. Il m’a ensuit suffit de modifier le .htaccess de la façon suivante pour que les vidéos ne soient pas transmisent compressées et qu’elles se chargent sur les devices mobiles:

SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|mp4|ogg|webm)$ no-gzip dont-vary

En espérant que ca puisse faire gagner du temps à quelqu’un…

Publié le

Compression d’image avec jpegoptim et optipng

Lors de l’amélioration de la vitesse de chargement de vos pages afin d’améliorer l’UX pour réduire le taux de rebonds et satisfaire plus aux directives de Google, vous serez vite confronté au fait d’avoir des images trop lourdes qu’il est difficile de réduire sans en réduire la qualité. Pour arriver à cela aussi appelé lossless, des librairies sont extrêmement utiles, efficaces et rapide à mettre en œuvre. 
Les librairies optipng et jpegoptim permettent d’atteindre les taux de compression définis par Google Page Speed et donc de valider cette partie de leur test.

Jpegoptim

Jpegoptim comme son nom l’indique permet d’optimiser des fichier jpeg selon un taux de compression définie ou sans perte. Un des grands avantages de cette librairie est qu’elle est extrêmement rapide.

Installation de JpegOptiom sur Ubuntu

sudo apt-get update apt-get install jpegoptim

Exécution de jpegoptim

Je vous montre ci-dessous comment exécuter jpegotim de différentes façon afin d’avoir un aperçu global. Il est parfois utile de compresser par lot et parfois par fichier.

Exécuter jpegotim en ligne de commande
ParamètreUtilisation
–strip-allEnlève tous les marquer de l’image (nom du programme utilisé,…), à utiliser pour satisfaire Google
-mChoix de la qualité à avoir entre 0 et 100. Si vous mettez ce paramètre, la compression ne sera plus sans perte ou lossless.
-pPréserve les différentes informations de date
-PPréserve les permissions de l’image originale.

jpegotim change le proriétaire du fichier
Les version précédentes à la version 1.4.2 ne permettent pas de garder les permissions (owner/group) ce qui a pour effet que, si vous exécuter le script depuis une cron, le propriétaire peut changer et rendre l’image inaccessible pour l’utilisateur.
Pour voir votre version exécuter simplement: #jpegotim –version

Exécuter en ligne de commande

La ligne ci-dessous compresse toutes les images de type JPG qui se trouvent dans mon dossier /img/

find /home/web-presence/public_html/img/ -type f -name '*.jpg' -exec jpegoptim -m80 -P --strip-all {} \;

Exécuter depuis une cron php

Pour compresser toutes les images de type JPG modifiée il y a moins de 60 minutes qui se trouvent dans le dossier img/cache, exécuter un fichier php contenant les commandes suivantes :

find /home/web-presence/public_html/img/cache/ -type f -name '*.jpg' -cmin -60 -exec jpegoptim -m75 -P --strip-all {} 

Compresser les jpeg depuis php

Pour compresser une image de type JPG depuis un script php exécuter la commande ci-dessous:

exec("exec jpegoptim -m80  -P --strip-all /chemin_de_l_image/nom_du_fichier.jpg");

Optipng

Vous l’aurez bien sur compris, optipng est lui conçu pour compresser des images png. Plus lent que pour les jpegs, il est néanmoins très utile et selon les réglages pas trop lent.

Installation de Optipng sur Ubuntu

sudo apt-get update
apt-get install optipng

Paramètres principaux

Paramètre Utilisation
-strip all Enleve toutes les meta données de l’image. Elles sont inutiles et prennent de la place.
-o Choix du niveau d’optimisation entre 0 et 7. La valeur par défaut est 2. Plus le niveau de compression est élevé, plus la vitesse d’exécution sera lente.
-preserve Tente de préserver les attributs du fichier

Exécuter Optipng

Les principes sont les mêmes que pour Jpegoptim. Je donne ici 2 exemple, le premier avec une recherche de fichier et le second en lui transmettant le nom du fichier. Je vous incite à regarder plus haut pour plus d’exemples.

optipng -o4 -strip all mon_image.png
find /home/web-presence/public_html/img/ -type f -name '*.png' -exec optipng -o4  {} \;

Publié le

Comment passer au protocole HTTP2

Bien que le ptotocole HTTP2 soit encore en mode expérimental, je l’utilise sur de nombreux site sans le moindre problème. Il permet de réduire considérablement les temps de chargement comme le montre les waterfall tout en bas de la page. La seule limitation est qu’il faut avoir son site en HTTPS. Je vais vous montrer ci-dessous comment l’installer et l’activer.

HTTP/2 ne fonctionne qu’avec des sites tournant en HTTPS

Installer et activer HTTP2

Installer HTTP2 est simplissime. Pour se faire suivez les instructions ci-dessous.

sudo a2enmod http2

Si vous le message d’erreur suivant c’est que vous ne l’avez pas installé et poursuivez. Si vous n’avez pas d’erreur allez directement à la section configuration.

ERROR: Module http2 does not exist!

Installation

Pour passez à l’installation proprement dite, exécutez les commandes suivantes:

sudo add-apt-repository -y ppa:ondrej/apache2
sudo apt-key update
sudo apt-get update
# Répondez non à la question pour savoir s'il faut écraser la config
sudo apt-get --only-upgrade install apache2 -y 
sudo a2enmod http2
/etc/init.d/apache2 restart

Activez http2 pour votre domaine

Pour activer le protocole sur votre domaine, effectuez la modification suivante et redémarrer.

# Fichier: etc/apache2/site-enabled/votedomaine.conf
#SSLCertificateChainFile ....
Protocols h2 http/1.1
#SuexecUserGroup "#1005" "#1005"
/etc/init.d/apache2 restart

Contrôle

Pour contrôler si les changements ont été pris en compte, le plus simple est de regarder avec l’outil de développement chrome (F12) quel est le protocole utilisé. Attention, en fonction de vos directives d’expiration vous devez cliquer sur CTRL + F5

Détection du protocole utilisé avec Chrome Developer Tools

Temps de chargement HTTP 1.1 versus HTTP2

Les graphiques ci-dessous sont de comparatif de waterfall de chargement entre la version 1.1 et 2 de HTTP. Ils permettent de voir très clairement les avantages en terme de temps que la nouvelle version apporte.

Temps de chargement http versus http2 sur GTmetrix.com

Publié le

Comment migrer son site en HTTPS

Passez son site en HTTPS à plusieurs avantages non-négligeables. Il donne une image de qualité aux visiteurs, il accroît la sécurité ce qui est très utile si vous transmettez des données sensibles comme des mots de passe ou information de paiement, il est quelque chose d’officiellement positif pour Google et permet d’utiliser la technologie HTTP2 qui réduit les temps de chargement.

Dans ce tuto, je vais vous expliquez comment le mettre en place sans rien oublier. Dans cet exemple, j’utilise une machine Ubuntu 16.04 installé comme expliqué ici et avec un achat de certificat chez Gandi.net.

Générer la clé SSL sur le serveur et valider les infos

Commençons par générer les fichiers requis sur notre serveur. Effectuez la commande suivante et répondez aux questions posées.

openssl req -nodes -newkey rsa:2048 -sha256 -keyout mon_domaine.key -out mon_domaine.csr
Génération des fichiers

Mettez l’url de votre site dans le champs Common Name

Cette commande a crée 2 fichiers : la clé publique en .csr et la clé privée en .key que nous devons garder et qu’il faudra utiliser. Lors de l’achat de sur Gandi.net, il faut transmettre la clé .CSR. Maintenant, il faut poursuivre l’achat et attendre que le registrar confirme l’activation du certificat.

Une fois le certificat activé, il faut maintenant copier ou déplacer les clés générées sur le serveur et télécharger la clé intermédiaire (.pem) depuis votre interface d’administration chez votre registrar. J’utilise les commandes suivantes pour les déplacer.

cp mon_domaine.csr /etc/ssl/certs/mon_domaine.csr 
cp mon_domaine.key /etc/ssl/private/mon_domaine.key

Vous devez actuellement avoir les fichier suivants sur votre serveur:

/etc/ssl/certs/mon_domaine.crt clé fournie par le registrar
/etc/ssl/certs/mon_domaine.csr la clé publique
/etc/ssl/private/mon_domaine.key la clé privée
/etc/ssl/certs/GandiStandardSSLCA2.pem le certificat intermédiaire pour rester compatible avec les vieux navigateurs fournie par le registrar

Ajouter le certificat SSL

Une fois tous les fichiers nécessaires en place, je modifie mon fichier etc\apache2\sites-enabled\mon_domaine.conf de la façon suivante. Je recopie tout le contenu de VirtualHost *:80 .. /VirtualHost et le renomme en VirtualHost *:443 … /VirtualHost et j’ajoute la position de mes fichiers crt, key et pem. Pour arriver à quelque chose qui ressemble à cela:

ServerName web-presence.ch
	DocumentRoot /home/web-presence/public_html
	SSLEngine on
	SSLCertificateFile /etc/ssl/certs/web-presence.crt
	SSLCertificateKeyFile /etc/ssl/private/web-presence.key
	SSLCertificateChainFile  /etc/ssl/certs/GandiStandardSSLCA2.pem
	...

Je m’assure ensuite que le fichier etc\apache2\ports.conf contient la ligne suivante:

Listen 443

Je m’assure finalement que ssl est activé sur mon serveur et je redémarre.

sudo a2enmod ssl
/etc/init.d/apache2 restart

Votre site devrait maintenant être accessible avec les https. Pour s’assurer que tout est en ordre, vous pouvez par exemple le tester avec sslshopper. Allez voir l’article faire une redirection depuis le fichier htacces

Checklist pour passer sans erreur de HTTP en HTTPS

Assurez-vous que toutes les images et les liens sont maintenant en https.
Des outils comme ScreaminFrog permettent de faire cela très facilement.
Contrôler vos balises hreflang et canonical.
Créer une nouvelle propriété dans la Search Console de Google.
Copiez les fichiers de désaveux de liens si vous en avez.
Contrôler les fichiers sitemap
Contrôler les fichiers CSS
Modifier si nécessaire votre fichier robots.txt
Changer un maximum de backlink sur la nouvelle adresse