Aller au contenu

Conseils pour gestion de ressources sur une requete


joboy84

Sujets conseillés

Hello :)

Je me pose une question sur la gestion des ressources serveur.

J'ai dans ma base plus de 100000 adresses ip (serveurs proxies publics, ip de robots... toutes valides) de visiteurs à bannir de mon site.

J'ai 3 solution:

1) J'effectue au début de chaque pages une requête mysql qui va vérifier si l'ip du visiteur est présente dans la base.

2) Je met tout le contenu de ma base dans un tableau que je met dans une variable de session, et je verifie si l'ip est présente dans le tableau. Le problème est que si j'ai 20000 visiteurs qui ont tous une variable de session avec 100000 entrées cela va être lourd je pense...non?

3) J'utilise un fichier htaccess. Probleme: cela est plus long et agacant à mettre à jour car il faut ajouter et supprimer les entrées manuellement en général.

Je précise que les adresses ip changent constamment, il y a environs 20000 suppressions/remplacements tous les 2 jours.

Quelle est la meilleure solution à vos yeux?

merci

Lien vers le commentaire
Partager sur d’autres sites

D'abord, il s'agit d'optimiser ta base SQL:

- utilise un entier (unsigned int) et pas un champ texte pour l'adresse IP (conversion avec ip2long)

- évidemment il doit y avoir un index sur cette adresse IP

- autant que possible pas ou peu d'autres données dans la table

Je ne suis pas un expert de mysql (je suis plutôt postgresql), mais a priori pour ce genre de chose assure-toi que ta table est en MyISAM, et utilise éventuellement myisamchk --sort-index. Je ne sais pas s'il y a l'équivalent d'un "VACUUM FULL" ou d'un "CLUSTER" (qui permettent de faire l'équivalent d'une défragmentation de disque en récupérant tout l'espace libéré par les lignes effacées/modifiées, donc de réduire la taille de la table sur disque, donc d'augmenter les hits en cache et de limiter les seeks)?

Ensuite, tu peux au choix:

- utiliser un cache mémoire (par exemple memcache, mais je pense que c'est un peu overkill, mais il doit y avoir d'autres options)

- utiliser un fichier DBM (voir les fonctions dba_* en php), ça évite un peu d'overhead réseau, parsing, etc.

- ne vérifier que la première fois qu'un utilisateur se connecte avec une IP donnée, puis mettre un cookie (ou une variable de session) qui contient son IP (et probablement une clef calculée sur cette IP)

- si le nombre d'IPs autorisées et actives est sensiblement inférieur au nombre d'IPs non autorisées (et le nombre d'accès par les IPs autorisées supérieur au nombre d'accès par les IPs non autorisées), un cache "positif" (sous la forme d'une table mysql, d'un cache type memcache, d'un fichier DBM, voire d'une arbo de fichiers) peut se révéler suffisant (par rapport à un cache "global").

Je pense que les autres solutions évoquées auront un effet négatif sur les perfs.

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

si tu dois le faire uniquement pour les membres c'est simple tu rajoutes un champ SQL et lors de la récupération des données du membre tu fais ta vérification.

Si c'est pour tous les visiteurs ça se corse.

1) ça me semble correct, tu peux aussi utiliser une table memory. Par contre si tu souhaites éviter une requête par page moi j'éviterais pour des raisons de sécurité de mettre un cookie qui te dit en gros que le visiteur est valide. Il vaut mieux un couple : session où tu y mets que le visiteur est valide de cette session (pour la retrouver) l'IP+une clé que tu es le seul à connaître, le tout hashé par exemple en md5 dans le cookie pour permettre retrouver la session. Une durée de session d'environ 2 minutes, comme ça si il y a vol de cookie la session sera déjà morte.

Problème tu devras faire une liste blanche pour les moteurs de recherche, service de ping si tu utilises un blog, ... Cette méthode peut vite devenir contraignante.

2) Dans cet esprit tu peux faire un fichier cache avec le tableau de tes IPs sérialisées et à chaque page tu désérialises et tu vérifies avec la fonction in_array().

Cette méthode est lourde si tu le fait à chaque page vue.

3) comme tu dis c'est vite ingérable et peut être que c'est très lourd pour Apache.

Je pense que le mieux est de charger le tableau des IPs en mémoire, c'est plus rapide et de toute façon si tu choisis la méthode du tableau ( array ) ça sera chargé en mémoire donc bon autant le faire qu'une fois. Tu fais ça avec memcache par exemple et si ton audience grimpe encore c'est pas trop compliquer de mettre en place un cluster de serveurs memcache. Puis comme c'est de la puissance et de la mémoire qu'il te faut, le cluster peut être 2 RPS.

Peut être quand passant par IPtables ou fail2ban ça serait mieux ? Je ne sais pas 100000 IPs c'est du gros quand même.

Modifié par Occi
Lien vers le commentaire
Partager sur d’autres sites

Tu ne dis pas si ce sont des IPs distinctes, ou si ce sont des classes B ou C complètes ?

Exemple, bannir de x.y.z.0 à x.y.z.255 ou bannir de x.y.0.0. à x.y.255.255

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...