lundi 8 Juin 2015

Installer un serveur web léger pour VPS ou petit serveur

Installer un serveur web

Beaucoup de gens aujourd'hui préfèrent Nginx au lieu de Apache pour des raisons de ressources. Cependant Apache est plus simple à installer, à configurer et les .htaccess sont un moyen pratique de modifier la configuration d'un dossier, d'y mettre un mot de passe ou de la réécriture d'URL. Je préfère donc conserver ce bon vieux Apache qui est solide comme un roc et a fait ses preuves!

Voici un guide pour installer un serveur web LAMP Linux, Apache, PHP, MySQL sur Debian 7. J'ai choisi Apache en mod-event et PHP-FPM, qui donneront les meilleures performances sans prendre trop de mémoire et cela devrait bien marcher sur une machine assez petite, jusqu'à un certains nombres de visiteurs évidemment!

J'ai pris en fait 2 serveurs VPS à 4€/mois chez le meilleur hébergeur actuel Firstheberg. L'un pour la base de données, l'autre pour le "frontal": serveur web, FTP, courriels. Cela fait un solution économique et énormément plus puissante qu'un seul VPS même 3 fois plus cher. Elle a aussi l'avantage de permettre des sauvegardes automatiques d'un serveur à l'autre et avec une "IP failover" le fonctionnement même si un des deux serveurs tombent en panne.

Cependant, chez tous les hébergeurs, les VPS sont des produits rentables pour eux, mais peu intéressants en rapport qualité prix. Je vous conseille donc plutôt 1 ou 2 petits serveurs dédiés, voire du mutualisé qui sera souvent mieux que ces mini-VPS même si cela fonctionne. :-)

~

Attention parfois à l'installation il y a une grosse partition pour /home alors qu'on met souvent les sites dans /var. Si besoin déplacer /var dans /home (en).

Je ne détaille pas chaque ligne, n'hésitez pas chercher ce que vous ne comprenez pas plutôt que de tout copier-coller! ;-) Les commandes sont sur fond noir, les codes sur fond gris sont à coller dans des fichiers.

D'abord, la protection! N'autorisons que quelques IP à se connecter en SSH. Ajouter dans /etc/hosts.allow:
sshd: VOTRE.IP ET.UNE.OU.2 AUTRES.DE.SECOURS

et dans /etc/hosts/deny:
sshd: ALL

Pour ajouter dotdeb (paquets très à jour des extensions PHP) dans les sources d'apt-get, éditer /etc/apt/sources.list et ajouter:

# www.dotdeb.org package pour PHP
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all

apt-get update
apt-get upgrade
  
apt-get install apache2 apache2-mpm-event apache2-utils apache2.2-common ssl-cert libapache2-mod-fastcgi php5 php5-fpm php5-common php5-gd php5-mysqlnd php-pear php5-curl php5-memcache php5-xcache memcached mysql-client mysql-server openssl

Je mets xcache, on peut mettre apc juste en remplaçant le mot. J'ai fait de nombreuses recherches, les 2 se valent quasiment.
Je mets memcache car j'en ai besoin et on peut y mettre les sessions PHP. À vous de voir.
Je mets curl car j'en ai besoin, à vous de voir.

~

a2enmod fastcgi actions expires headers rewrite include negotiation alias ssl
php5dismod pdo pdo_mysql
a2ensite default-ssl
apt-get install vlogger

~

Décommenter dans /etc/apache2/conf.d/charset la ligne: AddDefaultCharset UTF-8

J'utilise vlogger qui fait les rotations des logs d'Apache et gère tous les sites en une seule ligne. Pour ça commenter tout dans /etc/apache2/conf.d/other-vhost-access-log (vlogger s'occupera de tous les vhosts)

Décommenter les 37 dernières lignes de /etc/apache2/conf.d/localized-error-pages pour mettre les pages d'erreur Apache en français.

Dans /etc/apache2/apache2.conf changer en LogLevel error pour réduire les logs, et rajouter à la fin pour utiliser les caches des navigateurs (besoin de mod_expires.so et mod_headers.so qu'on a déjà installé):


Header unset ETag
FileETag None
 
# cache 30 jours
<FilesMatch "\.(jpg|jpeg|png|gif|swf|js|css|png|ico|ttf)$">
Header set Cache-Control "max-age=1296000, public"
</FilesMatch>
 
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 week"
ExpiresByType application/x-httpd-php "access plus 1 day"
ExpiresByType text/html "access plus 1 day"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpg "access plus 2 weeks"
ExpiresByType image/png "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
</IfModule>
 
# si vos sites envoient des polices en .ttf
AddType application/x-font-ttf .ttf
 
#compression
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript application/rss+xml application/atom_xml text/javascript application/x-font-ttf
 
# Logfile configuration for vlogger:
LogFormat "%v %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig
CustomLog "| /usr/sbin/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/apache2" combined_ispconfig env=!statique_sauf_jpeg
ErrorLog ${APACHE_LOG_DIR}/error.log

Créer le fichier etc/apache2/conf.d/php5-fpm.conf avec dedans:


Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /var/www/cgi-bin/php5-fcgi-www
FastCgiExternalServer /var/www/cgi-bin/php5-fcgi-www -socket /var/run/php5-fpm.sock
 
<FilesMatch "\.php$">
SetHandler php5-fcgi
</FilesMatch>

Changer dans /etc/php5/fpm/pool.d/www.conf les lignes pour mettre le mode "ondemand" qui permet à PHP-FPM de gérer tout seul les ressources nécessaires et allège considérablement la mémoire utilisée en ne perdant qu'un infime temps de réponse des requêtes:

pm = ondemand
;pm.start_servers = 2
;pm.min_spare_servers = 1
;pm.max_spare_servers = 3
pm.max_requests = 500

Ajouter dans /etc/php5/mods-available/xcache.ini: xcache.size = 64M
(ou si APC: apc.shm_size = 64M)

Changer dans /etc/php5/fpm/php.ini (pas ajouter, changer!):

expose_php = Off
display_errors = On
log_errors = Off
log_errors = Off
 
date.timezone = "Europe/Paris"
 
session.save_handler = memcache <--- si vous l'avez installé, sinon ne changez rien
session.save_path = "tcp://localhost:11211"

Surtout si votre base de données est un serveur séparé, vous devriez envisager l'installation de l'extension PHP mysqlnd_qc pour mettre les requêtes SQL en cache avec PHP.

~

2 petits outils pour voir l'utilisation des disques durs et bloquer automatiquement les tentatives d'attaques diverses (si installé, modifier /etc/fail2ban/jail.conf activer les filtres de Apache):

apt-get install iotop
apt-get install fail2ban

Voir et gérer les locales, notamment pour GetText si vos sites ont plusieurs langues:

locale -a
dpkg-reconfigure locales
 
apt-get install awstats

AWStats pour créer des statistiques de visites des sites web. Dans /etc/awstats/awstats.conf et dans awstats.conf.local mettre:
DNSLookup=0
LogFormat=1

~

Modifier /etc/mysql/my.cnf pour connexion externe et valeur de cache:

bind-address = 0.0.0.0 (seulement si votre base de données est externe)
 
key_buffer_size = 128M
# 25% de la mémoire est conseillé
max_connections = 30
query_cache_type = ON
query_cache_limit = 256K
query_cache_size = 8M

~

Éventuellement installer une IP failover.

Enfin, créer un utilisateur pour chaque site web par sécurité, et créer les fichiers vhost correspondant dans /etc/apache2/sites-available et les fichiers de "pool" pour PHP dans /etc/php5/fpm/pool.d
Je ne m'étends pas parce qu'on est plus vraiment dans l'installation du serveur proprement dite mais voici 2 modèles minimalistes pour ces fichiers:


<VirtualHost *:80>
DocumentRoot /var/www/site_web1
ServerName example.net
ServerAlias *.example.net
ServerAdmin webmaster@example.net
</VirtualHost>


[site_web1]
user = site_web1
group = sites_web

Les fichiers envoyés dans /var/www/site_web1 devront appartenir au propriétaire site_web1 du groupe sites_web.


café Cet article vous a aidé? 
Offrez-moi un café!
Agrégateur informatique

Laisser un commentaire

Azur Dev