Apache Proxy stellt mehr Verbindungen her als er soll

MrToiz

Well-known member
ID: 72115
L
28 April 2006
766
91
Hallo,
seit gestern bin ich stolzer Besitzer eines unter Linux laufenden Apache (Version 2.2.3/MPM Prefork). Nun hab ich leider ein ernsthaftes Problem...

Und zwar verbietet das Webfrontend meines DSL-Routers (Netgear RP614v2) mehrere gleichzeitige Zugriffe. Jetzt will ich aber genau dies (einerseits soll alle x Sekunden per Script meine aktuelle IP-Adresse ausgelesen werden, andererseits will ich natürlich auch noch selbst Zugriff auf das Menü haben).

Um dieses Problem in den Griff zu kriegen, habe ich vor einiger Zeit, als mein Apache noch unter Windows lief (dort in Version 2.2.4) einfach einen Proxy eingerichtet mit folgenden Optionen:
Code:
<VirtualHost *:80>
	ServerName routeradmin
	ServerAlias routeradmin.geisnet.dyndns.org router-admin.geisnet.dyndns.org
	ProxyPass /error/ !
	ProxyPass /icons/ !
	ProxyPass / https://router.geisnet.dyndns.org/	max=1
	ProxyPassReverse / https://router.geisnet.dyndns.org/
	SetEnv force-proxy-request-1.0
 	SetEnv proxy-nokeepalive 1
	ErrorLog /var/log/apache2/proxy-error.log
	CustomLog /var/log/apache2/proxy-access.log combined

	<Proxy *>
		Order deny,allow
		Allow from all
		Deny from all
		Allow from 127.0.0.0/8
		Allow from .geisnet.dyndns.org
	</Proxy>
</VirtualHost>
Die Option max=1 und die Zeile SetEnv proxy-nokeepalive 1 sorgten dafür, dass der Apache nur eine einzige Verbindung aufbaute und über diese alle Clients versorgte, was auch wunderbar funktionierte...bis ich dann auf Linux wechselte!
Jetzt bekomme ich zu 90% einen 503-Fehler (Service Unavailable), der darauf hindeutet, dass der Apache versucht, mehrere gleichzeitige Verbindungen zum Router aufzubauen.
Die Ausgabe von netstat deutet auch daraufhin, dass die max=1 Anweisung einfach missachtet wird und stattdessen jedesmal gleich mehrere Verbindungen aufgebaut werden:
Code:
moritz@Geisbutler:~$ netstat -a | grep router
tcp        0      0 geisbutler.geisnet:4162 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4161 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4160 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4165 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4164 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4155 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4154 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4153 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4159 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4157 router.geisnet.dynd:www TIME_WAIT
tcp        0      0 geisbutler.geisnet:4156 router.geisnet.dynd:www TIME_WAIT
moritz@Geisbutler:~$

Ich hab mich schon schier tot-gegoogelt, aber einfach nichts passendes gefunden, überall scheint das Limit zu funktionieren...

Hat irgendwer eine Idee?

Vielen Dank,
MrToiz
 
Das liegt bestimmt am MPM. Die maximale Verbindunsanzahl
ergibt sich aus "max * ServerLimit" ... wobei "MaxThreads"
auch noch etwas mit ausmachen könnte. Schau mal in die extra
Konfigurationsdatei für MPM Prefork.
 
Hmm, das wäre eine Erklärung, hatte das Apache-Manual hier anders interpretiert:
Apache Manual schrieb:
Hard Maximum number of connections that will be allowed to the backend server. The default for a Hard Maximum for the number of connections is the number of threads per process in the active MPM. In the Prefork MPM, this is always 1, while with the Worker MPM it is controlled by the ThreadsPerChild. Apache will never create more than the Hard Maximum connections to the backend server.
Klang für mich so, als ob das bei Prefork automatisch 1 wäre (wobei das ja auch unlogisch wäre, da das im Normalfall ja sehr unperformant ist).

Die MPM-spezifischen Konfigurationsparameter sehen so aus:
Code:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

Lässt sich da irgendwas einstellen, oder muss ich tatsächlich zwingend auf ein anderes MPM ausweichen?
 
Worauf genau möchtest du denn hinaus?
Wenn es nur um das Auslesen deiner IP geht, warum
dann nicht einfach mit einem kleines PHP-Skript auf
einem externen Server? :think:
 
Naja, ich mache mich da gerne unabhängig von externen Servern...wäre doof, wenn mein privater Webspace mal nicht erreichbar ist und deswegen mein dyndns-Host ebenfalls in die Knie geht.
Außerdem hatte ich so auch schonmal Probleme mit dem Web-Interface, wenn ich von einem PC an einen anderen gewechselt habe (musste dann so lange warten, bis PC1 seine Verbindung beendet hatte und der Router wieder bereit für eine neue war).
Und zu guter letzt geht es mir ums Prinzip :) Bin doch Linux-Neuling und will mich so lange an den Konfigurationsdateien austoben, bis alles so funktioniert, wie ich will :D
 
MrToiz schrieb:
Kann dein Router seine WAN-IP nicht an Dienste wie DynDNS & Co. schicken?

MrToiz schrieb:
Und zu guter letzt geht es mir ums Prinzip :) Bin doch Linux-Neuling und will mich so lange an den Konfigurationsdateien austoben, bis alles so funktioniert, wie ich will :D
Dann musst dich auch so oder so gleich mal an das Lesen
ewig langer Dokumentationen gewöhnen. ;)
 
Kann dein Router seine WAN-IP nicht an Dienste wie DynDNS & Co. schicken?
Doch kann er, allerdings gehen dann die Einstellungen bezüglich Wildcard-Subdomains und MX-Entries verloren :( Und mehrere Domains unterstützt er auch nicht (wobei ich darauf auch noch verzichten könnte)

Dann musst dich auch so oder so gleich mal an das Lesen
ewig langer Dokumentationen gewöhnen. ;)
Glaub mir, mit der Apache-Dokumentation hab ich mich schon so einige Zeit beschäftigt, da ich auch unter Windows nie XAMPP oder ähnliches verwendet habe (gut, jetzt habe ich den Apache und alle anderen Dienste via aptitude installiert, aber auf verschiedenen Test-Systemen habe ich auch schon selbst kompiliert :)), und auch sonst lese ich i.d.R. erst stundenlang Docs, Manuals, How-Tos und Forenbeiträge, bevor ich eine Frage stelle :)