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,
Aujourd’hui je vous propose un article pour la configuration d’un serveur Web sous Debian 8 « Jessie ». Cet article arrive tôt car Debian 8 n’est pas encore au stade final, je mettrais donc cet article à jour dans le temps.
Les composants de notre serveur :
- Nginx 1.6.x (Serveur Web hautes performances)
- MariaDB 10.x (Serveur de base de données)
- Php5-fpm 5.6.x (Pour traiter les requêtes php avec Nginx)
Installation des sources :
On va commencer par éditer la liste des sources pour le gestionnaire de paquets APT :
nano /etc/apt/sources.list
Rajoutez contrib non-free à la fin de chaque ligne du fichier :
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
Lancez maintenant une mise à jour et installez les utilitaires htop et python-software-properties en même temps :
apt-get update && apt-get upgrade -y && apt-get install htop software-properties-common python-software-properties -y
J’aime bien installer l’utilitaire htop car je le trouve plus explicite que l’utilitaire top nativement intégré, voici la comparaison en images :
Maintenant on va ajouter les clés de nos repository personnalisés :
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db add-apt-repository 'deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.0/debian sid main'
Pour finir, mettez à jour vos listes avec cette commande une fois de plus :
apt-get update
Installation des composants du serveur :
On va d’abord installer MariaDB, RKHunter, Binutils, clamAv et 2-3 accessoires :
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 -y
Ensuite, on va installer Nginx, PHP-FPM, memcached et les différents modules php :
apt-get install nginx php5-fpm php5-mysqlnd php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-memcached php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl fcgiwrap memcached -y
Ensuite, installez Pureftpd, bind9 et fail2ban :
apt-get install pure-ftpd-common pure-ftpd-mysql bind9 dnsutils fail2ban -y
Et pour finir, on installe Jailkit :
apt-get install build-essential autoconf automake libtool flex bison debhelper binutils-gold -y
cd /tmp wget http://olivier.sessink.nl/jailkit/jailkit-2.17.tar.gz tar xvfz jailkit-2.17.tar.gz cd jailkit-2.17 ./debian/rules binary
Vous pouvez maintenant installer le package .deb comme ceci :
cd .. dpkg -i jailkit_2.17-1_*.deb rm -rf jailkit-2.17*
Configuration des composants :
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 =
Installation d’Isp Config 3 :
Pour avoir la dernière version stable, faites ces commandes :
cd /tmp wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz tar xfz ISPConfig-3-stable.tar.gz cd ispconfig3_install/install/
lancez maintenant cette commande
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
Une fois l’installation terminée, redémarrez votre serveur avec la commande
reboot
Votre webpanel sera ensuite accessible à cette adresse : https://[VOTREIP]:8080/
Les identifiants par défaut sont : admin/admin
Intégration de HSTS et de SPDY :
Éditez le template des Vhosts de Nginx :
nano /usr/local/ispconfig/server/conf/nginx_vhost.conf.master
Remplacez les 2 premiers :443 ssl par :443 ssl spdy :
Maintenant lancez la ligne de commande suivante pour éditer la configuration de Nginx :
nano /etc/nginx/nginx.conf
Recherchez l’ouverture de la balise http { et mettez les lignes suivantes en dessous :
#HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
Pour information, cette commande envoie l’entête HSTS à vos visiteurs en indiquant une durée de 1 an et en incluant les sous domaines.
Pendant que vous êtes dans ce fichier, adaptez le worker_processes en fonction de votre nombre de cœurs cpu :
worker_processes 8;
Sauvegardez avec un petit Ctrl + O et redémarrez Nginx :
systemctl restart nginx
Configuration d’un nom de domaine :
Rendez vous dans la section DNS :
Ajoutez une nouvelle zone à l’aide de l’assistant :
Voici un exemple de configuration :
Voilà, c’est tout ce qu’on doit faire pour ajouter un domaine à notre serveur.
Création d’un site :
Rendez vous dans la section site, et allez dans Website, ensuite cliquez sur Add new website :
Remplissez bien le domaine, et SURTOUT choisissez bien PHP-FPM dans la version de php !
Création d’une base de données :
Allez dans Site, database Users :
Cliquez sur
Remplissez les champs et cliquez sur Save :
Maintenant allez dans Databases et créez en une nouvelle :
Remplissez les informations demandées :
Création d’un accès FTP :
Allez dans Web Access, FTP-Accounts et cliquez sur Add new FTP-User :
Remplissez les informations demandées :
Tuning PHP-FPM :
Si vous en êtes arriver là c’est déjà pas mal, maintenant on va modifier la configuration de PHP-FPM pour améliorer les performances :
Éditez la configuration de php-fpm sur votre site pour qu’elle corresponde à ceci au niveaux des valeurs PHP-FPM :
Voilà ce que ça donne en texte dans le fichier de configuration :
pm = ondemand pm.max_children = 100 pm.process_idle_timeout = 10s; pm.max_requests = 500
Maintenant, redémarrez les services associés :
systemctl restart php5-fpm
Sécuriser le serveur :
Il n’y a pas de secrets, mettez des mots de passe fort partout !
En plus de ça, voici 2-3 astuces pour sécuriser votre serveur.
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 blinder votre accès SSH !
Pour le reste je vous laisse jeter un oeil au liens utiles 😉
Cacher les versions de Nginx et PHP:
Pour cacher la version de Nginx, ouvrez votre fichier de configuration :
nano /etc/nginx/nginx.conf
Et rajoutez cette ligne au début de la section http { :
server_tokens off;
Maintenant, redémarrez Nginx :
systemctl restart nginx
Pour php, ouvrez votre php.ini :
nano /etc/php5/fpm/php.ini
Recherchez la variable suivante et mettez la sur off :
expose_php = Off
Redémarrez php :
systemctl restart php5-fpm
Maintenant les versions logicielles de votre serveur ne seront plus accessibles au monde 😉
root@xxx:/# curl -I http://www.abyssproject.net HTTP/1.1 200 OK Server: Nginx Date: Wed, 20 Aug 2014 08:14:43 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Pingback: http://www.abyssproject.net/xmlrpc.php Link: <http://wp.me/P2RtI7-sB>; rel=shortlink Vary: Accept-Encoding Cache-Control: max-age=0, no-cache
Tuning du kernel :
Cette partie est inutile si vous utilisez un VPS qui utilise la technologie OpenVZ. Vous devez avoir un kernel personnalisable, c’est à dire un serveur dédié ou une machine virtuelle sous Vmware, Hyper-V, KVM …
Ouvrez le fichier sysctl :
nano /etc/sysctl.conf
Rajoutez la configuration suivante à la fin du fichier :
#PERSO # Recycle Zombie connections net.inet.tcp.fast_finwait2_recycle=1 net.inet.tcp.maxtcptw=200000 # Increase number of files kern.maxfiles=65535 kern.maxfilesperproc=16384 # Increase page share factor per process vm.pmap.pv_entry_max=54272521 vm.pmap.shpgperproc=20000 # Increase number of connections vfs.vmiodirenable=1 kern.ipc.somaxconn=3240000 net.inet.tcp.rfc1323=1 net.inet.tcp.delayed_ack=0 net.inet.tcp.restrict_rst=1 kern.ipc.maxsockbuf=2097152 kern.ipc.shmmax=268435456 # Host cache net.inet.tcp.hostcache.hashsize=4096 net.inet.tcp.hostcache.cachelimit=131072 net.inet.tcp.hostcache.bucketlimit=120 # Increase number of ports net.inet.ip.portrange.first=2000 net.inet.ip.portrange.last=100000 net.inet.ip.portrange.hifirst=2000 net.inet.ip.portrange.hilast=100000 kern.ipc.semvmx=131068 # Disable Ping-flood attacks net.inet.tcp.msl=2000 net.inet.icmp.bmcastecho=1 net.inet.icmp.icmplim=1 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_tw_recycle = 1 # Increase maximum amount of memory allocated to shm kernel.shmmax = 1073741824 # This will increase the amount of memory available for socket input/output queues net.ipv4.tcp_rmem = 4096 25165824 25165824 net.core.rmem_max = 25165824 net.core.rmem_default = 25165824 net.ipv4.tcp_wmem = 4096 65536 25165824 net.core.wmem_max = 25165824 net.core.wmem_default = 65536 net.core.optmem_max = 25165824 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 # you shouldn't be using conntrack on a heavily loaded server anyway, but these are # suitably high for our uses, insuring that if conntrack gets turned on, the box doesn't die # net.ipv4.netfilter.ip_conntrack_max = 1048576 # net.nf_conntrack_max = 1048576 # For Large File Hosting Servers net.core.wmem_max = 1048576 net.ipv4.tcp_wmem = 4096 87380 524288 # Use swap when we have less than 10% of the physical memory available vm.swappiness=10
Ensuite, redémarrez votre serveur pour que les changements soit prit en compte.
N’hésitez pas à me payer une bière si ça vous a été utile ou à laisser un commentaire 🙂
Salut,
merci pour ce tuto.
Par contre, je ne comprends pas où utilisons-nous MariaDB…?
Sur le tuto, il semble qu’on utilise toujours MySQL.
Notamment avec les commandes suivantes :
nano /etc/mysql/my.cnf
systemctl restart mysql
Où configure t-on ce serveur de BDD MariaDB ?
Super Tuto.
J’ai juste un soucis avec joomla 3, lorsque le site joomla est en mode hors ligne, j’ai une erreur 503 ! Sur le front office, mais j’ai accès à l’administration complète. Par contre lorsque le site est en ligne, aucun soucis….. Juste sur les rewrite, mais après quelques modifications dans le vhost, pas de soucis.
Donc je sèche sur cette erreur 503. J’ai le site sur apache logiquement et pas ce soucis. J’ai effectué un transfert complet du site.
Nickel ce tuto 🙂
hello, j’ai tout installé sans problème, mais maintenant je voudrais installer mon forum vbulletin, dans quel répertoire je dois l’envoyer? merci beaucoup
Hello,
Tu dois créer un hébergement web (site, compte sql, compte ftp) et installer ton forum avec cela.
Bjr Nicolas, j’ai suivi ton tuto à la lettre si je puis dire, j’ai crée et accéder au ftp, j’ai fais un compte user pour mon sql et de la une base de données, mais chaque fois j’ai une page 403 forbidden, ca fait quelques années que j’installe des forums mais la 1ere fois avec ispconfig, excellent d’ailleurs! en tapant l’ip j’avais bien la page de bienvenue nginx, j’ai supprimé ce fichier html et mis mon forum à la place. ça doit pas être grand chose mais la je cale. Dans tous les cas tes tutos sont vraiment bien réalisés,… Voir plus »
Salut Allan,
Ton forum est bien compatible avec Nginx ? Toutes les applications ne le sont pas.
bjr, j’ai crée une base de données, mais comment se fait la gestion pour restaurer une de mes bases? y a t-il une ligne php a taper dans le browser? merci
Hello,
Aucune action possible à partir d’un « browser ».
Il faut soit utiliser la ligne de commande, soit un logiciel comme Navicat.
hello Nicolas je suis assez novice, qu’entends tu par ligne de commande? peux tu m’expliquer? Merci
(désolé pour le délai de réponse!)
Salut Allan,
Je parle de l’outil intégré nativement à MySQL (ou MariaDB) qui permets d’administrer le serveur en ligne de commande.
Voici un article en Anglais sur le sujet : http://www.electrictoolbox.com/using-mysql-command-line-tool/
je suis désolé mais je laisse tomber, je comprends pas. Merci pour le temps passé
Il ne s’agit pas que de suivre une procédure, c’est un vrai métier derrière.
Dommage 🙂
je regarderai de plus près pendant mes congés!
Pour info lors de cette commande :
apt-get update && apt-get upgrade -y && apt-get install htop software-properties-common python-software-properties -y
ceci apparait:
Le fichier « Release » pour http://ftp.proxad.net/mirrors/ftp.debian.org/dists/jessie-updates/InRelease a expiré (plus valable depuis 1d 9h 28min 40s). Les mises à jour depuis ce dépôt ne s’effectueront pas.
Je me doute que tu y es réfractaraire, mais activer phpmyadmin serait bien pour les personnes comme moi, et cela à mes risques.
voila, merci encore à toi
Bonjour Nicolas, merci pour ce tutoriel, je l’ai suivi jusqu’au moment où on doit se connecter au webpanel et là en tapant sur le navigateur: https://adresse_ip-de_mon_serveur:8080 j’ai eu la page suivante:
Page Web inaccessible
ERR_CONNECTION_REFUSED
pouvez vous m’aider s’il vous plait?
Merci. Comment faites-vous pour accéder au panneau d’administration des bases de données créées sous ispconfig ? Merci.
Il n’y a aucun panneau d’administration.
Vous devez utiliser soit la ligne de commande soit un logiciel externe comme Navicat.
Bonjour et merci pour tout. Grace à votre tutoriel j’ai enfin pu installer nginx sur mon serveur kimsufi. Un grand merci. Il me reste juste à installer roundcube ou une autre solution de messagerie.
Content que cela aide 🙂
Pour le serveur de messagerie je vous souhaite bonne chance.
Debian a abandonné le support de Roundcube dans Jessie.
Peut-être faut-il tester Horde ?
Bonjour, j’utilise un autre serveur pour recevoir les mails. Mais tel qu’est configuré le serveur sous nginx , ispconfig 3 et debian 8, nous ne pouvons pas envoyer de message. Est-ce problématique d’installer postfix ? Dans le tutoriel nous faisons le choix de ne pas l’installer : « 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 » . Merci.
Re bonjour,
j’ai installé postfix et l’envoi de mail fonctionne bien.
Commandes utilisées : apt-get install postfix postfix-mysql postfix-doc
Mercà vous et bonne journée 🙂
Bonjour, merci pour ce tutoriel. J’ai tenté de le suivre mais j’ai 1 souci pour accéder à phpmyadmin. Quand installe-t-on phpmyadmin dans votre tuto? Lors de l’installation de ispconfig on installe aussi mysql server non ? Merci.
Bonjour,
Mysql n’a aucun rapport avec PHPmyadmin 🙂
Je n’installe pas ce logiciel car cela reviens à se tirer une balle dans le pied niveau sécurité pour moi.
Je déterre le commentaire, mais bon, Si on change le port de connexion ainsi que l’URL d’accès de phpmyadmin, le tout avec un mot de passe costaud, le risque est proche de zero, quand meme.. Et phpmyadmin reste très pratique pour ceux qui ne maitrisent pas la ligne sql comme un dieu …
Le risque est pas proche de 0. PHPMyAdmin est truffé de failles et soyont honnête, jamais mis à jour sur 99% des installations.
Si on a besoin de quelque chose de pratique, l’idéal c’est de partir sur un navicat par exemple.