Amit: Apache / VirtualHost

hallo allesamt

ich mache nebenbei websites für kleinst Firmen und um die seiten local zu testen haben ich apache, php, etc installiert. Soweit läuft alles.

Mich "nervt", nun, da ich immer die httpd.conf editieren muss um die Pfad für die Varibale DocumentRoot anzupassen.

Wie kann ich das elegant über Ports (localhost:PORT#) erledigen?

Oder gibt es einen bessern Weg alle sites, ohne veränderungen, lokal zu testen?

Gruss

Amit

  1. MUH ... während ich meine Frage geschrieben habe, habe ich mit mySQL "gekämpft".

    Meine Frage hat _nichts_ mit Datenbanken zu tun, sondern mit (web-)SERVER

    sorry wegen der "Täuschung"

    Amit

    1. hi.

      sieh mal in der httpd.conf nach "alias".

      lg aw

  2. hallo allesamt

    ich mache nebenbei websites für kleinst Firmen und um die seiten local zu testen haben ich apache, php, etc installiert. Soweit läuft alles.

    Mich "nervt", nun, da ich immer die httpd.conf editieren muss um die Pfad für die Varibale DocumentRoot anzupassen.

    Wie kann ich das elegant über Ports (localhost:PORT#) erledigen?

    Nö, aber du solltest es mit virtuellen Hosts erledigen.

    Zwei Dinge sind dazu notwendig:

    1. Eine entsprechend konfigurierte httpd.conf
    2. Ein DNS-Name, der auf deinen Server zeigt - simplerweise in der Datei "hosts".

    Nummer 1 sollte sich relativ leicht erledigen lassen. Am Ende einer jeden httpd.conf, die ich bislang gesehen habe, ist ein Beispiel für die Konfiguration eines virtuellen Hosts. Das Beispiel einfach kopieren und je Projekt einmal anlegen. Dabei mußt du im Prinzip nur DocumentRoot und ServerName angeben. Der ServerName sollte nicht mit einem realen Namen im Internet in Konflikt geraten - und auch nicht allzuviel Tipparbeit sein. :) Beispielsweise empfiehlt es sich, eine Top-Level-Domain "test" zu erfinden, und als Subdomain den Projektnamen zu nehmen: projekt1.test, projekt2.test

    Diesen Namen benötigst du in Nummer 2. Lege eine Datei "hosts" ohne Endung an (kopiere im Zweifel die Datei C:\WINDOWS\HOSTS.SAM - unter Unix /etc/hosts benutzen) und lege neue Zeilen für jedes deiner Projekte an:

    127.0.0.1  projekt1.test
    127.0.0.1  projekt2.test

    Abspeichern, Server neustarten, http://projekt1.test aufrufen.

    PS: Demoeintrag für einen Virtuellen Host:
    <VirtualHost *>
      ServerName projekt1.test
      DocumentRoot /pfad/zu/projekt1
      ErrorLog /pfad/zum/errorlog/für/projekt1
      CustomLog /pfad/zum/accesslog/für/projekt1 combined
    </VirtualHost>

    - Sven Rautenberg

    1. hi Sven,

      Zwei Dinge sind dazu notwendig:

      1. Eine entsprechend konfigurierte httpd.conf

      zwingend erforderlich

      1. Ein DNS-Name, der auf deinen Server zeigt - simplerweise in der Datei "hosts".

      nicht _zwingend_ erforderlich, aber dringlich empfohlen ;-)

      127.0.0.1  projekt1.test
      127.0.0.1  projekt2.test

      hm. Über die Verwendung der loopback-Adresse für virtualhosts haben wir bereits gelegentlich diskutiert. Es ist nicht prinzipiell falsch oder gar schädlich, ich neige dennoch aus Gründen der "Sauberkeit" (doofes Wort, mir fällt aber grade kein besseres ein) dazu, von der Verwendung der loopback-Adresse eindringlich abzuraten. Man hat ja genügend "private IP's" zur Verfügung und kann die 127 getrost außen vor lassen.
      (falls Michael Schröpl mitliest: ich hab die Argumentation weder vergessen noch überlesen)

      PS: Demoeintrag für einen Virtuellen Host:
      <VirtualHost *>
        ServerName projekt1.test
        DocumentRoot /pfad/zu/projekt1
        ErrorLog /pfad/zum/errorlog/für/projekt1
        CustomLog /pfad/zum/accesslog/für/projekt1 combined
      </VirtualHost>

      Das kann funktionieren. Nach meiner bisherigen Erfahrung ist das Konzept der "namenbasierten virtualhosts" aber zuverlässiger. Also ungefähr in dieser Form:

      NameVirtualHost 192.168.0.1
      <VirtualHost 192.168.0.1>
       ServerName projekt1.test
       DocumentRoot /pfad/zu/projekt1
       ErrorLog /pfad/zum/errorlog/für/projekt1
       CustomLog /pfad/zum/accesslog/für/projekt1 combined
      </VirtualHost>

      das hat den Vorteil, daß man auf dieselbe "private" IP mehrere virtuelle hosts setzen kann.

      Grüße aus Berlin

      Christoph S.

      1. Aloha, Christoph!

        1. Ein DNS-Name, der auf deinen Server zeigt - simplerweise in der Datei "hosts".
          nicht _zwingend_ erforderlich, aber dringlich empfohlen ;-)

        Für Virtuelle Hosts, die nicht auf verschiedenen IP-Adressen desselben Interfaces basieren (ich hätte Probleme, _das_ unter Windows hinzukriegen) ist ein DNS-Eintrag zwingend erforderlich. Sonst kann der Server die einzelnen Hosts nicht unterscheiden, und man müsste in der Tat auf die Multi-Port-Lösung ausweichen, was eine hohe Merkfähigkeit für die Portnummern voraussetzt und die Situation unnötig verkompliziert.

        127.0.0.1  projekt1.test
        127.0.0.1  projekt2.test
        hm. Über die Verwendung der loopback-Adresse für virtualhosts haben wir bereits gelegentlich diskutiert. Es ist nicht prinzipiell falsch oder gar schädlich, ich neige dennoch aus Gründen der "Sauberkeit" (doofes Wort, mir fällt aber grade kein besseres ein) dazu, von der Verwendung der loopback-Adresse eindringlich abzuraten. Man hat ja genügend "private IP's" zur Verfügung und kann die 127 getrost außen vor lassen.

        Natürlich hat man im Prinzip reichlich Auswahl. Allerdings muss die verwendete IP-Adresse einem lokalen Netzwerkgerät gehören - also muss irgendwie eine aktive Netzwerkkarte konfiguriert sein. Fehlt solch eine Karte, hat man ein Problem, unnötigen Konfigurationsaufwand und mehr Trouble, als notwendig wäre, um die Aufgabe auf dem schnellsten Weg zu lösen. Existiert hingegen ein privates Netzwerk, kann man natürlich generell verfügbare IP-Adressen verwenden und die Hosts-Datei dann schlicht zwischen allen Maschinen kopieren.

        Gegen die IP-Adresse des Loopback-Devices ist nichts einzuwenden - lediglich das Kopieren der Hosts-Datei wird dadurch erschwert. Das interne Routing lenkt aber ohnehin jeden Zugriff auf eine lokale IP-Adresse nach 127.0.0.1 um - für einen Testrechner ist das vollkommen Banane, egal und gleichgültig, Hauptsache, es funktioniert (was es ja tut).

        PS: Demoeintrag für einen Virtuellen Host:
        <VirtualHost *>
          ServerName projekt1.test
          DocumentRoot /pfad/zu/projekt1
          ErrorLog /pfad/zum/errorlog/für/projekt1
          CustomLog /pfad/zum/accesslog/für/projekt1 combined
        </VirtualHost>

        Das kann funktionieren. Nach meiner bisherigen Erfahrung ist das Konzept der "namenbasierten virtualhosts" aber zuverlässiger. Also ungefähr in dieser Form:

        NameVirtualHost 192.168.0.1
        <VirtualHost 192.168.0.1>
        ServerName projekt1.test
        DocumentRoot /pfad/zu/projekt1
        ErrorLog /pfad/zum/errorlog/für/projekt1
        CustomLog /pfad/zum/accesslog/für/projekt1 combined
        </VirtualHost>

        das hat den Vorteil, daß man auf dieselbe "private" IP mehrere virtuelle hosts setzen kann.

        Ähm, ich hab sowohl mit der einen als auch mit der anderen Methode mehrere virtuelle Hosts auf einer IP-Adresse sitzen. Was außerhalb der VirtualHost-Direktive noch dafür sorgt, dass das eine oder andere funktioniert, kann ich spontan nicht sagen, dazu müsste ich Dokus nachlesen. Jedenfalls geht beides.

        - Sven Rautenberg

          1. Ein DNS-Name, der auf deinen Server zeigt - simplerweise in der Datei "hosts".
            nicht _zwingend_ erforderlich, aber dringlich empfohlen ;-)

          Für Virtuelle Hosts, die nicht auf verschiedenen IP-Adressen desselben Interfaces basieren [..] ist ein DNS-Eintrag zwingend erforderlich. Sonst kann der Server die einzelnen Hosts nicht unterscheiden,

          Da wage ich mal zu widersprechen: Der Server unterscheidet die Anfragen an namensbasierte Hosts einzig anhand der Host:-Angabe vom Browser, nicht anhand eines wie auch immer gearteten DNS-Eintrages.

          Wie sollte er auch anhand eines DNS-Eintrages etwas unterscheiden, wenn sämtliche Namen auf dieselbe Adresse zeigen? Von einer Verbindung ist dem Server lediglich seine eigene (für mehrere Hosts gleiche) IP-Nummer und die der Gegenstelle bekannt. Aus welchem Namen der Client die Nummer für die Verbindung bekommen hat, kann der Server nicht wissen - deshalb Host:.

          PS: Demoeintrag für einen Virtuellen Host:
          <VirtualHost *>
            ServerName projekt1.test
          </VirtualHost>

          Das kann funktionieren. Nach meiner bisherigen Erfahrung ist das Konzept der "namenbasierten virtualhosts" aber zuverlässiger.

          Das Beispiel oben _ist_ ein namensbasierter Host. Und in dieser Form ist es sogar günstiger als das Beispiel unten, weil es nicht auf eine spezielle IP-Nummer festgelegt ist (s.u.).

          Also ungefähr in dieser Form:

          NameVirtualHost 192.168.0.1
          <VirtualHost 192.168.0.1>
          ServerName projekt1.test
          </VirtualHost>

          Ähm, ich hab sowohl mit der einen als auch mit der anderen Methode mehrere virtuelle Hosts auf einer IP-Adresse sitzen. Was außerhalb der VirtualHost-Direktive noch dafür sorgt, dass das eine oder andere funktioniert,

          Die verantwortliche Anweisung für namensbasierte Hosts ist einzig und allein NameVirtualHost.

          Beide Blöcken oben arbeiten mit diesem Konzept, der Unterschied ist lediglich, daß der erste auf allen IP-Adressen des Rechners horcht, der untere nur auf der 192.168.0.1. Beim ersten Block hat aber anscheinend jemand vergessen, die NameVirtualHost-Zeile mit zu zitieren.

          Gruß,
            soenk.e

          1. use Mosche;

            1. Ein DNS-Name, der auf deinen Server zeigt - simplerweise in der Datei "hosts".
              nicht _zwingend_ erforderlich, aber dringlich empfohlen ;-)

            Für Virtuelle Hosts, die nicht auf verschiedenen IP-Adressen desselben Interfaces basieren [..] ist ein DNS-Eintrag zwingend erforderlich. Sonst kann der Server die einzelnen Hosts nicht unterscheiden,

            Da wage ich mal zu widersprechen: Der Server unterscheidet die Anfragen an namensbasierte Hosts einzig anhand der Host:-Angabe vom Browser, nicht anhand eines wie auch immer gearteten DNS-Eintrages.

            Der DNS Eintrag _ist_ unerläßlich, weil der Client den (namensbasierten!) Host nicht finden würde :-). Eine Abfrage anhand der IP (ohne Host:) ist bei namensbasierten VirtualHosts reichlich sinnbefreit.

            use Tschoe qw(Matti);

              1. Ein DNS-Name, der auf deinen Server zeigt - simplerweise in der Datei "hosts".
                nicht _zwingend_ erforderlich, aber dringlich empfohlen ;-)

              Für Virtuelle Hosts, die nicht auf verschiedenen IP-Adressen desselben Interfaces basieren [..] ist ein DNS-Eintrag zwingend erforderlich. Sonst kann der Server die einzelnen Hosts nicht unterscheiden,

              Da wage ich mal zu widersprechen: Der Server unterscheidet die Anfragen an namensbasierte Hosts einzig anhand der Host:-Angabe vom Browser, nicht anhand eines wie auch immer gearteten DNS-Eintrages.

              Der DNS Eintrag _ist_ unerläßlich, weil der Client den (namensbasierten!) Host nicht finden würde :-).

              Ok, für ordinäre Webbrowser stimmt das natürlich :) Hat aber mit der Funktion des Webservers ansich (wie Sven es dargestellt hat) nichts zu tun, denn ein fehlender DNS-Eintrag hindert niemanden daran, mit geeigneter Software (telnet) über die IP-Nummer zu verbinden und Host: kurzerhand manuell zu setzen (nun wird's kleinlich ;)

              Gruß,
                soenk.e

    2. Hallihallo,

      tschulljung, daß ich mich erdreiste, hier mal so "quer" einzusteigen, aber das Thema interessiert mich momentan auch.

      Sven, ich habe Deinen Lösungsvorschlag mal versucht nachzuvollziehen (Win2k + Apache 1.3.12), aber egal, welche Hostadresse ich im Browser aufrufe - ich bekomme immer nur dieselbe Seite zurückgeliefert, und zwar diejenige, die auch vorher schon ohne die virtuellen Hosts zurückgeliefert wurde. Fehlt noch was...?

      Gruß,
      Stefan

      1. Sven, ich habe Deinen Lösungsvorschlag mal versucht nachzuvollziehen (Win2k + Apache 1.3.12), aber egal, welche Hostadresse ich im Browser aufrufe - ich bekomme immer nur dieselbe Seite zurückgeliefert, und zwar diejenige, die auch vorher schon ohne die virtuellen Hosts zurückgeliefert wurde. Fehlt noch was...?

        Wenn der Servername richtig gesetzt ist, wahrscheinlich nur das "NameVirtualHost *".

        Gruß,
          soenk.e

        1. [...] Fehlt noch was...?

          Wenn der Servername richtig gesetzt ist, wahrscheinlich nur das "NameVirtualHost *".

          Hi Sönke,

          stimmt, diesen Eintrag hatte ich nicht "ent-remarkt". Werde ich heute abend zu Hause gleich mal ausprobieren. Danke einstweilen...

          Stefan

          1. Hi,

            [...] Fehlt noch was...?

            Wenn der Servername richtig gesetzt ist, wahrscheinlich nur das "NameVirtualHost *".

            Yeah, jetzt klappt's:

            hosts

            127.0.0.1       localhost
            127.0.0.1       xyz
            127.0.0.1       bla

            httpd.conf

            NameVirtualHost localhost

            <VirtualHost localhost>
             ServerName xyz
             DocumentRoot C:/Projects/xyz/www
             ErrorLog C:/Projects/xyz/error.log
             CustomLog C:/Projects/xyz/access.log common
            </VirtualHost>

            <VirtualHost localhost>
             ServerName bla
             DocumentRoot C:/Projects/bla/www
             ErrorLog C:/Projects/bla/error.log
             CustomLog C:/Projects/bla/access.log common
            </VirtualHost>

            Den * mochte er nicht; dort mußte tatsächlich eswas stehen (entweder 127.0.0.1 oder localhost).

            [Das nur noch der Vollständigkeit halber.]

            Gruß,
            Stefan

            1. Wenn der Servername richtig gesetzt ist, wahrscheinlich nur das "NameVirtualHost *".

              NameVirtualHost localhost

              <VirtualHost localhost>
              ServerName xyz

              <VirtualHost localhost>
              ServerName bla

              Den * mochte er nicht; dort mußte tatsächlich eswas stehen (entweder 127.0.0.1 oder localhost).

              Probier mal _default_ . In der Apache-Anleitung steht das Sternchen merkwürdigerweise nicht mehr drin (sondern eben _default_).

              Domainnamen anzugeben ist AFAIK etwas unglücklich, zu dem Problem ist auch ein extra Kapitel in der Apache-Anleitung.

              Gruß,
                soenk.e