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,
J’ai refais à neuf mon infrastructure, et au passage j’en ai profiter pour mettre à jour ma procédure
Au programme :
- Installation des sources
- Installation des composants pour notre serveur
- Configuration des diffèrents composants
- Installation de Isp Config 3
- Configuration d’un nom de domaine
- Création d’un site web
- Création d’une base de données
- Création d’un accès FTP
- Fine Tuning
- Installation du Reverse Proxy Nginx
- Installation de No More DDOS
- Sécuriser le serveur
- Intégration de Memcached
- Liens utiles
Les composants de notre serveur :
- Apache mpm worker 2.x ( Serveur Apache en version multi-thread )
- MariaDB 10.x ( Serveur de base de données )
- Php5-fpm 5.5.x ( pour traiter les requêtes php avec apache )
- Apache Page Speed ( module de concaténation et de mise en cache pour apache )
Et les composants optionels :
- Nginx 1.6.x ( Reverse Proxy pour apache )
- No More DDOS 1.x ( Scripts perso contre les attaques DDOS )
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-php55 all deb-src http://packages.dotdeb.org wheezy-php55 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 && apt-get install htop python-software-properties
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 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
Ensuite, on va installer Apache2 en mode Worker (multi-threadé), PHP5-FPM, FCGI, suExec, Pear, et mcrypt :
apt-get install apache2 apache2.2-common apache2-doc apache2-mpm-worker libapache2-mod-fastcgi php5-fpm apache2-utils libexpat1 ssl-cert php5 php5-common php5-gd php5-mysql php5-imap php5-cli php5-cgi libapache2-mod-fcgid apache2-suexec php-pear php-auth php5-mcrypt mcrypt php5-imagick imagemagick libruby libapache2-mod-ruby libapache2-mod-python php5-curl php5-intl php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
On va maintenant déclarer quelques modules à apache :
a2enmod actions alias fastcgi && a2enmod fcgid && a2enmod suexec rewrite ssl actions include && a2enmod dav_fs dav auth_digest && service apache2 restart
Ensuite, installez Pureftpd, bind9 et fail2ban :
apt-get install pure-ftpd-common pure-ftpd-mysql bind9 dnsutils fail2ban
Et pour finir, on installe Jailkit :
apt-get install build-essential autoconf automake1.9 libtool flex bison debhelper binutils-gold
cd /tmp wget http://olivier.sessink.nl/jailkit/jailkit-2.15.tar.gz tar xvfz jailkit-2.15.tar.gz cd jailkit-2.15 ./debian/rules binary
Vous pouvez maintenant installer le package .deb comme ceci :
cd .. dpkg -i jailkit_2.15-1_*.deb rm -rf jailkit-2.15*
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, téléchargez mon fichier de configuration pour php-fpm :
cd /etc/apache2/conf.d wget https://raw.githubusercontent.com/stylersnico/debian-scripts/master/php5-fpm.conf
Redémarrez les services associés :
service apache2 restart && service php5-fpm 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 =
On va maintenant configurer Apache PageSpeed :
32 bits :
cd /tmp/ wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_i386.deb dpkg -i mod-pagespeed-*.deb apt-get -f install
64 bits :
cd /tmp/ wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb dpkg -i mod-pagespeed-*.deb apt-get -f install
Maintenant, redémarrez votre serveur pour qu’il soit propre avant l’installation d’ISP Config 3 :
reboot
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
Si vous avez une erreur avec le protocole https de ce genre
107 (net::ERR_SSL_PROTOCOL_ERROR) or ssl_error_rx_record_too_long
Lancez cette commande
a2ensite default-ssl
Maintenant, redémarrez Apache :
service apache 2 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 :
Installation du reverse Proxy Nginx :
Cette étape est optionnelle, si avez peur de devoir mettre les mains dans le cambouis n’hésitez pas à la passer …
On va commencer par installer Nginx et le module rpaf pour apache :
apt-get install libapache2-mod-rpaf nginx
Maintenant on active rpaf et on redémarre apache :
a2enmod rpaf && service apache2 restart
Maintenant, regardez la configuration de rpaf et si cette ligne n’est pas présente, rajoutez la :
nano /etc/apache2/mods-available/rpaf.conf
RPAFproxy_ips 127.0.0.1 ::1
Maintenant on va modifier les ports d’écoute du serveur Apache :
nano /etc/apache2/ports.conf
Remplacez :
#NameVirtualHost *:80 Listen 127.0.0.1:80
Par :
NameVirtualHost *:82 Listen 127.0.0.1:82
Et on va modifier tous les virtualhost existants :
sed -ie 's/*:80/*:82/g' /etc/apache2/sites-available/*.vhost
Maintenant, on va créer le fichier de configuration pour notre reverse proxy nginx :
rm /etc/nginx/conf.d/default nano /etc/nginx/conf.d/default
Remplissez le avec ceci :
server { listen 80 default; server_name _; server_name_in_redirect off; resolver 127.0.0.1; access_log /var/log/ispconfig/httpd/$host/nginx-access.log; location ~* ^/var/www/$host/web/(wp-content|wp-includes)/(.*)\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|css|midi|wav|bmp|rtf|js|swf|flv|html|htm|mp3|mp4)$ { root /var/www/$host/web/(wp-content|wp-includes); access_log off; expires 30d; error_page 404 502 504 = @fallback; } location / { root /var/www/$host/web; index index.html index.htm index.php; access_log off; proxy_pass http://127.0.0.1:82; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Fine Tuning :
Si vous en êtes arriver là c’est déjà pas mal, maintenant on va modifier les configurations de Nginx et PHP-FPM pour améliorer les performances :
nano /etc/nginx/nginx.conf
Et remplacez le chiffre de la ligne worker_processes par le nombre de cœurs de votre processeur, par exemple pour un 2 cœurs :
worker_processes 2;
Ensuite éditez la configuration de php-fpm sur votre site :
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 nginx restart && service php5-fpm restart
Maintenant on va modifier la configuration d’Apache PageSpeed :
nano /etc/apache2/mods-available/pagespeed.conf
Cherchez les ligne suivante et dé-commentez les pour interdire la retouche des images par Apache PageSpeed, c’est long et inutile :
ModPagespeedDisableFilters rewrite_images ModPagespeedForbidFilters rewrite_images
Par contre, on peut activer la minification des fichiers javascript et CSS en dé-commentant les lignes suivantes :
ModPagespeedEnableFilters rewrite_javascript,rewrite_css ModPagespeedEnableFilters collapse_whitespace,elide_attributes
Et on demande à préserver les urls avec en dé-commentant les lignes suivantes :
ModPagespeedJsPreserveURLs on ModPagespeedImagePreserveURLs on ModPagespeedCssPreserveURLs on
Vous pouvez aussi modifier l’header qui renvoie par défaut la version de pagespeed en rajoutant cette ligne dans la configuration :
ModPagespeedXHeaderValue "Hidden"
Maintenant redémarrez apache :
service apache2 restart
Installation de No More DDOS :
Bon alors, pour commencer, No More DDOS est un script que j’ai créé à partir du programme DDOS Deflate.
Ce programme agit au niveau du pare-feu de votre serveur Debian, qui est soit Iptable par défaut, soit APF.
Ce programme peut vous bannir si vous faite du transfert FTP intensif alors n’hésitez pas à mettre votre adresse ip en liste blanche.
Pour installer le programme, lancez la commande suivante :
wget -O- https://raw.githubusercontent.com/stylersnico/nmd/master/debian/install.sh | sh
Une fois l’installation effectuée, lancez la commande suivante et testez le programme en choisissant l’option 1 :
/usr/local/nmd/nmd
Vous devriez avoir quelque chose de semblable :
Vous pouvez éditer la configuration de No More DDOS en modifiant le fichier de configuration :
nano /usr/local/nmd/conf.d/agent.conf
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 😉
Intégration de Memcached :
Pour finir en beauté, on va lier tous les services web de notre serveur à Memcached pour des performances maximales !
Pour cela, je vous laisse consulter mon article sur l’installation de Memcached, il y a tout ce dont vous avez besoin 😉
Cacher les versions d’apache, php et Nginx :
Pour cacher la version d’Apache, ouvrez votre fichier de configuration :
nano /etc/apache2/apache2.conf
Et rajoutez ces 2 lignes à la fin :
ServerTokens ProductOnly ServerSignature Off
Maintenant, redémarrez Apache :
service apache2 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
Pour nginx, ouvrez votre fichier de configuration de nginx :
nano /etc/nginx/nginx.conf
Dé-commentez la ligne suivante ou si elle n’est pas présente, ajoutez la :
server_tokens off;
Redémarrez Nginx :
service nginx 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: https://www.abyssproject.net/xmlrpc.php Link: <http://wp.me/P2RtI7-sB>; rel=shortlink X-Mod-Pagespeed: Web Server By Nicolas Simond <https://www.nicolas-simond.com> Vary: Accept-Encoding Cache-Control: max-age=0, no-cache
Et voilà, j’ai enfin fait ce tutoriel complet pour créer un serveur web de A à Z, j’espère qu’il vous plaît ! N’hésitez pas à me payer une bière si ça vous a été utile ou à laisser un commentaire 🙂
N’oubliez pas ! Redémarrez votre serveur à la fin de l’installation pour partir sur quelque chose de propre 😉
Je pense que ça se trouve facilement sur la toile ça 😉
Bonne continuation
Bonjour,
Dans ton article, tu veux éditer le fichier de conf de Nginx sans même l’avoir installé.
Et malgré l’édition de /etc/nginx/conf.d/default, Nginx m’envoie sur son Vhost par défaut qui n’est pas le dossier /var/www/xxxx créé par ISPConfig3.
Bref, même en suivant le tuto à la ligne, ca ne fonctionne pas comme prévu!
Bonjour,
J’avais simplement mis la section fine tuning avant la section nginx, c’est corrigé.
Par contre tu n’a pas du installer Nginx depuis les dépôts dotdeb car ton problème viens d’un fichier de configuration dans les « sites-enabled » de nginx qui ne devrait pas être là.
Explore cette voie car la configuration est fonctionnelle sinon tu n’aurais pas pu poster ton commentaire.
J’ai bien les dépôts de DotDeb dans mon sources.list.
En fait, j’ai suivi le tuto de A à Z.
# nano /etc/nginx/conf.d/default
Après édition de /etc/nginx/sites-available/default, ca fonctionne mieux.
Cette partie change selon la version de Nginx utilisée et selon le repository utilisé, maintenant je suppose que tout marche correctement ? 🙂
Oui, il ne me reste plus qu’à trouver comment configurer Nginx pour Prestashop 1.6 pour le côté reverse proxy. 😉