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,
Pour bien commencer l’année j’ai décider de publié ma toute dernière procédure pour faire un serveur Web hautes-performances.
Apache est complètement délaissé au profit de Nginx et des modifications du Kernel sont incluses.
Les modifications du kernel seront inutiles si vous utilisez un vps sous technologie OpenVz mais je reviendrais là-dessus plus tard.
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 :
rm /etc/apt/sources.list nano /etc/apt/sources.list
Copiez les sources suivantes dans le fichier :
deb http://packages.dotdeb.org wheezy all deb-src http://packages.dotdeb.org wheezy all deb http://packages.dotdeb.org wheezy-php56 all deb-src http://packages.dotdeb.org wheezy-php56 all deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.0/debian wheezy main deb-src http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.0/debian wheezy main deb http://ftp.fr.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.fr.debian.org/debian/ wheezy main contrib non-free deb http://security.debian.org/ wheezy/updates main contrib non-free deb-src http://security.debian.org/ wheezy/updates main contrib non-free # wheezy-updates, previously known as 'volatile' deb http://ftp.fr.debian.org/debian/ wheezy-updates main contrib non-free deb-src http://ftp.fr.debian.org/debian/ wheezy-updates 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 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 :
cd /tmp wget http://www.dotdeb.org/dotdeb.gpg apt-key add dotdeb.gpg apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 0xcbcb082a1bb943db add-apt-repository 'deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.0/debian wheezy 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 automake1.9 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:
service mysql restart
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 :
service nginx restart
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 :
service php5-fpm restart
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 :
service nginx restart
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 :
service php5-fpm restart
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 🙂
Bonjour et merci pour ce tuto. Actuellement en test sur mon odroid XU4. Le problème est la connexion tls par ftp, impossible de me connecter (je suis time out pour inactivité sans pour autant avoir accès a un quelconque dossier), il faut régler un range de port pour pureftpd mais niveau sécurité je sais pas ce que ça vaut d’ouvrir tous ses ports. Sinon, si tu avais un tuto pour migrer une database existante en ligne de commande(j’ai beau chercher et ya rien sachant qu’avant d’importer un site sous ce serveur, il faut crée un Bd avec ispconfig) même si… Voir plus »
Bonsoir, merci pour ce tuto riche en informations, je bascule sur un vps actuellement, donc votre blog direct dans les bookmarks. 😉 il y a juste le FTP, c’est dépassé et peu sécurisé. Perso je conseil d’utiliser directement une connections Ssh, ça évite l’installation ftpd, et le ssh c’est plus sûr. 😉 On peu faire la même chose pour la base de données, avec par exemple : SequelPro (sur Mac), MySQL Workbench (Mac, Wind, Linux), DBeaver (M, W, L)…. ça évite d’avoir à installer PhpMyadmin sur son serveur, qui en plus n’est pas pratique a utiliser. Sinon, encore merci pour… Voir plus »
Salut ! J’ai un soucis d’accès FTP, ça me met « Échec de la tentative de connexion avec « ECONNREFUSED – Connexion refusée par le serveur ». »
tu as une idée ?
Salut,
J’ai déjà eu ça 2 ou 3 fois. Il m’avait suffit de redémarrer le serveur FTP.
Hello,
Alors déjà merci pour ce petit tuto bien cool.
Mais j’ai un problème que je n’arrive pas a résoudre, je créé un nouveau site sous ISPconfig avec nginx comme serveur web mais pas moyen d’accéder à ce site via le nom de domaine, je ne peux y accéder que via l’ip du serveur, ce qui est quand même, loin d’être pratique.
Mes DNS sont configurés correctement et je vais finir par m’arracher les cheveux.
Une aide ne serait pas de refus 😉
Hello,
Dans la configuration de ton site web tu as un champ domaine. Est-il bien remplit ?
Par exemple pour moi je mets ceci dedans : abyssproject.net
Merci pour ce tutoriel, je vais l’appliquer de suite sur mon VPS 😉
Pa contre la commande « apt-key adv –recv-keys –keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db » me retourne :
gpg : le délai d’attente du serveur de clefs a expiré
gpg : échec de réception depuis le serveur de clefs : erreur du serveur de clefs
Problème résolut en modifiant la commande comme ceci :
apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 0xcbcb082a1bb943db
Hello, merci Qwaser, ils ont dû changer la clé depuis l’écriture du billet 😉
De rien 😉 Bon personnellement même si le tutoriel est extrêmement bien expliqué (bravo à toi), j’ai lâché au moment d’installer ISPConfig (qui me fait penser à Webmin qu’on voit en cours ^^) xD
Je vais repartir sur quelque chose de plus simple avec juste Nginx, PHP, MariaDB, phpMyAdmin. Pour le FTP, personnellement j’utilise Fillzella en mode SSH, qu’en penses-tu ?
Je vais malgré ça parcourir ton site en quête de tutoriel sur la sécurisation d’un serveur Debian, car je souhaite sécuriser mon petit VPS malgré tout 🙂
En attendant superbe site qui restera dorénavant dans mes favoris 😉
A ta place j’utiliserais plutôt WinSCP. Filezilla a la très fâcheuse tendance de garder tous les mots de passe des sessions en clair dans un fichier .XML :/
D’accord 🙂 Merci pour ce logiciel qui va venir remplacer Filezilla 😉
yop,
super le tuto merci.
pour ceux qui restent devant leur écran pendant l’installation vous avez:
« Clamav signatures not found in /var/lib/clamav … failed!
Please retrieve them using freshclam … failed!
Then run ‘/etc/init.d/clamav-daemon start’ … failed! »
et j’aime pas « failed » 🙂
Juste après l’installation de clamAv
faites un « freshclam » puis « /etc/init.d/clamav-daemon start »
merci de me corriger si il y a une erreur, en tout cas pour moi c’est ok
Bonjour Nicolas,
Tu as oublié d’indiquer de valider les clés pour les repos suivants :
http://packages.dotdeb.org wheezy
http://packages.dotdeb.org wheezy-php56
http://ftp.igh.cnrs.fr wheezy Release
Bonne journée !
Kéro – @je_discute
Oublie ce que j’ai écris ! J’étais sur une autre page… :/
Bref, c’était pas ma journée ^^
Salutations ! (et mes excuses surtout ! )
Haha, pas de soucis 😉
Bonne journée 🙂