Apache + awstats = surcharge.

Questions relatives à des problèmes logiciels.
Avatar de l’utilisateur
Mithrah
Messages : 19
Inscription : 07 novembre 2009, 11:54
Localisation : Charleroi(.be)

Apache + awstats = surcharge.

Message par Mithrah » 13 septembre 2010, 00:23

Coucou,

Dans l'idée d'apprendre comment faire je voudrais mettre en place un serveur d'hébergement internet pour plusieurs clients.
Je configure tout à la main, pas d'interface style webmin, plesk ou autre.

Pour qu'ils puissent voir les statistiques de leurs sites, j'ai installé awstats 6.95 du dépôt epel, j'ai copié le fichier conf de base et j'ai changé les paramètres les plus basiques pour tester avec un premier site (nom du site et chemin des logs en gros). Tout fonctionne très bien, super.

Seulement, puisque je gardais une fenêtre avec htop lancé sur le serveur, je me rend compte que l'accès a cette page est très lourd en consommation CPU.
Et en effet, simplement en actualisant la page rapidement, genre 1x par seconde, on crée un ddos sur le serveur, qui sature totalement. Avec l'aide d'une seconde personne on a fait grimper le load average à plus de 170 !!!!!!! Autant dire qu'il n'y avait plus grand chose de fonctionnel :o

Dans htop, la commande qui se répète est la suivante, appartement à l'utilisateur apache :

Code : Tout sélectionner

/usr/bin/perl /usr/share/awstats/wwwroot/cgi-bin/awstats.pl
Je voudrais savoir s'il existe une technique quelconque de mise en cache de la page ou qui aiderait à l'exécution d'awstats qui est, si j'ai bien compris, un script en perl appelé par apache, voir une solution qui limite le nombre de requète du script par ip / par minute.
N'importe qu'elle solution / début de piste est à prendre, même un système qui ralentirait / pénaliserait l'accès aux statistiques tant que les autres sites restent accessibles.

Merci


Pour info serveur :
P4 - 3.2Ghz HT
3Giga de ram ddr2 533Mhz
2x 250Go en raid 1 soft
CentOS 5.5 - 64bits
Apache 2.2.3 / php 5.3.3 / mysql-server 5.1.50

Nils
Messages : 89
Inscription : 22 octobre 2009, 18:55

Re: Apache + awstats = surcharge.

Message par Nils » 14 septembre 2010, 14:09

Salut Mithrah,

j'utilise aussi Apache et Awstats, et en ce qui me concerne je n'ai pas de problème de charge à ce niveau. Concernant la configuration d'Awstats :
- j'ai laissé la valeur par défaut : AllowToUpdateStatsFromBrowser=0
- Awstats est lancé toutes les quatre heures avec awstats_updateall.pl

A mon souvenir il est possible pour Awstats de générer des pages HTML statiques qui peuvent ensuite être visualisées, plutôt que de générer en direct l'affichage. Mais je ne me suis jamais servi de cette possibilité.

En espérant avoir aidé !

Avatar de l’utilisateur
Mithrah
Messages : 19
Inscription : 07 novembre 2009, 11:54
Localisation : Charleroi(.be)

Re: Apache + awstats = surcharge.

Message par Mithrah » 14 septembre 2010, 15:34

Coucou Nils,

Merci beaucoup de ta réponse :)

La valeur AllowToUpdateStatsFromBrowser est bien à 0 ici aussi, et l'actualisation est restée par défaut (toutes les heures je pense).

Je me suis mal exprimé, ce n'est pas de réactualiser les stats qui pose soucis mais c'est simplement le fait de joindre l'url.

Code : Tout sélectionner

www.example.com/awstats/awstats.pl
Si j'actualise cette page un peu trop souvent, le serveur surcharge.

Donc si c'est un serveur utilisé par plusieurs clients, un petit malin peut le rendre indisponible très facilement, en abusant de la touche actualiser.

La génération des pages html statique est une très bonne piste que je vais creuser, c'est juste dommage de ne pas pouvoir utiliser le mode dynamique. J'ai peut être mal configuré quelques choses mais sachant que j'ai presque tout laissé par défaut...

Nils
Messages : 89
Inscription : 22 octobre 2009, 18:55

Re: Apache + awstats = surcharge.

Message par Nils » 16 septembre 2010, 09:55

Mithrah a écrit :J'ai peut être mal configuré quelques choses mais sachant que j'ai presque tout laissé par défaut...
Je ne me souviens pas de la configuration par défaut de CentOS pour Apache, mais tu peux jeter un oeil dans "mpm_prefork_module" : les directives de ce module pourraient t'aider.

Avatar de l’utilisateur
Mithrah
Messages : 19
Inscription : 07 novembre 2009, 11:54
Localisation : Charleroi(.be)

Re: Apache + awstats = surcharge.

Message par Mithrah » 17 septembre 2010, 20:06

Je me suis rendu compte que le problème ne se produisait pas qu'avec Awstats.

Que ce soit sous un bête CMS Joomla vide sur la même machine ou sur l'interface roundcube de mon serveur de mail (pourtant plus puissant), laisser appuyer la touche actualiser sature le serveur, je suppose que le fait d'être en local y est pour quelque chose.

J'ai pu régler le soucis pour apache avec le mod_evasive. Très pratique, le serveur renvoie une erreur 403 pendant 10 secondes quand on se montre un peu trop indélicat avec lui, ce qui l'empêche de monter en load average et c'était précisément ce que je voulais.

Cependant, le mod fonctionne pour les sites en php, mais à priori pas pour awstats qui est un script perl "awstats.pl" je sature toujours le serveur à l'aide d'une seule touche.

J'ai jetté un coup d'oeil au page statique, mais du peu que j'en ai vu les statistiques fournies me semble moins complète, dommage, ça reste une alternative intéressante.

Concernant le prefork tu veux parler de ces lignes là ?

Code : Tout sélectionner

<IfModule prefork.c>
StartServers       2
MinSpareServers    1
MaxSpareServers   2
ServerLimit      3
MaxClients       3
MaxRequestsPerChild  4000
</IfModule>
J'ai déjà essayé d'y mettre des valeurs ridicules mais ça n'empêchait pas la saturation, ça empêche juste apache de créer 256 processus mais le CPU bloque à 100% malgré tout.

Peut-être qu'avec une règle iptables ça marcherait, mais je ne les maitrises pas assez pour faire ce que je souhaite avec.


Merci beaucoup pour tes réponses ;)

Nils
Messages : 89
Inscription : 22 octobre 2009, 18:55

Re: Apache + awstats = surcharge.

Message par Nils » 17 septembre 2010, 23:08

Hello,

je ne possède plus de serveur web d'hébergement sous CentOS, mais sous NetBSD. Cependant, j'ai enfin pu prendre le temps de tester en actualisant plus que de nécessaire la page de statistiques et effectivement, perl se met à logiquement consommer beaucoup plus de ressources.

D'après la documentation officielle d'Awstats, le seul moyen passe par la génération de pages statiques. Si cela ne te convient pas tu peux passer par un proxy (nginx, squid ou autre) possédant un mode "reverse proxy" et mettant les pages en cache.

Du côté de la prévention contre des personnes qui feraient trop de requêtes trop rapidement, tu peux aussi te tourner vers iptables, en utilisant le module "recent" (dispo à partir de CentOS 5). Ce module est en général utilisé pour limiter les accès lors de bruteforces ssh, du moins la plupart des exemples que j'ai vus l'utilisent à cette fin. Voici un exemple :

Code : Tout sélectionner

IPTABLES="/sbin/iptables"
IFACE="eth0"
$IPTABLES -A INPUT -i $IFACE -p tcp --dport ssh -m state --state NEW -m recent --set --name BRUTESSH
$IPTABLES -A INPUT -i $IFACE -p tcp --dport ssh -m state --state NEW -m recent --update --seconds 600 --hitcount 3 --rttl --name BRUTESSH -j DROP
$IPTABLES -A INPUT -i $IFACE -p tcp --dport ssh -j ACCEPT
Je te laisse en exercice (fouiller dans la manpage d'iptables) la signification de la deuxième règle. Attention cependant aux valeurs que tu mets ;)

Concernant les prefork Apache, il faut les adapter selon la taille de ton infra et la quantité de visiteurs. J'héberge sur un domU Xen NetBSD avec 256Mo de mémoire vive 4 blogs sous Dotclear, un site avec un CMS léger, le tout avec leurs stats. J'ai fini par mettre la configuration suivante :

Code : Tout sélectionner

<IfModule mpm_prefork_module>
    ServerLimit          30  
    StartServers         10  
    MinSpareServers       5   
    MaxSpareServers       5   
    MaxClients           30  
    MaxRequestsPerChild  15  
</IfModule>
Tu remarqueras qu'avec un MaxClients à 30, je n'irai pas bien loin, mais je n'héberge pas de site à grande audience, mon blog fait à tout casser 50 visites par jour. J'ai aussi fortement diminué MaxRequestsPerChild, je ne l'ai vu à plusieurs milliers que sur de gros sites.

Si PHP te pose problème, je pense que la lecture du dernier hors-série de GNU/Linux Magazine France peut t'aider. Si tes applications PHP peuvent en tirer parti, memcached peut s'avérer utile. Il semble que memcached existe aussi pour les applications perl, mais je ne crois pas qu'Awstats en tire parti (à vérifier cependant).

Bon courage pour la suite !

Avatar de l’utilisateur
Mithrah
Messages : 19
Inscription : 07 novembre 2009, 11:54
Localisation : Charleroi(.be)

Re: Apache + awstats = surcharge.

Message par Mithrah » 19 septembre 2010, 22:10

Merci Nils pour cette réponse super complète.

Les pages statiques fonctionnent pas si mal en faite, lors de mon premier essais j'avais mis un output trop restrictif donnant trop peu d'information.

La règle iptables est monstrueuse, comment tuer une mouche avec un bazooka. Enfin, ça marche et même vraiment très bien.


Je vais donc, soit utiliser les pages statiques + script approprié, soit mettre un virtualhost sur un autre port pour les stats + règle iptables restrictive sur ce port. La solution du proxy me semble contraignante pour le moment à mettre en place.


Encore un grand merci ;)

Nils
Messages : 89
Inscription : 22 octobre 2009, 18:55

Re: Apache + awstats = surcharge.

Message par Nils » 20 septembre 2010, 17:26

Hello,

pour l'iptables, t'y vas un peu fort... fusil à pompe, je veux bien, mais pas bazooka :lol:
Sinon, ma préférence va aux pages statiques. Je suis tenté de faire de même sur mon hébergement.

Concernant le virtualhost sur un autre port, pourquoi pas, mais le problème restera le même : si de nombreuses personnes consultent les stats, le serveur s'écroulera quand même. La règle firewall s'assurera juste que ce n'est pas une personne qui fera trop d'actualisations.

Verrouillé