Dans ce tutoriel nous allons voir les bases de l'installation d'un VPS sur UBUNTU 14.10. Les consignes d'installation sont valables jusqu'à la version actuelle de l'écriture de l'article soit : 15.10, les consignes d'installation de apache2 et du mode ssl sont aussi récentes. Je ne vais pas rédiger la documentation complète (avec installation de ssh et de sftp) car la plupart du temps internet est déjà riche en information sur ce sujet et l'achat d'un VPS sur digitalocean ou bluevm ne nécessite aucune démarche d'installation car ceux-ci sont déjà comprises dans les formules VPS.
Les différents points que nous allons aborder sont :
- L'installation d'apache 2, l'installation de mysql, php etc...
- Le changement de mot de passe mysql
- La configuration des virtualhost
- La configuration DNS des domaines et sous-domaines
- L'installation d'un certificat ssl (avec wildcard multiples sous domaines et domaines)
- La configuration des virtualhost ssl
- La migration d'un Wordpress sur SSL
- Les bons chmod pour Wordpress
Astuces :
- Protèger un dossier avec un fichier .htaccess
- Configuration de tâches planifiées
- Faire une sauvegarde de vos sites
- SSL port forwarding avec nodeJS, expressJS et apache2 en dessous.
Liens connexes
Liens annexes
- NodeJS, Angular, ExpressJS en haut de PHP Apache.
- Serveur Mail POSTFIX
Installation de lampp
Premièrement nous installons Mysql 5 de cette manière :
apt-get install mysql-server mysql-client
Une invite de commande s'affichera sans doutes pour vous demander de saisir vos identifiants (voir ci-après)
New password for the MySQL "root" user: Repeat password for the MySQL "root" user:
On installe apache 2
apt-get install apache2
Le chemin par défaut des fichiers de configuration de apache2 sur ubuntu se situe dans les dossiers suivants :
Pour les Hôtes virtuel:
/etc/apache2/sites-available/000-default.conf
Le fichier de configuration :
/etc/apache2/apache2.conf
Le répertoire par défault du serveur web
/var/www/html/
On installe PHP 5
apt-get install php5 libapache2-mod-php5
On redémarre le serveur apache
service apache2 restart
On vérifie si php fonctionne bien (apt-get install nano):
nano /var/www/html/info.php
Rajouter les lignes suivantes :
<?php phpinfo(); ?>
Puis ctrl+o pour sauvegarder et ctrl+x pour quitter.
Pour rechercher des modules PHP intéressant à installer effectuer la commande suivante :
apt-cache search php5
En général on installe par la suite ces modules aditionnels.
apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
Si vous le souhaitez vous pouvez installer l'accélérateur Xcache de php
apt-get install php5-xcache
On redémarre le service du serveur apache :
service apache2 restart
On navigue sur notre fichier phpinfo :
http://localhost/info.php
Si besoin est vous pouvez installer phpMyAdmin
apt-get install phpmyadmin
Personnellement,je préferres adminer qui est bien plus lèger et qui est contenu dans un seul fichier php.
Changement de mot de passe sur mysql
Si par un quelconque hasard, lorsque vous avez réinstallé mysql et que la touche tabulation avec le shell ssh ne fonctionnait pas vous avez probablement installé mysql sans mot de passe root, l'erreur étant humaine il est toujours possible de le modifier avec les commandes suivantes :
changer le mot de passe mysql lorsque aucun mot de passe n'a été assigné
mysql -u root -p use mysql; update user set password=PASSWORD("Votremotdepasse") where User='root'; flush privileges;
Optimisation de innodb pour éviter à vos fichiers d'échanges mysql de prendre trop de volume.
SET GLOBAL innodb_fast_shutdown = 1; exit;
La configuration des virtualhost
La configuration des hôtes virtuels est utile dans la mesure où vous n'avez pas un budget conséquent en IT, et que vous souhaitez conserver une souveraineté de vos données les plus complètes, le choix du VPS contrôlé avec SSH est un moyen à bas coût permettant de mettre à disposition du contenu scalable, et performant sans pour autant engendré des coût d'hébergement et de maintenance supplémentaire liés à la gestion des serveurs web car ceux ci sont reliés à la même machine. Toutefois des contraintes de sécurité doivent être prise en compte dans l'utilisation de ce type d'architecture, c'est pourquoi nous aborderons plus loin dans cet article l'ajout d'un certificat SSL muni d'un cryptage récent. Dans les exemples suivant, notre nom de domaine est domaine.tld répondant à la commande hostname domaine (FQDN).
En premier lieu nous allons créer un dossier dossier pour héberger notre site et y assigner les droits d'utilisateur correctement puis modifier la page d'index pour prendre en compte visuellement les modifications:
sudo mkdir -p /var/www/domaine.tld/public_html &&sudo chown -R $USER:$USER /var/www/domaine.tld/public_html &&sudo chmod -R 755 /var/www &&nano /var/www/domaine.tld/public_html/index.html
Pour installer notre hôte virtuel sur apache nous ferons de la sorte :
Copier le fichier virtualhost
/etc/apache2/apache2.conf
On édite le fichier de configuration :
nano /etc/apache2/sites-available/domaine.tld.conf
Puis on ajoute :
<VirtualHost *:80> ServerAdmin contact@domaine.tld DocumentRoot /var/www/domaine.tld/public_html ServerName domaine.tld ServerAlias www.domaine.tld *.domaine.tld ErrorLog /var/www/domaine.tld/logs/error.log #CustomLog /var/www/domaine.tld/logs/access.log <Directory "/var/www/domaine.tld/public_html"> Options FollowSymLinks AllowOverride All </Directory> </VirtualHost>
Note 1 : La directive serveralias permet de redirriger les enregistrements DNS A ou CNAME vers le sous domaine www, l'expression régulière * dit à apache de redirriger tout les sous domaines vers cet hôte virtuel vers l'emplacement public_html inscrit dans la configuration. A savoir : Le sous-domaine est identifiable car celui ci est placé avant la syntaxe du domaine fully qualified domain name, par exemple blahblah.domaine.tld est le sous-domaine de domaine.tld. De plus la directive situé dans la balise directory ci-dessus est importante car celle-ci permet de redirriger correctement le contenu grâce aux liens symbolique utilisés dans une architecture avec de multiples hôtes virtuels. De plus elle facilite l'utilisation de la réécriture des URL dans votre Virtualhost.
Nous disons à apache d'activer la configuration du site domaine.tld compris dans le dossier /sites-available/
sudo a2ensite domaine.tld.conf
On redémarre le service apache2
sudo service apache2 restart
Note 2 : En cas d'erreur, pour désactiver un domaine on se place dans le dossier de configuration des hôtes virtuels apache2 ( sites-available/ ) puis nous effectuons la commande suivante :
sudo a2dissite domaine.tld.conf
Nous redémarrons ensuite le service apache2
sudo service apache2 restart
Je vous conseil aussi d'activer la réécriture des url à l'aide du mode rewrite :
sudo a2enmod rewrite
En cas d'erreur pour le désactiver :
sudo a2dismod rewrite
La configuration des dns
Une fois que nos serveurs sont configurer on peut de ce fait configurer les dns pour qu'ils pointent vers l'ip de notre serveur web, dans ce tutorial nous utilisons une IP statique V4, mais selon votre configuration vous devrez adapter ces informations à votre architecture.
Si vous avez fait l'acquisition d'un nom de domaine sur GoDaddy, vous n'êtes pas dans la nécessité de configurer de manière personnalisée vos serveurs de noms (servername), vous n'êtes pas non-plus dans l'obligation de créer vos propres serveurs de résolution DNS sur votre propre IP à l'aide de l'outil bind9.
L'ipv6 nécessite des serveurs de noms différents de l'ipv4 permettant de résoudre le nom de domaine, et nécessite l'insertion d'un ou plusieurs enregistrement AAAA (dns records) dans les zones dns.
L'avantage de l'ipv6 est la facilité de cryptage des communication dns -> adresse IP, et permet de ralentir le scanning de ports malveillant avec des outils comme nmap (entre autres).
Dans notre configuration actuelle IPV4 on doit ajouter un enregistrement A pointant sur l'adresse IP publique de notre serveur web 111.222.255.44. Laissez le TTL (time to live) par défaut.
Hôte : @ Pointe sur : 111.222.255.44 TTL : 1h
Si vous le souhaitez vous pouvez saisir aussi un sous domaine :
Hôte : www Pointe sur : 111.222.255.44 TTL : 1h
Ou rajouter un champ MX si vous comptez par la suite utiliser votre propre SMTP.
Hôte : smtp Pointe sur : 111.222.255.44 TTL : 1h
Patientez quelque temps (peut aller jusqu'à 48h) pour que la propagation DNS s'effectue.
Installation de ssl
Désormais, nous allons nous procurer un certificat ssl valide afin de crypter nos communications. Le site startssl.com mets à disposition des certificats ssl class1 valides et gratuits dans le cas ou vous faites la demande d'un seul et unique certificat pour un domaine si et seulement si ce domaine n'a pas de sous domaines, et que vous ne souhaitez pas tirer profit de votre domaine. Je vous recommande d'utiliser le plan payant car celui-ci est bon-marché, de plus il est possible d'avoir un certificat de type wildcard pour de multiples domaines et sous-domaines, ce qui est idéal pour notre architecture de serveur avec hôtes virtuels.
Note : startSSL est une autorité de certification valide de class2 ou supérieure, cette autorité est valable depuis plusieurs années dans nos navigateurs modernes, le cryptage utilisé est robuste, le support client est réactif et exemplaire si vous savez parler anglais et que vous êtes clairs sur vos intentions. Vous devez être le propriétaire du nom de domaine pour valider vos domaines, vous devez aussi avoir des connaissances en cryptage et création de certificats au préalable, être familier avec les outils openssl sur linux et la faille heartbleed est un plus.
Les certificats de class2 web fournis pas startssl sont du type :
chain certificate
private key public key
Note : la révocation de certificat est payante, de plus la création de multiples certificats pour les mêmes domaines peut former un risque d'usurpation d'identité, pensez déjà aux domaines que vous souhaitez certifier avant de créé des certificats à la place de recréer des certificats en rajoutant uniquement quelque sous-domaines. Les certificats fournis que j'ai eu l'occasion de tester sont des certificats web et s/mime pour le cryptage des email.
Au bout de votre démarche de création de certificats https de class2 vous aurez 3 fichier + une passphrase que vous aurez sélectionnée préalablement. Votre clé privée crypté en 4096 RSA ssl.key Votre clé publique ssl.crt Le chain certificat sub.class2.server.ca.pem
Votre passphrase
tutorial2015
L'installation de certificats sur apache2
Il suffit de placer les 3 fichiers précédents dans un dossier non publique de votre serveur apache.
Dans ce tutoriel la destination est /var/www/ssl/
Activer le mod SSL de apache2
sudo a2enmod ssl
Pour désactiver ssl
sudo a2dismod ssl
Pour éviter de saisir votre passphrase avec la ligne de commande créez un fichier passphrase.sh
nano /var/www/ssl/passphrase.sh
Puis ajoutez.
#!/bin/sh echo "tutorial2015"
Sauvegardez (ctrl-O et quittez ctrl-X)
Editez votre fichier de configuration comme suit :
nano /etc/apache2/sites-available/domaine.tld.conf
Puis ajoutez.
SSLPassPhraseDialog exec:/var/www/ssl/passphrase.sh <VirtualHost *:80> ServerAdmin contact@domaine.tld ServerName domaine.tld ServerAlias www.domaine.tld DocumentRoot /var/www/domaine.tld/public_html <Directory "/var/www/domaine.tld/public_html"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin contact@domaine.tld ServerName domaine.tld ServerAlias www.domaine.tld DocumentRoot /var/www/domaine.tld/public_html SSLEngine on SSLCertificateChainFile /var/www/ssl/sub.class2.server.ca.pem SSLCertificateFile /var/www/ssl/ssl.crt SSLCertificateKeyFile /var/www/ssl/ssl.key <Directory "/var/www/domaine.tld/public_html"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> </IfModule>
Sauvegardez (ctrl-O et quittez ctrl-X)
Vous pouvez relancer le service apache2.
service apache2 restart
Pour forcer votre site à utiliser le https , placez dans votre dossier public_html racine pour créer une règle de réécriture:
nano .htaccess
Et :
RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Attribuez les droits adaptés au fichier htaccess
chmod 644 .htaccess
La migration d'un Wordpress sur SSL
Nous allons migrer nos anciens wordpress sur ssl pour cela uploadez votre wordpress dans votre dossier public_html. Copiez les plugins suivant dans les répertoires plugins (/var/www/domaine.tld/public_html/wp-content/plugins/):
Puis activez les dans le panneau d'administration wordpress. Editez votre fichier .htaccess wordpress (dans ma configuration j'utilises le plugin SEO de Yoast)
nano .htaccess
Puis..
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^sitemap_index.xml$ /index.php?sitemap=1 [L] RewriteRule ^locations.kml$ /index.php?sitemap=wpseo_local_kml [L] RewriteRule ^geo_sitemap.xml$ /index.php?sitemap=geo [L] RewriteRule ^([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2$ RewriteRule ^([a-z]+)?-?sitemap.xsl$ /index.php?xsl=$1 [L] RewriteCond %{SERVER_PORT} !^443$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Sauvegardez (ctrl-O et quittez ctrl-X)
Modifiez le fichier wp-config.php et rajoutez la ligne suivante :
define('FORCE_SSL_ADMIN', true);
Réinsérez votre base de donnée wordpress dans votre base mysql
mysql -u utilisateur -pvotremotdepasse basededonneewordpress < basededonneewordpress.sql
Dans le panneau de configuration wordpress , naviguez sur l'onglet règlages-> général -> addresse web de wordpress et saisir : https://domaine.tld
De même pour le champ "adresse web du site (URL)
https://domaine.tld
Le bon chmod pour wordpress
Habituellement , wordpress a besoin des droits configuré en 755 pour fonctionner correctement, toutefois certains plugins qui permettent de modifier des fichier avec l'interface d'administration ne fonctionnent pas correctement si les dossiers ou fichiers n'ont pas les droits d'écriture appropriés.
Voici comment configurer les droits d'écriture de lecture et d'exécution correctement quelque-soit votre installation:
chmod 777 /var/www/domaine.tld/public_html/.htaccess chmod 755 -R /var/www/domaine.tld/public_html/ chmod 777 -R /var/www/domaine.tld/public_html/wp-content/themes/domaine.tld/ chmod 777 -R /var/www/domaine.tld/public_html/wp-content/uploads/ chmod 777 -R /var/www/domaine.tld/public_html/wp-content/upgrade/ chmod 777 -R /var/www/domaine.tld/public_html/wp-content/plugins/ chmod 777 /var/www/domaine.tld/public_html/robots.txt chmod 640 /var/www/domaine.tld/public_html/wp-config.php
Protèger un dossier avec un fichier .htaccess
Pour protèger un dossier ou un fichier à l'aide d'un mot de passe facilement on a besoin de 2 fichiers..
.htaccess .htpasswd
A savoir : vous devez configurer les droits de lecture des fichier de la sorte.
chmod 0644 .htpasswd chmod 0644 .htaccess
Pour crypter le mot de passe créez un fichier php:
<?php echo crypt("votremotdepasse"); ?>
fichier .htaccess :
AuthUserFile /var/www/domaine.tld/espaceprotege/.htpasswd AuthName "Votre message d'espace protègé" AuthType Basic require user utilisateur
fichier .htpasswd
nomdutilisateur:votremotdepassecrypté
Note : Pour de multiples utilisateurs, dans le fichier .htaccess changer la directive :
require user utilisateur
par
require valid-user
Puis ajouter un utilisateur par ligne dans le fichier htpasswd.
Configuration de tâches planifiées
Sur linux , les tâches planifiées sont appelées cron, c'est un système trés ancien. Voici une astuce pour planifier l'execution d'un script toutes les 10 minutes :
crontab -e
rajouter les lignes suivante pour executer un monscript.sh toute les 10 minutes
*/10 * * * * sh /var/www/domaine.tld/monscript.sh
Pour supprimer les taches planifiées
crontab -r
Faire une sauvegarde de vos sites
Voici quelques commandes utiles pour faire des sauvegardes de vos sites.
Sauvegarde de mabase.sql
mysqldump -u utilisateur -pmotdepasse mabase > mabase.sql
Compresser les fichier sql en archive .tar.gz avec tar :
tar -zcvf sql.tar.gz *.sql
Compresser le dossier /var/www/
tar -zcvf sql.tar.gz *.sql
Copier la configuration de vos virtual Host
cp -R /etc/apache2/sites-available/ /var/www/domaine.tld/public_html/espaceprotege/ && tar -zcvf sites-availables.tar.gz /var/www/domaine.tld/public_html/espaceprotege/sites-available/
Pour télécharger de manière récursive votre dossier protégé :
wget -r --http-user=utilisateur --http-passwd='votremotdepasse' https://domaine.tld/espaceprotege/
Ou simplement :
wget -r https://utilisateur:votremotdepasse@domaine.tld/espaceprotege/
SSL port forwarding avec nodeJS, expressJS et apache2 en dessous.
Quelque chose d'utile et rarement utilisé est de travailler sur un serveur apache muni d'une instance nodeJS en execution au top de votre architecture. Sur apache2 il est possible de redirriger votre connection de serveur node (sans passer par un serveur nginx) sur expressJS en effectuant un port forwarding, c'est trés utile lorsqu'on programme souvent en PHP. Le port forwarding permet de redirriger un port de votre serveur (le port 3000 par défaut de expressJS) vers le port 80 pour avoir accès à votre site fait sur node pour avoir une adresse http://domaine.tld propre , plutôt qu'une url comme http://domaine.tld:3000/. De plus il est aussi possible de port-forwarder vers le port 443 directement en changeant la directive apache dans le fichier sites-available/domaine.tld.conf.
Voici mon fichier domaine.tld.conf qui redirrige le port utilisé par mon application nodejs vers apache , dans le cas suivant le fichier public_html est le dossier contenant mon application nodejs:
SSLPassPhraseDialog exec:/var/www/ssl/passphrase.sh <VirtualHost *:80> ServerAdmin contact@domaine.tld ServerName domaine.tld DocumentRoot /var/www/domaine.tld/public_html #active le port forwarding ProxyPreserveHost on ProxyPass / http://domaine.tld:3000/ ProxyPassReverse / http://domaine.tld:3000/ <Directory "/var/www/domaine.tld/public_html"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin contact@domaine.tld ServerName domaine.tld DocumentRoot /var/www/domaine.tld/public_html SSLEngine on SSLCertificateChainFile /var/www/ssl/sub.class2.server.ca.pem SSLCertificateFile /var/www/ssl/ssl.crt SSLCertificateKeyFile /var/www/ssl/ssl.key #active le port forwarding ProxyPreserveHost on ProxyPass / http://domaine.tld:3000/ ProxyPassReverse / http://domaine.tld:3000/ ProxyRequests off <Directory "/var/www/domaine.tld/public_html"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> </IfModule>
Liens connexes
- Serveurs VPS , BlueVM, digitalocean.
- Noms de domaines, godaddy,namecheap.
- Les chmod wordpress ici.
- Certificats ssl, startSSL.
- Installation de lampp ici.
- Pointer son nom de domaine vers son ip, ici.
- Configurer ses virtualhost, ici.
- Instruction d'installation de certificat sur startSSL.
- Instruction d'installation de certificats sur ubuntu.
- crontab toute les 10 minutes sur unix.
- Configuration de multiples certificats ssl sur apache, ici, et la .
- Documentation sur la mise en place des tâches cron sur linux.
Liens Annexes
Serveur mail
Vous l'aurez sans doutes remarqué le long de cet article mais nous n'avons pas parlé de l'installation d'un serveur mail sur VPS, bien que beaucoup d'individus utilisent des solutions dans le cloud et que les fournisseur de noms de domaines comprennent souvent dans leurs formule client des pack permettant de forwarder les mails ou simplement proposent à leurs clients leur propre messagerie sur squirrel, roundcube par exemple. L'installation d'un serveur de transfert de mail est toutefois possible , cependant les démarches d'installation peuvent faire reculer plus d'une personnes. Pour ma part, c'est le manque de place sur mon vps, et de financement qui m'a fait préférer une solution basée dans le cloud comme gmail. Toutefois, rien ne nous empêche d'utiliser notre messagerie en local ou simplement d'apprendre comment forwarder ses mail avec postfix. Je conseil l'installation d'un serveur de mail BYOD (bring your own device) à toute les infrastructure de plus de 50 personnes ou employés les utilisant dans un cadre professionnel car elles comprennent un avantage de souveraineté quant à l'utilisation de leurs données sur leur propre serveur non négligeable. Sinon il est toujours possible d'effecuer une des manipulations suivantes pour avoir un email @domaine.tld personnalisé et le relier discrètement sur gmail pour profiter de l'espace que propose gmail pour stocker ses email et ne pas passer par leur formule forfaitaire payante proposée par google apps.
- Mail forwarding sur postfix et debian ici.
- Postfix et serveur Virtuel ici.
- Postfix et clamSMTP .
- Configurer ses DNS avec Postfix ici.
- Postfix sur ubuntu 14.04 ici.
- Postfix et dovecot ici.
- Postfix et les certificats startSSL ici.
- Postfix pour forwarder des addresse email sur ubuntu ici.
- Postfix basic setup ici
- Méthodes pour Forwarder ses mail (avec adresse de retour) vers gmail ici et la .
Développement sur NodeJS, Angular, ExpressJS, PHP, MySQL.
- Bien configurer son package.json, ici.
- NodeJS et Apache2, avec expressJS en même temps ici.
- NodeJS et Mysql tutorial ici.
- Rendering d'un fichier html avec nodeJS ici.
- Tutorial expressJS et moteur de templates ejs , requete get et post ici.
- Angular, nodeJS , expressJS ,Jade (moteur de template) et mongodb tutorial ici.
- Stopper le processus nodeJS ici.
- Installation et configuration de nodeJS et forever ici.
- Créer une application toute simple sur expressJS ici.
- Installation de nodeJS et Angularjs ici.
- SSL apache et nodejs ici.