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 on va voir comment configurer un serveur web hautes-performances pour WordPress sous Debian 8.
Certaines parties comme l’installation d’un serveur mail ou de composants spéciaux ne sont pas couverts pas cette procédure.
Cette procédure n’est pas compatible avec des serveurs utilisant une architecture autre que i386 ou amd64.
De plus, cette procédure est adaptée pour une configuration basique pour un petit blog.
Pour quelque chose d’adapté à vos besoins vous aurez besoin d’une infogérance adaptée.
Les composants de notre serveur :
- Nginx 1.8.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 deb http://packages.dotdeb.org jessie all deb-src http://packages.dotdeb.org jessie all
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 :
cd /tmp wget http://www.dotdeb.org/dotdeb.gpg apt-key add dotdeb.gpg 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 jessie 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 :
systemctl restart pure-ftpd-mysql
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
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 :
Configuration de l’hébergement pour wordpress :
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 hormis pour les max_requests. Mettez 5000 au lieu de 500.
Tout en bas, dans directives NGINX copiez-coller les informations suivantes :
location / {
try_files $uri $uri/ /index.php?$args;
}location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires max;
add_header Pragma public;
add_header Cache-Control « public, must-revalidate, proxy-revalidate »;
}
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 🙂
Merci pour ce tuto bye bye plesk
j’avais juste une question comment on accède à nos bases de données ?
Bonjour Nicolas,
Excellent tuto !
Petite question:
As-tu réussi a faire fonctionner Munin via ISPConfig ? Je trouve sur le net que des tuto de Munin avec Apache mais pas avec Nginx et ISPconfig.
Merci