Je gère les forums de Mozfr (ex-Geckozone) depuis 2012, la communauté des bénévoles francophones de Mozilla. C'est un gros forum (>750.000 messages, >80.000 inscrits) qui fête ce mois-ci ses 23 ans d'existence. phpBB marche très bien, ça tourne sur un petit VPS sponsorisé par Gandi, (merci à eux !).
Depuis un an, le serveur est matraqué par toutes les IA de la terre, au point que la charge serveur le met régulièrement en panne. Je pense que 99% des hits sur le serveur sont probablement uniquement des bots qui aspirent notre contenu. Je n'ai pas la main sur tout sur le serveur, pas non plus des compétences devops et il y a des contraintes sur le serveur qui sont liées à son histoire qui ne me permettent pas d'installer ce que je veux. Je ne peux donc pas installer des bloqueurs de traffic IA comme Anubis ou souscrire à un service payant type Cloudflare. J'ai donc mis des solutions en place maison au niveau de l'htaccess (le serveur est sous Apache), du paramétrage des forums eux-mêmes, de la configuration PHP (même si le goulot d'étranglement est surtout sur mariadDB et Apache) et des crons qui tournent dans la journée.
A force d'essais, de tâtonnements et aussi de suggestions de Gemini (comme quoi, j'ai rien contre l'IA), voici les changements qui ont très bien marché pour nous.
Changements dans phpBB
- Général > Paramètres de la recherche > Intervalle d’affluence de la recherche des invités > 60s
- Général > Paramètres de la recherche > Méthode d’indexation de la recherche : Mysql Fulltext
- Général > Paramètres de la recherche > Afficher les invités dans la liste des utilisateurs en ligne > Non
- Général > Paramètres de la recherche > Afficher le statut de connexion des utilisateurs > Non
Ce qui matraque le serveur, ce sont d'une part les bots qui lancent des recherches texte, j'ai donc restreint le délai entre deux recherches, et les sessions invitées ajoutées dans la base pour chaque visite. Les simple compteurs de visiteurs sur la page d'accueil marchent très bien pour quelques dizaines voire quelques centaines de visiteurs par heure, mais quand ce sont des dizaines de milliers d'IP de bots par heure, ça crée une véritable charge sur la BDD. De la même manière, on utilisait depuis plus de 20 ans la recherche texte de phpBB sans problème qui n'est pas liée à la base utilisée, mais vu la charge la recherche texte mysql semble bien plus performante. Bref, il fallait minimiser la charge sur la BDD car c'était notre plus gros goulot d'étranglement.
Changements de paramètres Apache
Changement de la valeur de MaxRequestWorkers de 150 à 300 connexions. Ajout de "ServerLimit 10". On a 4Go de Ram et on peut se permettre cette petite augmentation.
> cat /etc/apache2/mods-enabled/mpm_worker.conf
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ServerLimit 10
ThreadsPerChild 25
MaxRequestWorkers 300
MaxConnectionsPerChild 0
</IfModule>
Changement de la valeur de KeepAliveTimeout dans /etc/apache2/apache2.conf de 5s à 2s.
cat /etc/apache2/apache2.conf | grep KeepAliveTimeout
# KeepAliveTimeout: Number of seconds to wait for the next request from the
KeepAliveTimeout 2
Changements des paramètres PHP dans opcache.ini
Ces changements sont des suggestions de Gemini de changements du fichier opcache.ini, je ne suis pas sûr qu'elles aient beaucoup joué sur la charge mais ça ne mange pas de pain.
; configuration for php opcache module
; priority=10
zend_extension=opcache.so
opcache.jit=off
; Give it enough room to actually breathe (256MB is safe for most forums)
opcache.memory_consumption=512
; Fix the string buffer issue (increase from 8MB to 32MB)
opcache.interned_strings_buffer=32
; Since phpBB has many files, keep this high
opcache.max_accelerated_files=20000
; During bot attacks, stop checking for file changes every second.
; 60 seconds is much easier on the CPU.
opcache.revalidate_freq=60
; This is important for stability
opcache.save_comments=1
Changements du crontab Transvision
On a de multiples sous-domaines, l'un deux est une application maison d'indexation des chaînes à traduire de Firefox et Thunderbird, Transvision, qui extrait les données de multiples dépôt et les traite toutes les deux heures. C'est essentiellement du python, c'est lent et ça cause plein d'I/O. J'ai mis donc des paramètres nice et surtout ionice qui réduisent au maximum les accès disques. Ce n'était pas un problème avec une charge serveur normale, c'est pourquoi on ne l'avait pas fait. L'indexation prend un peu plus de temps mais ce n'est pas un problème.
00 */2 * * * /usr/bin/nice -n 19 /usr/bin/ionice -c 3 /chemin/vers/script
Blocage de blocs d'IP
J'ai décidé de bloquer des régions entières, on a déjà du blocage d'IP dans phpBB géré par les modérateurs contre les spammeurs et on bloquait spécifiquement des IPs depuis un an mais la rotation des IPs était trop rapides, des blocages qui marchaient une semaine étaient continuellement à refaire. Les forums sont dédiés essentiellement aux francophones, j'ai donc décidé de bloquer l'Asie, des pays d'Afrique anglophone et du Brésil et des gros services cloud aux États-Unis. C'est malheureux mais ça a aidé, surtout le blocage des IP chinoises:
# 1. phpBB Security: Protect core files
<FilesMatch "^(config\.php|common\.php)$">
Require all denied
</FilesMatch>
# 2. CONSOLIDATED IP BLOCKING (Processed before Rewrite)
# This is much faster for the CPU than separate blocks
<RequireAll>
Require all granted
# --- THE USA & CLOUD BLOCK (The "Hammering" Culprits) ---
# Amazon AWS
Require not ip 3.0.0.0/8 13.0.0.0/8 34.192.0.0/10 52.0.0.0/10
# Google Cloud
Require not ip 34.0.0.0/11 35.184.0.0/13
# Microsoft Azure
Require not ip 13.64.0.0/11 40.64.0.0/10 52.145.0.0/16 20.0.0.0/8 172.213.0.0/16
# DigitalOcean / Cloud Infrastructure
Require not ip 104.16.0.0/12 159.203.0.0/16 45.0.0.0/8
# --- ASIA/CHINA BACKBONE (High Bot Activity) ---
Require not ip 1.48.0.0/14 1.180.0.0/14 1.192.0.0/13 14.0.0.0/8 27.0.0.0/8
Require not ip 36.0.0.0/8 42.88.0.0/11 43.0.0.0/8 49.32.0.0/11 58.32.0.0/11
Require not ip 58.208.0.0/12 59.32.0.0/11 60.0.0.0/10 61.128.0.0/10 101.248.0.0/14
Require not ip 103.0.0.0/8 106.0.0.0/8 110.0.0.0/8 111.0.0.0/8 112.0.0.0/10
Require not ip 113.0.0.0/8 114.0.0.0/8 115.128.0.0/9 116.0.0.0/10 117.0.0.0/8
Require not ip 118.0.0.0/8 119.0.0.0/10 120.0.0.0/8 121.0.0.0/8 122.0.0.0/8
Require not ip 123.0.0.0/8 124.0.0.0/8 125.0.0.0/8 139.192.0.0/10 171.0.0.0/8
Require not ip 180.96.0.0/10 182.0.0.0/8 183.0.0.0/8 218.0.0.0/10 221.0.0.0/8
Require not ip 222.0.0.0/8 223.0.0.0/8
# --- LATAM & AFRICA ---
Require not ip 41.32.0.0/14 102.0.0.0/10 105.0.0.0/10 154.0.0.0/10
Require not ip 177.0.0.0/8 179.0.0.0/8 181.0.0.0/11 186.0.0.0/10 187.0.0.0/8
Require not ip 189.0.0.0/8 190.0.0.0/10 191.0.0.0/8 197.0.0.0/11 200.0.0.0/11 201.0.0.0/8
# --- IPv6 ---
Require not ip 2400:89c0::/32 2408:8000::/14 2409:8000::/14 240e::/18
# --- Specidic IPs ---
Require not ip 81.167.26.0/24
Require not ip 90.156.143.0/24
</RequireAll>
# Force a hard 403 with no fancy PHP styling
ErrorDocument 403 "Forbidden: Access Denied"
# 3. REWRITE RULES (Processed only if IP is allowed)
<IfModule mod_rewrite.c>
RewriteEngine on
# Bot Blocking via User Agent
RewriteCond %{HTTP_USER_AGENT} (AddSearchBot|AI2Bot|Amazonbot|anthropic-ai|Applebot|AzureAI|Bytespider|CCBot|ChatGPT|Claude|Crawl4AI|DeepSeekBot|Diffbot|FacebookBot|Gemini|GPTBot|MetaSr|MistralAI|OpenAI|Perplexity|PetalBot|QichaoBot|SemrushBot|DotBot|AhrefsBot) [NC]
RewriteRule ^.*$ - [F,L]
# phpBB standard URL Rewriting
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
# 4. PERFORMANCE & OPTIONS
<IfModule mod_headers.c>
Header set Retry-After "600"
</IfModule>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
À noter que j'envoie une 403 en texte brut aux bots identifiés et que je bloque aussi par user agent les gros bots connus, évidemment on a aussi un fichier robots.txt par acquis de conscience que l'on maintient avec la liste fournie part ai.robots.txt. A côté de ça on bloque aussi en 403 pour une semaine les IP qui pilonnent (100 requêtes par secondes) via fail2ban mais c'est une solution qui ne marche plus trop parce que l'indexation se fait maintenant par des dizaines d'IP en parallèle réparties dans le monde entier, mais on a quand même laissé les règles en place.
Voilà, ça a marché pour notre petit VPS, on ne bloque qu'une fraction des bots mais ils n'ont plus d'impact négatif sur le serveur et tous nos sites sont en ligne et réactifs. En espérant que ça aide d'autres projets communautaires qui sont dans une situation similaires ou bien que les solutions que j'ai listé donnent des pistes d'adaptation dans votre propre contexte.












La communauté Mozilla sera à Bruxelles pour le 
















