mass vhost

Apache, Lighttpd, nginx, Cherokee
kennethsoona
Posts: 22
Joined: 2005-02-23 10:42

mass vhost

Post by kennethsoona » 2008-04-05 03:36

ich habe den vorschlag von der seite http://www.byteorder.org/howto_dynvhosts.html einmal getestet und es läuft relativ gut.
mein problem ist allerdings, dass er mir den document root nicht richtig konfiguriert. er lautet immer /var/www/htdocs (wie ganz unten über DocumentRoot definiert) obwohl er ja eigentlich jeweils so lauten sollte wie in der map-file.

kurze info noch: ich habe zendcore standardmäßig installiert und in der httpd.conf per include meine vhost.conf (siehe unten) eingebunden. per directory definiere ich einen separaten bereich in meinem home-directory für projekte, die ich lokal auf meinem laptop entwickel. das funktioniert alles recht gut, nur der documentroot ist für die dynamisch konfigurierten vhosts falsch.


hier mein script, mit meinen pfaden (documentroot lautet also fälschlicherweise für jeden vhost immer /home/user1/projects/_sites)

Code: Select all

### etc/hosts
127.0.0.10      kunde1.localhost.de

### map-file
kunde1.localhost.de      /home/user1/projects/_sites/kunde1.localhost.de/htdocs

### vhost.conf
<VirtualHost _default_:80>
<Directory "/home/user1/projects/_sites">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

  RewriteEngine on
  RewriteMap lowercase int:tolower

  # die mapping-Datei definieren
  RewriteMap vhost txt:/home/user1/apache-conf/vhost.map

  # die Standard Alias-Definitionen beruecksichtigen
  RewriteCond %{REQUEST_URI} !^/icons/
  RewriteCond %{REQUEST_URI} !^/cgi-bin/

  # Die Umleitung auf das Webmail-Portal
  RewriteCond ${lowercase:%{SERVER_NAME}} ^mail.(.+..+)$
  RewriteRule ^/(.*)$ /horde/$1 [L]

  # Lookup in der vhost.map, Test ob das Verzeichnis existiert und
  # Umschreiben des Requests auf das korrekte Verzeichnis
  RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
  RewriteCond ${vhost:%1} ^(/.*)$
  RewriteCond %1 -d
  RewriteRule ^/(.*)$ %1/$1 [L]

  # Fallback
  RewriteCond ${lowercase:%{SERVER_NAME}} ^www.(.+..+)$
  RewriteCond ${vhost:%1} ^(/.*)$
  RewriteCond %1 -d
  RewriteRule ^/(.*)$ %1/$1 [L]

  # Aufrufe aus dem CGI-Verzeichnis korrekt umschreiben
  # und den korrekten Header zurückliefern
  RewriteCond %{REQUEST_URI} ^/cgi-bin/
  RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
  RewriteCond ${vhost:%1} ^(/.*)$
  RewriteRule ^/(.*)$ %1/cgi-bin/$1 [T=application/x-httpd-cgi,L]

  # default fallback -- wenn nichts trifft dann die Standard-Seite zeigen
  DocumentRoot /home/user1/projects/_sites
</VirtualHost>



statt localhost.de verwende ich eine andere fiktive domain - daran lags nicht.

ich verwende ubuntu v8 mit zendcore

freddy36
RSAC
Posts: 277
Joined: 2008-03-20 17:31

Re: mass vhost

Post by freddy36 » 2008-04-05 09:36

kunde1...?
Willst du so Domains für verschiedene Kunden (Benutzer) verwalten?
Sicherheits technisch ist das da absoluter murks.

Ansonsten setz RewriteLogLevel entsprechend und guck woran es scheitert.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11599
Joined: 2003-02-27 01:00
Location: Hamburg

Re: mass vhost

Post by Joe User » 2008-04-05 12:25

PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

kennethsoona
Posts: 22
Joined: 2005-02-23 10:42

Re: mass vhost

Post by kennethsoona » 2008-04-05 12:34

das ist auf meinem laptop. ich entwickel dort verschiedene projekte. ich hätte es auch xyz1 oder arbeit1 nennen können. live wird das nie gehen.

kennethsoona
Posts: 22
Joined: 2005-02-23 10:42

Re: mass vhost

Post by kennethsoona » 2008-04-05 12:58

habe nun folgende config - die nun erst mal nicht funktioniert. ist bis auf die VirtualHost- und Directory-Direktiven 1:1 von Joe's Tipp.
Er legt mir ein Log-File (access_log) an und da findet sich z.B. folgender Aufruf, der ins leere geht:

Code: Select all

- 127.0.0.10 - - [05/Apr/2008:12:42:36 +0200] "GET /phpinfo.php HTTP/1.1" 404 209

Im error_log findet sich der Grund, warum der Aufruf nicht funktioniert, der DocumentRoot ist wieder falsch...

Code: Select all

[Sat Apr 05 12:57:17 2008] [error] [client 127.0.0.10] script '/usr/local/Zend/apache2/htdocs/phpinfo.php' not found or unable to stat


Code: Select all

##
##  vhost.map
##
project1.localhost.de:80      /home/projects/_sites/project1.localhost.de/htdocs

##
##  vhost.conf
##
<VirtualHost _default_:80>
<Directory "/home/projects/_sites">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

#   use the canonical hostname on redirects, etc.
UseCanonicalName on

#   add the virtual host in front of the CLF-format
CustomLog  /home/apache-log/access_log  "%{VHOST}e %h %l %u %t "%r" %>s %b"

#   enable the rewriting engine in the main server
RewriteEngine on

#   define two maps: one for fixing the URL and one which defines
#   the available virtual hosts with their corresponding
#   DocumentRoot.
RewriteMap    lowercase    int:tolower
RewriteMap    vhost        txt:/home/apache-conf/vhost.map

#   Now do the actual virtual host mapping
#   via a huge and complicated single rule:
#
#   1. make sure we don't map for common locations
#RewriteCond   %{REQUEST_URI}  !^/commonurl1/.*
#RewriteCond   %{REQUEST_URI}  !^/commonurl2/.*
#    :
#RewriteCond   %{REQUEST_URI}  !^/commonurlN/.*
#
#   2. make sure we have a Host header, because
#      currently our approach only supports
#      virtual hosting through this header
RewriteCond   %{HTTP_HOST}  !^$
#
#   3. lowercase the hostname
RewriteCond   ${lowercase:%{HTTP_HOST}|NONE}  ^(.+)$
#
#   4. lookup this hostname in vhost.map and
#      remember it only when it is a path
#      (and not "NONE" from above)
RewriteCond   ${vhost:%1}  ^(/.*)$
#
#   5. finally we can map the URL to its docroot location
#      and remember the virtual host for logging puposes
RewriteRule   ^/(.*)$   %1/$1  [E=VHOST:${lowercase:%{HTTP_HOST}}]
</VirtualHost>

freddy36
RSAC
Posts: 277
Joined: 2008-03-20 17:31

Re: mass vhost

Post by freddy36 » 2008-04-05 13:14

Code: Select all

RewriteLogLevel 9
RewriteLog "var/apache2/logs/rewrite.log"


Mit dem Log sollte sich dann herausfinden lassen wo es hängt...

kennethsoona
Posts: 22
Joined: 2005-02-23 10:42

Re: mass vhost

Post by kennethsoona » 2008-04-05 13:54

es lag an der :80 in der map-file und somit lässt sich die phpinfo.php wieder öffnen. danke für den tipp freddy - ein logfile für rewrites ist ja super konfortabel!

jetzt ist aber der DocumentRoot trotzdem unverändert wie im beispiel unter beitrag1 (/home/projects/_sites)
lass ich die untere directive weg, ist der DocumentRoot gleich dem, der in der httpd.conf definiert wurde. lass ich dir Directory-Directive weg, geht natürlich überhaupt nichts mehr.

hier die ausgabe der rewrite_log
interessant ist hier auch, dass dieser rewrite_log eintrag tatsächlich 3x hintereinander geschrieben wird, ich aber nur einen request abgesendet habe (über firefox 3.0b4) unter ubuntu)

Code: Select all

127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (2) init rewrite engine with requested uri /phpinfo.php
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (3) applying pattern '^/(.*)$' to uri '/phpinfo.php'
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (4) RewriteCond: input='project1.localhorst.eu' pattern='!^$' => matched
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (5) map lookup OK: map=lowercase key=project1.localhorst.eu -> val=project1.localhorst.eu
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (4) RewriteCond: input='project1.localhost.de' pattern='^(.+)$' => matched
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (6) cache lookup FAILED, forcing new map lookup
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (5) map lookup OK: map=vhost[txt] key=project1.localhost.de -> val=/home/projects/_sites/project1.localhost.de/htdocs
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (4) RewriteCond: input='/home/projects/_sites/project1.localhost.de/htdocs' pattern='^(/.*)$' => matched
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (2) rewrite '/phpinfo.php' -> '/home/projects/_sites/project1.localhost.de/htdocs/phpinfo.php'
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (5) map lookup OK: map=lowercase key=project1.localhost.de -> val=project1.localhost.de
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (5) setting env variable 'VHOST' to 'project1.localhost.de'
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (2) local path result: /home/projects/_sites/project1.localhost.de/htdocs/phpinfo.php
127.0.0.10 - - [05/Apr/2008:13:42:03 +0200] [127.0.1.1/sid#8160a90][rid#837a3f0/initial] (1) go-ahead with /home/projects/_sites/project1.localhost.de/htdocs/phpinfo.php [OK]

User avatar
Joe User
Project Manager
Project Manager
Posts: 11599
Joined: 2003-02-27 01:00
Location: Hamburg

Re: mass vhost

Post by Joe User » 2008-04-05 14:30

Das Rewrite funktioniert wie gewünscht, das Problem liegt also woanders. LogLevel hochsetzen (debug) und Logs studieren...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

freddy36
RSAC
Posts: 277
Joined: 2008-03-20 17:31

Re: mass vhost

Post by freddy36 » 2008-04-05 15:07

Ich zweifele stark daran das du mit mod_rewrite den Document root ändern kannst, das ist ja auch gerade das Problem an der ganzen Sache ;)

kennethsoona
Posts: 22
Joined: 2005-02-23 10:42

Re: mass vhost

Post by kennethsoona » 2008-04-05 15:32

danke für die hilfe, ich werde das mal machen und noch bisschen googeln.
ich denke, dass das mit dem document root schon irgendwie funktionieren muss weil sonst macht das ja wenig sinn. also wer braucht x-verschiedene vhosts wenn der document root immer der gleiche ist...

lässt sich evtl. über eine eigene config, die von der vhost.conf zusätzlich includiert wird der document root neu setzen?

User avatar
Joe User
Project Manager
Project Manager
Posts: 11599
Joined: 2003-02-27 01:00
Location: Hamburg

Re: mass vhost

Post by Joe User » 2008-04-05 15:34

Freddy36 wrote:Ich zweifele stark daran das du mit mod_rewrite den Document root ändern kannst,

Das geht durchaus, siehe meinen obigen Link. Ob es auch sinnvoll ist, ist eine andere Frage.

Freddy36 wrote:das ist ja auch gerade das Problem an der ganzen Sache ;)

Nö, die Rewrites funktionieren laut Log ordnungsgemäss...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

freddy36
RSAC
Posts: 277
Joined: 2008-03-20 17:31

Re: mass vhost

Post by freddy36 » 2008-04-05 15:46

KennethSoona wrote:ich denke, dass das mit dem document root schon irgendwie funktionieren muss weil sonst macht das ja wenig sinn. also wer braucht x-verschiedene vhosts wenn der document root immer der gleiche ist...

Für lighttpd kann ich dir das versichern, apaches mod_rewrite kenne ich nicht so gut :)

Macht höchstens für Subdomains Sinn, wie schon gesagt, vhosts per rewrite ist totaler murks, das ist einfach nicht die Aufgabe von mod_rewrite.

Ich weis auch nicht wo da ein Übersichtlichkeits Problem sein soll.
Man legt sich einfach ein Verzeichnis "vhosts" an und macht für jede Domain eine eigene Datei die genau die vhost Config für die Domain beinhaltet.
Dann includest du einfach alles in dem Verzeichnis, wenn sich was endet muss man halt nen reload machen, aber das sollte erträglich sein, wenn einem das so stört kann man da auch was basteln was das dann automatisch macht.

kennethsoona
Posts: 22
Joined: 2005-02-23 10:42

Re: mass vhost

Post by kennethsoona » 2008-04-05 17:37

ich arbeite auf verschiedenen rechnern und da ist natürlich so ein dynamisches vhost script ein bisschen komfortabler, ausserdem werden nur die vhosts geladen, die auch gebraucht bzw. aufgerufen werden - ist aus meiner sicht ein bisschen ordendlicher.

freddy36
RSAC
Posts: 277
Joined: 2008-03-20 17:31

Re: mass vhost

Post by freddy36 » 2008-04-05 18:27

Hab mir mal die mod_rewrite sources angeguckt, da wird definitiv nirgends ein document root gesetzt, lediglich gelesen (DOCUMENT_ROOT Variable).

kennethsoona
Posts: 22
Joined: 2005-02-23 10:42

Re: mass vhost

Post by kennethsoona » 2008-04-06 13:49

habe nun mal das modul mod_vhost_alias ausprobiert und hier kam ich letztendlich zum gleichen ergebnis. allerdings fällt hier die anwendung der mod_rewrites weg - was das konfiguieren ein wenig einfacher macht da schon einige fehlerquellen weg fallen.

vhost.conf sieht so aus:

Code: Select all

<Directory "/home/projects/_sites">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<VirtualHost 127.0.0.10:80>
   UseCanonicalName Off
   VirtualDocumentRoot /home/projects/_sites/%0/htdocs
   <Location /cgi-bin>
      Options ExecCGI
      SetHandler cgi-script
   </Location>

   CustomLog  /home/apache-log/access_log  "%{VHOST}e %h %l %u %t "%r" %>s %b"
   ErrorLog /home/apache-log/error_log
   RewriteLogLevel 9
   RewriteLog /home/apache-log/rewrite_log
</VirtualHost>


weil nun der document root unter php falsch ist kam ich durch ein wenig googlen auf diese seite:

http://www.tomp.co.uk/projects/linux/docroot.php

und dem tipp bin ich gleich mal gefolgt und habe das php script unter docroot.php abgelegt:

Code: Select all

<?php 
function setDocRoot()
{
   $_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['SCRIPT_FILENAME']);
}
setDocRoot();
?>


und folgende zeile in der vhost.conf im bereich des VirtualHost-blocks eingetragen:

Code: Select all

   php_admin_value auto_prepend_file /home/apache-conf/docroot.php


und schon habe ich das erwünschte ergebnis.

es ging mir hier nur um eine vernünftige entwicklungsumgebung - live sollte man das natürlich nicht machen! das möchte ich hier nochmal ausdrücklich gesagt haben.

danke für euere mithilfe!