Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.
Bonjour à tous,
Premier gros article de l’année et surtout, je pense, le plus gros que j’ai jamais fais sur ce blog, on va voir comment faire un serveur web prêt pour 2016.
Au jour de l’écriture de cette procédure, on va installer Nginx 1.9.9 (mainline) avec le support de http 2, la nouvelle version du protocole http. Attention, ALPN ne sera pas supporté car Nginx n’a pas compilé la 1.9.9 avec la dernière version de OpenSSL *facewall* …
PHP 7.0, la dernière version de stable de PHP, beaucoup plus rapide que PHP 5.6.
MariaDB 10.1, la dernière version stable de MariaDB qui inclus les fonctionnalités propres à Mysql 5.6 et 5.7.
Et l’intégration du renouvellement automatique des certificats SSL sur le serveur avec Let’s Encrypt qui vous permettra de créer et renouveler des certificats SSL gratuits pour vos sites.
Bon, je vous préviens, c’est compliqué (par rapport aux autres procédures que j’ai fait sur ISPConfig.
On va faire de la compilation à la main, on va bouffer de la ligne de commande, on va tuner du fichier de configuration, piocher dans des dépôts externes, dans stretch … bref, heureusement que j’ai fait la majorité du boulot pour vous 🙂
Installation des sources
Pour commencer, nous allons installer des sources personnalisées car, on va prendre beaucoup de ressources en dehors des dépôts Debian officiel.
Commencez par créer une policy APT pour définir la distribution par défaut, cela évitera que votre système se mette à jour avec Stretch (la prochaine version de Debian).
Créez un fichier de configuration avec la commande suivante :
nano /etc/apt/apt.conf.d/99defaultrelease
Et remplissez-le avec ceci :
APT::Default-Release "jessie";
Maintenant, renseignez toutes les sources nécessaires dans votre sources.list :
rm /etc/apt/sources.list nano /etc/apt/sources.list
#Stable deb http://mirrors.kernel.org/debian/ jessie main contrib non-free deb-src http://mirrors.kernel.org/debian/ jessie main contrib non-free deb http://security.debian.org/ jessie/updates main contrib non-free deb-src http://security.debian.org/ jessie/updates main contrib non-free deb http://mirrors.kernel.org/debian/ jessie-updates main contrib non-free deb-src http://mirrors.kernel.org/debian/ jessie-updates main contrib non-free deb http://mirrors.kernel.org/debian/ jessie-backports main contrib non-free deb-src http://mirrors.kernel.org/debian/ jessie-backports main contrib non-free #Stretch - OpenSSL deb http://mirrors.kernel.org/debian/ stretch main deb-src http://mirrors.kernel.org/debian/ stretch main #NGINX - Mainline deb http://nginx.org/packages/mainline/debian/ jessie nginx deb-src http://nginx.org/packages/mainline/debian/ jessie nginx #Dotdeb - php7.0 7 deb http://packages.dotdeb.org jessie all deb-src http://packages.dotdeb.org jessie all #MariaDB deb [arch=amd64,i386] http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main deb-src http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main
Maintenant, installez les packages nécessaires :
apt-get update && apt-get install software-properties-common python-software-properties -y
Téléchargez les clés nécessaires pour les dépôts et installez-les :
mkdir /tmp/keys/ cd /tmp/keys wget http://nginx.org/keys/nginx_signing.key wget https://www.dotdeb.org/dotdeb.gpg apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db #MariaDB apt-key add nginx_signing.key && apt-key add dotdeb.gpg
Maintenant, mettez votre système à jour :
wget -O- https://raw.githubusercontent.com/stylersnico/debian-scripts/master/upgrade-and-clean-system.sh | sh
Installation d’ISPConfig et des composants nécessaires :
Installation des composants de base :
Installez tous les packages nécessaires :
apt-get install mariadb-server openssl rkhunter binutils clamav clamav-daemon zoo unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl nginx php7.0-fpm php7.0-curl php7.0-mysql php7.0-gd php7.0-intl php7.0-imap php7.0-pspell php7.0-recode php7.0-snmp php7.0-tidy php7.0-json php7.0-opcache fcgiwrap memcached pure-ftpd-common pure-ftpd-mysql bind9 dnsutils fail2ban build-essential autoconf automake libtool flex bison debhelper binutils -y
apt-get install -t stretch openssl
Installez la dernière version de Jailkit :
cd /tmp wget http://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz tar xvfz jailkit-2.19.tar.gz cd jailkit-2.19 ./debian/rules binary cd .. dpkg -i jailkit_2.19-1_*.deb rm -rf jailkit-2.19*
Si vous voulez un accès externe aux bases de données MariaDB, vous devez modifier le fichier de configuration de MariaDB :
nano /etc/mysql/my.cnf
Recherchez l’option bind-address à la ligne 47 et commentez la :
Avant :
bind-address = 127.0.0.1
Après :
#bind-address = 127.0.0.1
Sauvegardez en effectuant la combinaison de touches Ctrl+O et redémarrez MariaDB:
systemctl restart mysql
Maintenant, on va modifier la configuration de notre serveur FTP :
nano /etc/default/pure-ftpd-common
Vérifiez que le démarrage soit en STANDALONE et que virtualchroot soit sur TRUE
[...] STANDALONE_OR_INETD=standalone [...] VIRTUALCHROOT=true [...]
On va maintenant autoriser les sessions par TLS pour plus de sécurité
echo 1 > /etc/pure-ftpd/conf/TLS mkdir -p /etc/ssl/private/
On va maintenant générer un certificat SSL dans le dossier que l’on vient de créer :
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
Changez les permissions du certificat
chmod 600 /etc/ssl/private/pure-ftpd.pem
Redémarrez le serveur FTP :
/etc/init.d/pure-ftpd-mysql restart
Pour que Fail2Ban surveille notre serveur FTP nous allons devoir créer un fichier de configuration spécifique :
nano /etc/fail2ban/jail.local
Remplissez le avec ceci :
[pureftpd] enabled = true port = ftp filter = pureftpd logpath = /var/log/syslog maxretry = 3
On va maintenant créer un filtre :
nano /etc/fail2ban/filter.d/pureftpd.conf
Et le remplir avec cela :
[Definition] failregex = .*pure-ftpd: \(.*@\) \[WARNING\] Authentication failed for user.* ignoreregex =
On va commencer par utiliser l’assistance de sécurisation de MariaDB avec la commande suivante :
mysql_secure_installation
Ensuite, vous pouvez regarder cet article pour sécuriser un peu plus votre accès SSH !
Installation d’ISPConfig (la partie chiante) :
Et comme je l’ai indiqué si délicatement dans le titre, la partie compliquée de ce tutoriel arrive.
L’installateur d’IspConfig demande des fonctions MySQL marquée en deprecated sur php 5.6 et supprimée sur 7.0.
On va donc compiler le bordel en extension pecl pour php-cli pour l’installation :
apt-get install git php7.0-dev cd /tmp git clone https://github.com/php/pecl-database-mysql mysql --recursive && cd mysql phpize ./configure make make install
Une fois la compilation terminée, indiquez le chemin vers l’extension mysql.so dans le php.ini :
nano /etc/php/7.0/cli/php.ini
Rajoutez cette ligne à la fin du fichier :
extension = /usr/lib/php/20151012/mysql.so
Redémarrez php :
systemctl restart php7.0-fpm
Maintenant, installez ISPConfig avec les commandes suivantes :
cd /tmp wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz tar xfz ISPConfig-3-stable.tar.gz cd ispconfig3_install/install/ php -q install.php
Suivez les instructions de l’installateur, mais lorsqu’il vous laissera le choix entre l’installation standard et expert, choisissez expert
Select language (en,de) [en]:
Installation mode (standard,expert) [standard]: expert
Lorsqu’il vous demandera pour la configuration des mails, il faudra lui répondre non, car nous n’avons pas installé postfix.
Configure Mail (y,n) [Y]: n
Vous pouvez laisser tous les autres paramètres par défaut.
Maintenant, la fin de l’installation d’ISPConfig va foirer, c’est pas normal, don’t worry.
Le script va foirer la configuration de Nginx donc on va finir à la main.
Lancez les commandes suivantes pour copier les configurations nécessaires, générer les paramètres DH en 4096 et téléchargez le nginx.conf :
mkdir /etc/nginx/sites-enabled/ cp /etc/nginx/sites-available/apps.vhost /etc/nginx/sites-enabled/000-apps.vhost cp /etc/nginx/sites-available/ispconfig.vhost /etc/nginx/sites-enabled/000-ispconfig.vhost rm -rf /etc/php/7.0/fpm/pool.d/ ln -s /etc/php5/fpm/pool.d /etc/php/7.0/fpm/pool.d cd /etc/ssl/certs && openssl dhparam -out dhparam.pem 4096 cd /etc/nginx/ rm nginx.conf wget https://www.abyssproject.net/wp-content/uploads/2016/01/nginx.conf_.txt mv nginx.conf_.txt nginx.conf service php7.0-fpm restart && service nginx restart
Intégration de HTTP 2 et Let’s Encrypt à ISPConfig :
Bon, vous n’avez pas encore Let’s Encrypt, mais ce n’est pas grave, on va déjà indiquer le chemin des certificats dans la configuration d’ISPConfig.
Éditez le fichier suivant :
nano /usr/local/ispconfig/server/conf/nginx_vhost.conf.master
Remplacez :
listen <tmpl_var name=’ip_address’>:443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
<tmpl_if name=’ipv6_enabled’>
listen [<tmpl_var name=’ipv6_address’>]:443 ssl;
</tmpl_if>
ssl_certificate <tmpl_var name=’document_root’>/ssl/<tmpl_var name=’ssl_domain’>.crt;
ssl_certificate_key <tmpl_var name=’document_root’>/ssl/<tmpl_var name=’ssl_domain’>.key;
</tmpl_if>
Par :
<tmpl_if name=’ssl_enabled’>
listen <tmpl_var name=’ip_address’>:443 ssl http2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
<tmpl_if name=’ipv6_enabled’>
listen [<tmpl_var name=’ipv6_address’>]:443 ssl http2;
</tmpl_if>
ssl_certificate /etc/letsencrypt/live/<tmpl_var name=’domain’>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<tmpl_var name=’domain’>/privkey.pem;
</tmpl_if>
Création d’un certificat et intégration à ISPConfig :
Dans un premier temps, on va générer un domaine pour l’interface d’ISPConfig.
Le mieux, c’est de créer un sous domaine spécifique à l’interface (ispconfig.domaine.com)
Installez Let’s Encrypt avec les commandes suivantes :
cd /etc git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ./letsencrypt-auto --help
Ensuite, générez un certificat pour votre domaine :
./letsencrypt-auto certonly --email email@domaine.com -d ispconfig.domaine.com --rsa-key-size 4096 -a webroot --webroot-path /usr/share/nginx/html/ cat /etc/letsencrypt/live/ispconfig.domaine.com/privkey.pem /etc/letsencrypt/live/ispconfig.domaine.com/cert.pem > /etc/ssl/private/pure-ftpd.pem /etc/init.d/pure-ftpd-mysql restart
Maintenant, éditez le vhost de nginx pour appliquer le certificat :
nano /etc/nginx/sites-enabled/000-ispconfig.vhost
ssl_certificate /etc/letsencrypt/live/ispconfig.domaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ispconfig.domaine.com/privkey.pem;
Et redémarrez Nginx :
service nginx restart
Vous pourrez ré-utiliser la commande suivante pour générer des certificats :
./letsencrypt-auto certonly --email email@domaine.com -d domaine.com -d www.domaine.com --rsa-key-size 4096 -a webroot --webroot-path /var/www/domaine.com/web/
Vous devrez les ajouter manuellement dans ISPConfig la première fois, le renouvellement sera ensuite automatisé.
Rendez-vous dans le dossier suivant :
cd /etc/letsencrypt/live/domaine.com
Vous aurez 4 fichiers présents dans ce dossier à savoir :
- cert.pem -> Certificat principal
- chain.pem -> Chaine de certificats supplémentaires
- fullchain.pem -> Certificat principal + Chaine de certificats supplémentaires
- privkey.pem -> Clé privé du certificat
Maintenant, il ne vous reste qu’à installer le certificat sur votre site web (onglet SSL) :
Renouvellement automatique des certificats :
Créez un fichier le.sh dans le dossier /root :
cd /root nano le.sh
Remplissez le avec ceci (modifiez les domaines et le mail bien-sûr) :
#!/bin/bash ###Remplace les Deny All par Allow All cd /etc/nginx/sites-enabled sed -i 's/deny all/allow all/g' *.vhost service nginx reload ###Renouvelle les certificats cd /etc/letsencrypt ./letsencrypt-auto certonly -a webroot --email mail@domaine.com -d domaine.com --rsa-key-size 4096 --webroot-path /var/www/domaine.com/web/ --renew-by-default --agree-tos ./letsencrypt-auto certonly -a webroot --email email@domaine.com -d domaine.com -d www.domaine.com --rsa-key-size 4096 --webroot-path /var/www/domaine.com/web/ --renew-by-default --agree-tos ###Remplace les Allow All par Deny All cd /etc/nginx/sites-enabled sed -i 's/allow all/deny all/g' *.vhost service nginx reload ###Certificat du serveur pour PureFTPD cat /etc/letsencrypt/live/ispconfig.domaine.com/privkey.pem /etc/letsencrypt/live/ispconfig.domaine.com/cert.pem > /etc/ssl/private/pure-ftpd.pem /etc/init.d/pure-ftpd-mysql restart
Rendez le script exécutable :
chmod +x le.sh
Ouvrez le crontab :
crontab -e
Et créez un cron pour faire le boulot à votre place :
30 12 10 * * /root/le.sh > /var/log/le.log
A ceux qui croyaient qu’installer un serveur web c’était facile :
Update this tutorial! 🙂
Bonjour, je l’ai installé PhpMyAdmin more’m pas en mesure d’ accéder au phpMyAdmin , donne cette erreur » 502 Bad Gateway» quand j’ouvre la page d’accès .
Utilisez ce chemin http: // my- ip: 8081 / phpmyadmin /
Bonjour, Tout d’abord, merci pour cet article, c’est exactement ce que je cherchais. Je l’ai bien suivi, sur un serveur dédié Kimsufi et tout se passe bien, ispconfig fonctionne avec le certificat letsencrypt. Mon problème est pour l’ajout de nouveau site, lorsque j’en ajoute un, il n’y a aucun fichier vhost qui se crée. Du coup, je pense que cela vient de ça, je reste bloqué en permanence sur « Welcome to nginx! ». J’ai regardé dans les fichiers de logs mais je n’ai pas eu d’erreur en particulier. Un complément d’information pour l’ajout d’un autre site please ? Merci bcp par… Voir plus »
Bonjour,
le certificate letsencrypt fonctionne-t-il sur le FQDN mais pas sur les sites ajoutés via ISPconfig ? Je crois que j’ai le meme problème.
Par contre si c’est bloqué sur « Welcome to nginx! » c’est peut-être le chemin qui est erroné:
root /usr/share/nginx/html
ou
/var/www/html
j’ai toujours pas compris lequel doit aller ou, mais je pense que l’emplacement ou se trouve le fichier « index.html » c’est là ou doit se situer le site… (je précise que je n’y connais pas grand chose:))
Bonjour,
je suis débutant et à l’ouest, quelqu’un pourrait me confirmer si c’est correct ?
Rajoutez cette ligne à la fin du fichier :
extension = /usr/lib/php/20151012/mysql.so
; Local Variables:
; tab-width: 4
; End:
extension = /usr/lib/php/20151012/mysql.so
J’ai un gros doute :s
et j’ai foiré au moins 3 installation
merci d’avance 🙂
Non c’est bien ça 🙂
Il n’y aurais pas une erreur que tu ne voit pas lors de ton installation ? Un message d’erreur ? Un service en rouge ?
Ok, merci.
finalement j’y suis arrivé mais ce qui me manquait c’est le HTTPS pour le site client sur ISPconfig, en HTTP le site s’affiche mais pas en HTTPS
je n’arrive pas à ajouter les certificats Letsencrypt sur ISPconfig, on dirait qu’il ne les prend pas en compte.
Je vais tout reprendre depuis le début et voir ce que ça donne.
J’aimerais installer Nginx 1.10 stable au lieu du 1.9.9, et aussi MySQL pour avoir l’interface graphique PHPmyadmin, c’est possible ?
Hello,
C’est possible d’installer la dernière version stable de Nginx oui.
Et pour avoir PHPmyadmin, il suffit d’installer le packet du même nom, pas besoin de repasser sur mysql 😉
Merci cela fait plusieurs fois que j’utilise les procédures que tu propose, elles sont unique pas trouvé mieux pour un débutant. c’est un vrai plaisir…..
Bonjour, vraiment sympa tes tutos. Par contre je vois qu’aucun service mail n’est installé. Il suffit juste d’installer Postfix pour gérer les mails avec ISPConfig? Merci
Postfix, Dovecot entre autres. Il faudrait mieux te tourner vers une procédure qui décrit cela.
Salut je suis bloqué à l’étape : ./letsencrypt-auto certonly –email email@mondomaine.com -d ispconfig.mondomaine.com –rsa-key-size 4096 -a webroot –webroot-path /usr/share/nginx/html/
Il me dis : Detail: Could not connect to http://ispconfig.mondomaine.com/.well-
known/acme-challenge/IbTtkuGFFbyDeLQ3amaf0BPlZloOf2Yrq_b8yBbG2xw
Mon sous-domaine ispconfig.mondomaine.com pointe vers ispconfig: 11.22.33.44:8080 est-ce bon ?
Merci
Etant débutant, je souhaitais la meilleur configuration, mais cela semblais difficile a configurer pour moi. Du coup j’ai trouver un super script pour installer ISPconfig3, avec nginx, mariaDB php5 (a voir si on peu rajouter php7 a posteriori… ) je vous le partage car ca peux servir et pas qu’a moi : https://github.com/servisys/ispconfig_setup
je crois savoir : nul part tu ne parles de passer de bash à dash. Ca doit foutre la merde ^^
dpkg-reconfigure dash
répondre non
Je teste et je te dis 🙂
J’ai jamais utilisé Dash et j’ai jamais eu de problème. Ca serait pas plutôt une rewrite rule ou quelque chose comme ça qui pose problème? Un Selinux planqué? Quelque chose dans le style?
Nope, rien de tout ça… Sur un VPS tout frais, debian 8 FR
J’ai essayé en changeant dash bash (ce qui est recommandé par tout le monde, soit dit en passant…)
Mais je n’ai toujours ni répertoire créé dans /var/www/clientX/ ; les rep webXX ne sont pas présent, meme une heure après, même en lancant les cron à la main.
Et aucun vhost nul part dans /etc/nginx/site-available ou -enabled
J’ai refait plusieurs l’install, mais toujours le même souci… Je suis fort marri !
C’est qui tout le monde ? Les mecs qui font des copy/paste d’un truc écrit sur HTF pour Debian 5 ? ^^ Sinon c’est bien la première fois que je vois ça, et pourtant j’en ai installé du Ispconfig depuis Debian 6, que ça soit sur X86/X64 ou ARM :/ T’a quelque chose dans les logs ?
Rien dans les logs. c’est pourtant pas mon premier ISPConfig (http://axel.piquet-gauthier.fr/2013/08/ispconfig-3-owncloud-et-roundcube-le-tout-avec-une-debian-7-et-un-dedie-kimsufi/ : mon heure de gloire, dingue ce qu ca drive comme trafic !) mais là, j’avoue, je sèche. Je vais re-essayer ce WE.
Dash Bash SH tout ca, ca venait à l’époque d’un dev d’ISPConfig, une histoire d’incompatibilité avec les scripts, je ne sais quoi. Et c’est bien Bash, pas Dash, je me suis fourvoyé, effectivement. Cela dit, cela ne semble être plus d’actualité
Et c’est bien BASH qu’il faut pour ISPConfig soit dit en passant, sinon tu pourrais même pas faire l’install vu que dash ne propose aucune interaction utilisateur …
Pour la partie PHP, je suis un peu con,on fait des liens symboliques entre les 2 versions, donc ca va 🙂
Pour mes vhost non crée, je creuse, mais je ne trouve rien 🙁
Salut,
C’est un peu léger pour vraiment pour t’aider. Il crée des vhost.err dans sites-avalaibles ?
Hello,
J’aime bien ton article, mais j’ai pleins de petites choses qui ne fonctionne pas.
1/ mon ispconfig ne veut pas créer de vhost pour nginx. Est ce que tu as une idée de pourquoi ?
2/ dans system / serveur config, quand tu déplie « PHP », j’ai des chemins vers PHP 5. Ne devrait on pas modifier cette config pour pointer vers PHP 7 ? Idem dans l’onglet fastcgi ou la référence est faite vers PHP5
Merci de ton aide 🙂