2008-10-02 10 views
4

J'ai une application web écrite en utilisant CherryPy, qui est exécuté localement sur 127.0.0.1:4321. Nous utilisons mod-rewrite et mod-proxy pour qu'Apache agisse comme un proxy inverse; Apache gère également notre cryptage SSL et peut éventuellement être utilisé pour transférer tout notre contenu statique.Les douilles Apache ne se ferment pas?

Tout cela fonctionne très bien pour les petites charges de travail. Cependant, j'ai récemment utilisé urllib2 pour écrire un script de test de stress qui simulerait une charge de travail de 100 clients. Après un certain temps, chaque client reçoit une erreur 503 d'Apache, indiquant qu'Apache ne peut pas se connecter à 127.0.0.1:4321. CherryPy fonctionne correctement, mais mon journal des erreurs Apache révèle des lignes comme les suivantes:

[Thu Oct 02 12:55:44 2008] [error] (OS 10048)Only one usage of each socket address (protocol/network address/port) is normally permitted. : proxy: HTTP: attempt to connect to 127.0.0.1:4321 (*) failed

recherche sur Google pour cette erreur révèle que Apache a probablement courir de descripteurs de fichier socket. Comme j'ai seulement 100 clients en cours d'exécution, cela signifie que les connexions ne sont pas fermées, soit entre ma connexion urllib2 et Apache (j'appelle certainement .close() sur la valeur de retour de urlopen), ou entre Apache et CherryPy.

J'ai confirmé que ma demande urllib2 envoie un en-tête HTTP Connection: close, bien que Apache soit configuré avec KeepAlive On si cela est important.

Dans le cas où il importe, j'utilise Python 2.5, Apache 2.2, CherryPy 3.0.3, et le serveur est en cours d'exécution sur Windows Server 2003.

Alors, quelle est ma prochaine étape pour arrêter ce problème?

Répondre

5

SetEnv proxy-nokeepalive 1 vous dira probablement tout de suite si le problème est keepalive entre Apache et CP. Voir le mod_proxy docs pour plus d'informations.

+1

Cela a résolu le problème instantanément. Merci beaucoup! –

5

Vous pouvez exécuter la commande netstat et voir si vous avez un groupe de sockets dans l'état TIME_WAIT. En fonction de votre paramètre MaxUserPort, le nombre de ports disponibles peut être très limité. En outre, le paramètre TcpTimedWaitDelay est généralement défini sur 240 secondes. Les sockets utilisés ne peuvent donc pas être réutilisés pendant quatre minutes.

Il y a plus de bonnes informations ici ->http://smallvoid.com/article/winnt-tcpip-max-limit.html

Questions connexes