Sven: Apache Virueller-Server-Cocktail

Heyho mal wieder :o)

ziemlich treffend ist mir gerade die Bezeichnung "Cocktail" einge-
fallen, denn anders kann man diesen Mix aus Ip-basierten- sowie
Namensbasierten Virtuellen Hosts in den Konfigurationsdateien meines
kleinen Indianers wirklich nicht besser bezeichnen.
An für sich ist die Sache ganz einfach:

* die Domain xyz.tld mitsamt seinen netten Subdomains wird quasi
  zu 121.122.123.124 aufgelöst
* die Domain abc.tld mitsamt seinen netten Subdomains wird quasi
  zu 111.112.113.114 aufgelöst.

das funktioniert auch ausgezeichnet (da ich damit zeitweise nicht
mehr so in Übung war, habe ich vor einiger Zeit hier daher auch des-
wegen ein Posting geschrieben), aber mit _default_ hackt es.

_default_, das "matcht" ja immmer dann, wenn ein Query nicht etwa
über die IP-Adressen 121.122.123.124 oder 111.112.113.114 kommt. Dies
könnte z.B. bei loopback-adresse 127.0.0.1 der Fall sein.

Bevor ich mit der Fehlerbeschreibung loslege, noch mal kurz und knapp
und sehr vereinfacht die Praxisumsetzung:

NameVirtualHost 121.122.123.124:80
<VirtualHost 121.122.123.124:80>
    ServerName xyz.tld
    ServerAlias xyz.tld ...
    # standartserver für 121.122.123.124
</VirtualHost>

<VirtualHost 121.122.123.124:80>
    ServerName sonstwas.xyz.tld
    ServerAlias sonstwas.xyz.tld
    # exemplarischer Namensbasierter Virtueller Host für 121.122.123.124
</VirtualHost>

NameVirtualHost 111.112.113.114:80
<VirtualHost 111.112.113.114:80>
    ServerName abc.tld
    # standartserver für 111.112.113.114
</VirtualHost>

<VirtualHost 111.112.113.114:80>
    ServerName sonstwas.abc.tld
    # exemplarischer Namensbasierter Virtueller Host für 111.112.113.114
</VirtualHost>

Achtung, jetzt wird's interessant :o)

<VirtualHost _default_:80>
    ServerName irgendeinDefaultServer
    # Defaultserver für alle Querys,  die nicht über
    # 121.122... oder 111.112... reinkommen (die Hostnamen
    # sind jetzt im Grunde genommen auch egal)
</VirtualHost>

So, wie gesagt, das einzige, was Probleme macht, ist der _default_-Virtuelle-Host-Container:

[Fri Dec 17 17:08:22 2004] [error] VirtualHost _default_:80 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results     .

ich werde daraus nicht schlau... - immerhin habe ich überall :80 als Ports dahintergeschrieben und NameVirtualHost dürfte ich für _default_ nicht brauchen (ist ja auch kein namensbasierter host dort dabei).

Weiß jemand, was der will?

thx,

Sven :)

  1. hallo Sven,

    [Fri Dec 17 17:08:22 2004] [error] VirtualHost _default_:80 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results     .
    ich werde daraus nicht schlau... - immerhin habe ich überall :80 als Ports dahintergeschrieben

    Was nicht wirklich zwingend nötig ist, es sei denn, du willst deine virtuellen hosts über verschiedene ports ansprechen.

    und NameVirtualHost dürfte ich für _default_ nicht brauchen

    Jau, _genau das_ ist es.

    Weiß jemand, was der will?

    Ja, steht ja deutlich da: du kannst IP-basierte und namensbasierte virtuelle hosts nicht einfach so durcheinanderwürfeln. Allerdings kannst du sehr wohl beide in _einer_ httpd.conf notieren. Beispiel steht in meinem Apache-Artikel, Abschnitt virtuelle hosts

    Konkret ist es die Reihenfolge. Schreib mal deine httpd.conf so:
     <VirtualHost _default_:80>
         ServerName irgendeinDefaultServer
         # Defaultserver für alle Querys,  die nicht über
         # 121.122... oder 111.112... reinkommen (die Hostnamen
         # sind jetzt im Grunde genommen auch egal)
     </VirtualHost>

    NameVirtualHost 121.122.123.124:80
    <VirtualHost 121.122.123.124:80>
        ServerName xyz.tld
        ServerAlias xyz.tld ...
        # standartserver für 121.122.123.124
    </VirtualHost>
    <VirtualHost 121.122.123.124:80>
        ServerName sonstwas.xyz.tld
        ServerAlias sonstwas.xyz.tld
        # exemplarischer Namensbasierter Virtueller Host für 121.122.123.124
    </VirtualHost>
    NameVirtualHost 111.112.113.114:80
    <VirtualHost 111.112.113.114:80>
        ServerName abc.tld
        # standartserver für 111.112.113.114
    </VirtualHost>
    <VirtualHost 111.112.113.114:80>
        ServerName sonstwas.abc.tld
        # exemplarischer Namensbasierter Virtueller Host für 111.112.113.114
    </VirtualHost>

    Eine zweite Möglichkeit besteht darin, die Virtualhost-Angaben in eine bzw. zwei eigene Datei(en) auszulagern. Beispielsweise schreibst du in "virthost1.conf" deinen IP-basierten virtuellen host hinein, und in "virthost2.conf" deine namensbasierten virtuellen hosts. Beide Konfigurationsschnipsel bindest du dann mit "Include" in deine httpd.conf ein.

    Grüße aus Berlin

    Christoph S.

    1. Hallo Christoph,

      ich werde daraus nicht schlau... - immerhin habe ich überall :80 als Ports dahintergeschrieben
      Was nicht wirklich zwingend nötig ist, es sei denn, du willst deine virtuellen hosts über verschiedene ports ansprechen.

      genau. Aber als ich die Ports überall komplett wegließ, hat es -
      im Gegensatz zu der Notation mit den Ports - überhaupt nicht ge-
      klappt. Jaja, ein sonderbares Verhalten legen meine Indianer da
      an den Tag...

      und NameVirtualHost dürfte ich für _default_ nicht brauchen
      Jau, _genau das_ ist es.

      wie darf ich das verstehen? immerhin habe ich ja auch nicht etwa
      eine Direktive wie

      NameVirtualHost _default_

      ... ;)

      Weiß jemand, was der will?
      Ja, steht ja deutlich da: du kannst IP-basierte und namensbasierte virtuelle hosts nicht einfach so durcheinanderwürfeln.

      definiere(durcheinanderwürfeln);

      Allerdings kannst du sehr wohl beide in _einer_ httpd.conf no

      tieren.

      Ich habe für jede Plattform eine einzelne httpd.conf, dazu eine
      plattformübergreifende "shared.conf" sowie jeweils eine "win.conf"
      und eine "linux.conf" für die "plattformspezifischen direktiven", was
      leider wegen dem unterschiedlichen "Dateiadressierungsverfahren"
      notwendig ist. Also nix da mit "einer httpd.conf" ;o)

      Beispiel steht in meinem Apache-Artikel, Abschnitt virtuelle hosts

      ja, das hast du mir doch schonmal verlinkt ;). Und obwohl ich deinen
      Artikel echt toll finde, ja, eine Menge Arbeit hast du da reingesteckt,
      weitergeholfen hat mir dieser Artikel beim besten Willen nicht.

      Konkret ist es die Reihenfolge. Schreib mal deine httpd.conf so:
      ....

      Das hilft schon viel mehr weiter :) So, jetzt habe ich es
      entsprechend umgestellt mal ausprobiert. Ist aber genau das gleiche.

      Eine zweite Möglichkeit besteht darin, die Virtualhost-Angaben in eine bzw. zwei eigene Datei(en) auszulagern. Beispielsweise schreibst du in "virthost1.conf" deinen IP-basierten virtuellen host hinein, und in "virthost2.conf" deine namensbasierten virtuellen hosts. Beide Konfigurationsschnipsel bindest du dann mit "Include" in deine httpd.conf ein.

      Das Problem ist ja, dass ich nicht einfach "hier" die IP-basierten
      und "dort" die namensbasierten habe, sondern dass die IP-basierten
      Hosts ja so quasi in Namensbasierte aufgeteilt sind. Also "pro
      IP-adresse Namensbasierte hosts". oder wie man das auch immer aus-
      drücken soll.

      Apropos, kann man eigentlich einen einzelnen Virtuellen Host mehrmals
      in einer entsprechenden Direktive erwähnen? Damit könnte ich zumindest
      die virtuellen Hosts in einer "plattformunabhängigen" (ich liebe dieses
      Wort ;o) Konfigurationsdatei zusammenfassen. Also z.B. sowas:

      <VirtualHost ...>
          ServerName vwx
          # und weitere plattformunabhängige direktiven
      </VirtualHost>

      und an anderer Stelle - in diesem Falle für Linux:

      <VirtualHost ...>
          ServerName vwx
          DocumentRoot /var/www/webserver/abc/def/ghi
      </VirtualHost>

      Grüße,

      sven

      1. hallo Sven,

        immerhin habe ich ja auch nicht etwa
        eine Direktive wie
        NameVirtualHost _default_

        Warum nicht? Hast du so etwas wenigstens mal probiert? Was passiert da? Was sagen deine logs zu so einem Versuch?

        du kannst IP-basierte und namensbasierte virtuelle hosts nicht einfach so durcheinanderwürfeln.
        definiere(durcheinanderwürfeln);

        Du hast mit "NameVirtualHost" _eine_ IP definert, die für alle darunterstehenden <VirtualHost>-Container gültig sein soll. Aber du schreibst einen Container darunter, der eben _nicht_ für die angegebene IP gilt.

        Konkret ist es die Reihenfolge.
        Das hilft schon viel mehr weiter :)

        Gut.

        So, jetzt habe ich es entsprechend umgestellt mal ausprobiert. Ist aber genau das gleiche.

        Hm. Hast du dir schon mal überlegt, was "__default__" für eine IP ist?

        Eine zweite Möglichkeit besteht darin, die Virtualhost-Angaben in eine bzw. zwei eigene Datei(en) auszulagern.
        Das Problem ist ja, dass ich nicht einfach "hier" die IP-basierten
        und "dort" die namensbasierten habe, sondern dass die IP-basierten
        Hosts ja so quasi in Namensbasierte aufgeteilt sind.

        Na und? Du möchtest für mehrere IP-Adressen also auch jeweils mehrere virtuelle Hosts definieren. Dann tus doch einfach. Die beste Übersicht behältst du, wenn du für jede IP, die du benutzen möchtest, einen eigenen Konfigurationsschnipdel "IP.conf" anlegst und den per "Include" in deine httpd.conf einbindest  -  die darf dann natürlich nicht nochmal für dieselben IP-Adressen <VirtualHost>-Container enthalten.

        Apropos, kann man eigentlich einen einzelnen Virtuellen Host mehrmals
        in einer entsprechenden Direktive erwähnen?

        Prinzipiell ja  -  aber ich bin nicht sicher, ob ich diese Nachfrage richtig verstehe.

        Damit könnte ich zumindest
        die virtuellen Hosts in einer "plattformunabhängigen" Konfigurationsdatei zusammenfassen. Also z.B. sowas:
        <VirtualHost ...>
            ServerName vwx
            # und weitere plattformunabhängige direktiven
        </VirtualHost>
        und an anderer Stelle - in diesem Falle für Linux:
        <VirtualHost ...>
            ServerName vwx
            DocumentRoot /var/www/webserver/abc/def/ghi
        </VirtualHost>

        Auch das verstehe ich nicht so _ganz_. Das würde bedeuten, daß deine httpd.conf bzw. die dafür nötigen Files auf einer Partition liegen, die unabhängig vom gerade gefahrenen Betriebssystem ansprechbar ist. _Das_ läßt sich zwar noch machen. Aber eine Abfrage nach dem Schema
          if (Windows){
          nimm windowshttpd.conf
          } else {
          nimm linuxhttpd.conf
          }
        ist mir nicht vorstellbar. Du kannst an vielen Stellen in den Containern der httpd.conf RegExpressions einsetzen, aber daß eine "Plattformunabhängigkeit" sich so erreichen läßt, wie du das andeutest, halte ich derzeit zumindest für unmöglich  -  und auch nicht für sinnvoll.

        Grüße aus Berlin

        Christoph S.

        1. Hallo Christoph,

          immerhin habe ich ja auch nicht etwa
          eine Direktive wie
          NameVirtualHost _default_
          Warum nicht?

          Wenn ich das wüsste, gäb es wohl dieses Thread nicht ;o)

          Hast du so etwas wenigstens mal probiert?

          Selbstverständlich. Fehler:

          [Fri Dec 17 22:06:11 2004] [warn] NameVirtualHost _default_:80 has no VirtualHosts     .

          sowie natürlich wieder

          [Fri Dec 17 22:06:11 2004] [error] VirtualHost _default_:80 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results     .

          Was passiert da? Was sagen deine logs zu so einem Versuch?

          Quasi das gleiche wie vorher auch :|

          du kannst IP-basierte und namensbasierte virtuelle hosts nicht einfach so durcheinanderwürfeln.
          definiere(durcheinanderwürfeln);
          Du hast mit "NameVirtualHost" _eine_ IP definert, die für alle darunterstehenden <VirtualHost>-Container gültig sein soll. Aber du schreibst einen Container darunter, der eben _nicht_ für die angegebene IP gilt.

          ach so ist das mit "NameVirtualHost"! :o)

          Was dann aber unlogisch ist: Wieso muss die IP nochmal im entsprechenden Virtualhost-Container angegeben werden?

          So, jetzt habe ich es entsprechend umgestellt mal ausprobiert. Ist aber genau das gleiche.
          Hm. Hast du dir schon mal überlegt, was "__default__" für eine IP ist?

          beispielsweise 127.0.0.1? eigentlich brauche ich _default_ gar nicht,
          aber falls dann doch irgendwann mal wieder irgendwas streikt und der
          Computer sich seine IP mittels DHCP holt, dann wär's halt ganz nett,
          wenn das ganze auch so funktionieren würde.

          Naja, wenn's halt nicht klappt, dann lass ich den _default_-Server
          eben weg und fertig :)

          Apropos, kann man eigentlich einen einzelnen Virtuellen Host mehrmals
          in einer entsprechenden Direktive erwähnen?
          Prinzipiell ja  -  aber ich bin nicht sicher, ob ich diese Nachfrage richtig verstehe.

          hm, irgendwie ist dieser Satz auch etwas blöd geschrieben. Ich meinte
          eigentlich, ob

          <VirtualHost x>
              ServerName bla
              Allow from xyz
          </VirtualHost>

          #...

          <VirtualHost x>
              DocumentRoot bla
              Deny from abc
          </VirtualHost>

          das gleiche wie

          <VirtualHost x>
             ServerName bla
             Allow from xyz
             DocumentRoot bla
             Denny from abc
          </VirtualHost>

          ergibt.

          Damit könnte ich zumindest
          die virtuellen Hosts in einer "plattformunabhängigen" Konfigurationsdatei zusammenfassen. Also z.B. sowas:
          <VirtualHost ...>
              ServerName vwx
              # und weitere plattformunabhängige direktiven
          </VirtualHost>
          und an anderer Stelle - in diesem Falle für Linux:
          <VirtualHost ...>
              ServerName vwx
              DocumentRoot /var/www/webserver/abc/def/ghi
          </VirtualHost>
          Auch das verstehe ich nicht so _ganz_. Das würde bedeuten, daß deine httpd.conf bzw. die dafür nötigen Files auf einer Partition liegen, die unabhängig vom gerade gefahrenen Betriebssystem ansprechbar ist.

          Was z.b. möglich ist, in dem man die Dinger einfach in den DocumentRoot packt, der ja auch für beide OS erreichbar ist (damit es auf beiden laufen kann), ich nutze dazu schlicht und einfach Fat32, was ohne Probleme funktioniert.

          _Das_ läßt sich zwar noch machen. Aber eine Abfrage nach dem Schema
            if (Windows){
            nimm windowshttpd.conf
            } else {
            nimm linuxhttpd.conf
            }
          ist mir nicht vorstellbar.

          Hm, mit <If ...> kann man vielleicht auch Umgebungsvariablen überprüfen und dann einbinden, aber das ist imho auch gar nicht möglich. Jeder apache auf seinem OS bekommt erst mal eine "Basis-httpd.conf" zugewiesen, wo seine spezifischen Daten stehen (z.B. sowas wie User & Group unter Linux, was Win ja nicht braucht/will/hat ;). Dann werden ganz einfach die weiteren Config-Files von dieser Fat-Partition dort geladen, d.h. jeweils eine Config-File, die beide Apachen nutzen (die nenne ich ja so nett "plattformunabhängig") und dann halt die Plattformspezifische. Dann steht in der Linux-httpd.conf halt

          Include /var/www/webserver/server/apache/conf/linux.conf
             (bzw. eigentlich eher /etc/apache2/conf/webserver/linux.conf)

          und beim Windows

          Include "E:/Homepages/webserver/server/apache/conf/win.conf"

          oder sowas in der Art.

          Du kannst an vielen Stellen in den Containern der httpd.conf RegExpressions einsetzen, aber daß eine "Plattformunabhängigkeit" sich so erreichen läßt, wie du das andeutest, halte ich derzeit zumindest für unmöglich  -  und auch nicht für sinnvoll.

          ja, zuerst habe ich versucht, die Verzeichnisse mit <Location>-Containern anzugeben, um kein regex nutzen zu müssen, aber dann hielt ich es doch für sinnvoller, das ganze zu trennen und mit <Directory>'s zu machen, da dies zum einen deutlich sicherer ist, und zum anderen die <Location>-angaben Case-sensitive sind, was unter Windows ja nicht so optimal ist (wenn z.b. da steht
          <Location /server/apache>
              Deny from all
          </Location>
          und man beim Win-Apache dann einfach http://.../server/Apache angibt, hat man den Passwortschutz schnell umgangen).

          Grüße,

          Sven