• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] virtual hosts: browser meldet bad request

luwa

Member
Hallo
ich habe einen Apache2 unter Suse 11.1 am laufen. Einen virtual Host an Port 80 einen anderen an Port 443. Die Anbindung nach draußen über DynDNS. Zu Anfang liefen auch beide unter gleichem Namen. Jedoch kam nach einer gewissen Zeit bei Anfragen an Port 80 immer ein "Bad Request" im Browser. Die Namen der virtual Hosts sind nun auch verschieden. Ein "rcapache restart" und alles läuft wieder bis..........
Loglevel auf info angehoben aber nix zu finden. OK sollte ich noch mal auf debug setzen.
Kennt jemand das Problem?

luwa

Lösung 6.Okt.2009
OpenSuSe 11.1
Ein SSL-VHost funktioniert nicht (Doku-Apache.org) als NameVirtualHost. Bei der nächsten Einwahl ändert sich die IP des Servers, der Apache hat aber immer noch die beim Start ermittelte IP. Somit wird nur der als Default-Vhost erkannte erreicht. Je nachdem was da gefunden wird hängt dieser VHost dann an Port 80 (sehr wahrscheinlich) oder Port 443. Das ergibt einen Bad Request bzw. die Seite ist nicht erreichbar. Manchmal verhaspelt sich der Apache auch komplett so dass einige links in die gleiche DocRoot nicht erreichbar sind.
Somit muss der Apache ein restart hinlegen. Bei mir habe ich folgendes getan.
Ein mit ip-up korespondierendes Script (/etc/ppp/ip-up/script) schreibt eine 1 nach /var/log/re-new.log
Ein weiteres Script wertet via Cron re-new.log aus. Findet es dort die 1 wird der Apache neu gestartet und re-new.log wieder auf 0 gesetzt. Ein sleep 30 vor dem restart hat sich als nützlich erwiesen. Treffen Wiedereinwahl und Apache restart zeitlich eng aufeinander sind die Effekte beim Apache meist noch caotischer (sorry meine Beobachtung) als ohne Neustart.
 

panamajo

Guru
"Bad Request" erhält man wenn man das falsche Protokoll verwendet, das wird wohl bei dir der Fall sein.
Sind die VHs so konfiguriert:
www.example.com für HTTP, secure.example.com für HTTPS

dann erhält man bei
https://www.example.com
oder
http://secure.example.com

den Fehler.
 
OP
L

luwa

Member
endlich mal wieder Zeit für Probleme.

@spoensche
stimmt im log steht dass das Protokoll nicht verstanden wird. Nach der Zwangstrennung (über Script) wird der Port 80 VHost auf Port 443 gezogen. Noch keine Ahnung warum.

@panamajo
ich habe leider nicht herausfinden können was die von Dir gesetzten Links mir zeigen sollten.

Also poste ich mal die Configs. Alles auskommentierte habe ich mal rausgeschmissen.
listen.conf
Code:
Listen 80
<IfDefine SSL>
    <IfDefine !NOSSL>
	<IfModule mod_ssl.c>
	    Listen 443
	</IfModule>
    </IfDefine>
</IfDefine>

vhost.conf
Code:
<VirtualHost linux2.dyndns.tld:80>
    ServerAdmin luwa@wudu.de
    ServerName linux.dyndns.tld:80
    DocumentRoot "/srv/www/vhosts/normal"
    ErrorLog /var/log/apache2/normal.error_log
    CustomLog /var/log/apache2/normal.access_log combined
    HostnameLookups Off
    UseCanonicalName Off
    ServerSignature On
    <IfModule mod_userdir.c>
	UserDir public_html
	Include /etc/apache2/mod_userdir.conf
    </IfModule>
    <Directory "/srv/www/vhosts/normal">
	Options Indexes FollowSymLinks
	AllowOverride None
        Order allow,deny
	Allow from all
        </Directory>
</VirtualHost>

vhost-ssl.conf
Code:
<IfDefine SSL>
<IfDefine !NOSSL>
<VirtualHost linux3.dyndns.tld:443>
	DocumentRoot "/srv/www/vhosts/secure"
	ServerName linux.dyndns.tld:443
	ServerAdmin luwa@wudu.de
	ErrorLog /var/log/apache2/secure.error_log
	TransferLog /var/log/apache2/secure.access_log
	SSLEngine on
	SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
	SSLCertificateFile /etc/apache2/ssl.crt/server.crt
	SSLCertificateKeyFile /etc/apache2/ssl.key/server.key
	SSLCertificateChainFile /etc/apache2/ssl.crt/ca.crt
	SSLCACertificatePath /etc/apache2/ssl.crt
	<Files ~ "\.(cgi|shtml|phtml|php3?)$">
	    SSLOptions +StdEnvVars
	</Files>
	<Directory "/srv/www/cgi-bin">
	    SSLOptions +StdEnvVars
	</Directory>
	SetEnvIf User-Agent ".*MSIE.*" \
		 nokeepalive ssl-unclean-shutdown \
		 downgrade-1.0 force-response-1.0
	CustomLog /var/log/apache2/ssl_request_log   ssl_combined

</VirtualHost>                                  

</IfDefine>
</IfDefine>

Meine Überlegung geht nun dahin dass ich das HostNameLookup auf DNS setze und beiden VHosts unterschiedliche Namen gebe. Danach in der Loopback Zone des DNS die Namen auf 127.0.0.3 und 127.0.0.4 eintrage. Die VirtualHost Directive bekommt dann die so vergebenen IP's anstelle des Namens. Denn wie schon erwähnt tritt das Problem immer erst nach der erneuten Einwahl ins Internet auf. Alternativ könnte ich dem Script für die Zwangstrennung natürlich auch einen Apache-Neustart verpassen, aber das ist irgendwie nicht im Sinne des Erfinders.
 

spoensche

Moderator
Teammitglied
Mit einer 127.x.x.x IP kannst du nicht in das Internet. Das ist die IP für das Loopback- Interface. Also kann das online schon mal nicht funktionieren.

Du kannst nicht einfach eine Subdomain für HTTPS verwenden, wenn du nur eine Domain hast. Folglich musst deiner Hauptdomain für HTTPS den Port 443 vergeben. (Siehe den Post von panamajo)
 

panamajo

Guru
luwa schrieb:
@panamajo
ich habe leider nicht herausfinden können was die von Dir gesetzten Links mir zeigen sollten.
Das sind keine Links, auch wenn phpBB daraus welche macht, sondern Beispiele.

Es läuft darauf hinaus dass du HTTPS Verbindungen zu einem nur für HTTP konfigurierten Server veruchst aufzubauen (und/oder umgekehrt).
 
OP
L

luwa

Member
@spoensche
schon klar das ich mit einer 127.x.x.x nicht ins Internet kann. Die nicht gepostete localhost.conf besagt jedodoch, wenn ich im Intranet zugreife, also 192.168.22..x wird in der access.log ein Eintrag ala 127.0.0.2 erzeugt. Erstaunlicherweise funktioniert mein Konstrukt bis zu nächsten Zwangstrennung. Ich will auch nur dass mein VHost auf dem richtigen Port lauscht. Im Buch "Apache für Dummis" wird die VirtualHost Directive auch immer mit einer IP beschrieben. Wenn die Auflösung über den VHost-Namen läuft und der Name im DNS zu finden ist und darauf hin der VHost am richtigen Port angefahren wird habe ich alles was ich will.
Prinzipiell sollte es möglich sein unter einem VhostNamen und verschieden Ports zwei verschiedene Seiten zu hosten. Unter der gleichen IP und verschiedenen Namen und verschiedenen Ports auf jeden Fall.
Was mache ich verkerhrt
 

spoensche

Moderator
Teammitglied
Du verwendest namensbasierte Virtual Hosts. Wenn im Buch der Virtual Host mit einer IP konfiguriert wird, werden IP basierte Virtual Hosts verwendet, die dann unter verschiedenen Namen ansprechbar sind.
 
OP
L

luwa

Member
So den Bad Request bin ich los. Allerdings keine Ahnung mehr wo ich überall in den Configs geschraubt habe. Wollte ich die VHosts mit Yast einrichten. Danach ging garnichts mehr. Apache neu installiert.
Nach der Neueinwahl wird der NamedVHost an Port 80 dann auf die default_server.conf gezogen. Das lässt sich lösen. Was ich nicht verstehe ist dass der Apache zwar die Ports trennt aber nicht die Namen. Denn wenn ich unter linux2 den Port 443 verlange lande ich auf der Seite des linux3. Liegt das am Apache-prefork? Sollte ich den worker nehmen? Das muss sich doch in irgendeiner Config festschreiben lassen. Wie läuft das denn bei anderen die mehrere Vhosts auf einer Maschine haben. Die können doch nicht jedem Vhost einen eigenen Port geben. :???:
 

spoensche

Moderator
Teammitglied
Hast du in deiner bearbeiteten Konfiguration evtl. dem Apache mitgeteilt, dass er auf dem Port 443 bei linux3 auf Anfragen warten soll? Apache Prefork undd Worker hat nichts mit den Virtual Hosts zu tun. Sie sind für Kindprozesse verantwortich.
 
OP
L

luwa

Member
Ja habe ich. Du kannst ja mal schauen die Vhost.conf's für linux2 und linux3 habe ich ja hier gepostet. Die Portangabe bei ServerName wird wohl nicht richtig sein. Steht aber auch in der <Vhost> directive drinn.
Habe mich auch noch mal mit der Doku auf Apache.org beschäftigt. Wenn ich das richtig verstanden habe lässt sich ein SSL-Vhost nicht als NameVirtualHost betreiben sondern nur als IP-Vhost. Damit stehe ich mit DynIP ziemlich im Regen. Stellt sich die Frage ob die eth1 --> Modem (dsl0) die IP bei der Einwahl wechselt oder dsl0. Der Apache akzeptiert ja in der listen.conf keine Alias einer Netzwerkkarte.
Ein rcapache2 start -S liefert
EXTERNE-IP:443 <Pfad-zur-conf-des-linux3:37>
INTERNE-IP:80 <Pfad-zur-conf-des-linux2:15>
Da ist also schon mal was faul. Was bedeuten die Zahlen am Ende des Conf-Pfades?
Ich wurschtel mal weiter.
 
Oben