# event MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestWorkers: maximum number of worker threads
# MaxConnectionsPerChild: maximum number of requests a server process serves

# Nb de slots total (busy + idle + free) est la valeur la plus basse entre :
# - MaxRequestWorkers (150 par défaut)
# - ThreadsPerChild (25 par défaut) * ServerLimit (16 par défaut)

# Nb de slots idle au démarrage à vide est la valeur la plus haute entre :
# - MinSpareThreads (25 par défaut) arrondi supérieur, pour être un multiple entier de ThreadsPerChild
# - ThreadsPerChild (25 par défaut) * StartServers (2 par défaut)

# Nb minimal de slots idle quand de nombreux slots sont "busy" :
# = MinSpareThreads (25 par défaut) avec un arrondi supérieur pour que 
# busy + idle soient un multiple entier de ThreadsPerChild (25 par défaut)

# Nb maximal de slots idle quand de nombreux slots sont "busy" :
# = MaxSpareThreads (75 par défaut) avec un arrondi supérieur pour que
# busy + idle soient un multiple entier de ThreadsPerChild (25 par défaut)

<IfModule mpm_event_module>
	# Nombre de processus enfants du serveur créés au démarrage
	# Influence uniquement le nb de slots idle au démarrage
	# Régle pour déterminer StartServers: arrondi supérieur de
	# (MinSpareThreads / ThreadsPerChild) + (MaxRequestWorkers / (40 x ThreadsPerChild))
	#StartServers		 2
	StartServers		 9

	# Limite supérieure de la définition du nombre de processus
	# Régle pour déterminer ServerLimit: MaxRequestWorkers / ThreadsPerChild
	# Pour modifier ServerLimit un restart est nécessaire (donc coupure des connexions en cours)
	# Je conseille donc de prendre une marge ServerLimit = 1.5 x (MaxRequestWorkers / ThreadsPerChild)
	# Permet, par la suite, d'augmenter de 50% ThreadsPerChild avec un simple reload
	# ServerLimit            16
	ServerLimit              150

	# Nombre minimum de threads inactifs qui seront disponibles
	# pour pouvoir traiter les pics de requêtes
	# Régle pour déterminer MinSpareThreads: 20 + (MaxRequestWorkers / 20)
	#MinSpareThreads	 25
	MinSpareThreads		 145

	# Nombre maximum de threads inactifs
	# But: libérer de la RAM inutilisée après un pic de trafic
	# Régle pour déterminer MaxSpareThreads: 3 x MinSpareThreads
	#MaxSpareThreads	 75
	MaxSpareThreads		 435

	# Le nombre de threads maximum que l'on peut définir par processus enfant
	# Il est possible de modifier ThreadsPerChild par un simple reload jusqu'à ThreadLimit
	# Pour modifier ThreadLimit un restart est nécessaire (donc coupure des connexions en cours)
	# Si ThreadLimit > ThreadsPerChild, de la mémoire partagée supplémentaire sera inutilement allouée.
	# Régle pour ThreadLimit: ne pas toucher a la valeur par défaut: 64 quel que soit MaxRequestWorkers
	# Régle pour déterminer ThreadsPerChild: 25 (valeur par défaut), quel que soit MaxRequestWorkers
	#ThreadLimit		 64
	ThreadLimit		 25

	# Nombre de threads créés par chaque processus enfant
	# Influence le nb total de slots max ET le nb minimal de slots
	# Si > 40, Apache ne répond plus a certaines requetes, quand il y a de nombreuses connexions asychrones
	# Régle pour déterminer ThreadsPerChild: 25 (valeur par défaut), quel que soit MaxRequestWorkers
	ThreadsPerChild		 25

	# Nombre maximum de connexions pouvant être traitées simultanément
	# Détermine le nombre de requetes actives pouvant être traitées simultanément.
	# A déterminer en fonciton de la charge et de la mémoire disponible
	# Il est possible de modifier MaxRequestWorkers par un simple reload
	#MaxRequestWorkers	 150
	MaxRequestWorkers	 3400

	# Limite le nombre de connexions qu'un processus enfant va traiter au cours de son fonctionnement
	# Définir MaxConnectionsPerChild à une valeur non nulle limite la quantité de mémoire
	# qu'un processus peut consommer à cause de fuites (accidentelles) de mémoire.
	# Régle pour déterminer MaxConnectionsPerChild: fixé à 0, sauf fuite mémoire importante
	MaxConnectionsPerChild   0

	# Cette directive permet de personnaliser finement la limite du
	# nombre de connexions par thread. Un processus n'acceptera de
	# nouvelles connexions que si le nombre actuel de connexions
	# (sans compter les connexions à l'état "closing") est inférieur à:
	# ThreadsPerChild + (AsyncRequestWorkerFactor * nombre de threads inactifs)
	# A faire varier entre 1.5 et 3 en fonction du type de clients du site
	# Régle pour déterminer AsyncRequestWorkerFactor: fixé à 2 (valeur par défaut)
	# Note: Si vous modifiez la valeur par défaut, vous devrez effectuer des tests approfondis
	AsyncRequestWorkerFactor 2

	# Spécifie le délai maximum après lequel le serveur va s'arrêter dans le cas d'un arrêt "en douceur"
	# Défaut: GracefulShutdownTimeout 0 => le serveur va attendre jusqu'à ce que toutes les requêtes en cours aient été traitées.
	# Réduire le GracefulShutdownTimeout a une heure (3600 secondes) permet de réduire certains attaques slow DDOS.
	# Réduire cette valeur en dessous d'une heure peut poser problème pour des clients avec du bas débit
	# Une connexion a 400 Kb/s (50 Ko/s) est en mesure de télécharger 180 Mo en une heure.
	GracefulShutdownTimeout 3600

</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
