Virtual Hosts mehrere Domains

Guten Abend zusammen,

und zwar habe ich einen Root-Server, der bis vor ein paar Tage mit einer Domain ausgestattet war (www.abc.de), über virtual Hosts in apache habe ich subdomains angelegt und in verschiedene Verzeichnisse geroutet.

Für diese Domain habe ich ein Wildcard-SSL Zertifikat & leite die einkommenden anfragen ohne ssl ebenfalls via Virtualhost auf SSL um,...

Jetzt habe ich eine zweite Domain (www.xzy.de) dazugeholt, die mit der ersten ausser der IP nichts gemeinsam hat (kein SSL, anderer DocumentRoot). wenn ich diese Domain aufrufe, lande ich dort wo ich hinmöchte.

Mein problem ist allerdings das wenn ich eine Subdomain aufrufen möchte die nicht exisitert z.B. "test.abc.de" dann lande ich im DocumentRoot von "www.xyz.de" (da will ich ja aber nicht hin, sondern möchte einen Fehler ausgegeben bekommen)

Wenn ich eine Subdomain von xyz.de eingebe, welche nicht existiert - lande ich wieder im DocumentRoot von "www.xyz.de"...

Kann mir jemand sagen, was da nicht stimmt, oder was ich vergessen habe?

Grüße
Selig
 
Wenn dein Webserver ein Apache ist, ist die Lösung ganz einfach. Wird ein Apache mit einer unbekannten Domain angesprochen, leitet er die Anfrage automatisch in das erste VHost um, das in seiner Liste steht.

Du verteilst also deine VHosts am Besten auf mehrere Dateien und benennst diese mit 00_default.com, 01_domain1.com, 02_subdomain1.domain1.com... usw.. Dann inkludierst du den gesamten Ordner, in dem sich die VHost-Dateien befinden. Apache wird automatisch das VHost aus der Datei 00_default.com zuerst laden, da es die erste Datei im Ordner-Listing ist. Das VHost aus dieser Datei lässt du auf ein DocumentRoot zeigen, in dem sich lediglich eine index.html mit dem Hinweis auf die unbekannte Domain befindet.

Auf diese Weise bekommst du immer diese Seite angezeigt, wenn die Domain unbekannt ist. Das ist also quasi dein Catch-All-VHost.
 
Ja ich habe einen Apache,

den ganzen ordner inkludieren?

Du meinst ich solle in /etc/apache2/sites-available einen unterordner erstellen für abc.de
und darin die ganzen Vhosts die diese Domain betreffen, anlegen?

das selbe dann für xyz.de ?

Oder steh ich mir gerade auf der Leitung?

Greetz
 
Wenn du eh mit sites-available- und sites-enabled arbeitest (also vermutlich ein Debian nutzt ;)), musst du nur die Dateien entsprechend umbenennen und dir das 00-default-Vhost entsprechend umkonfigurieren. Der sites-enabled-Ordner wird eh als Ganzes in die Config inkludiert.
 
Fast ganz richtig :D Es ist ein Ubuntu :)

Also das klappt soweit! Viiiielen Vielen Dank! Wenn du mal in der Nähe bist, bekommste ein paar Bier spendiert :D (Von mir aus auch Sprudel wenn Bier nicht legitim ist :D )


Jetzt habe ich aber noch eine Frage,...
Das sind ja prinzipiell 2 verschiedene Seiten, via FTP (ich nutze Proftpd mit MySQL backend) kann ich einen FTP-User ja im entsprechenden DocumentRoot festhalten!
Wie kann ich aber dafür sorgen, dass die PHP-Dateien im entsprechenden Verzeichnis nicht auf eine andere Domain zugreifen können? Beide Domains haben werden ja trotzdem noch von meinem www-data ausgeführt?!

Quasi wie eine Webhosting umgebung - voneinander abgeschottet...

Lg
Selig
 
Das kannst du über die PHP-Settings lösen. Einfach jedem VHost eine eigene php.ini zuweisen (siehe PHPINIDir) und dort open_basedir u.ä. entsprechend konfigurieren.
 
So die informationen habe ich mir jetzt angelesen, umsetzen werde ich sie morgen wenn alles klappt,...

Jetzt tut sich mir nochwas "merkwürdiges" auf und zwar greife ich via
Putty auf meinen Server zu - soweit ja nicht schlimm,...
allerdings habe ich seit vorher das Problem das wenn ich z.B apt-get update, top, oder nano (große datei) mache, mir die ausgabe so gaaaanz langsam einfriert. Öffne ich eine neue Session läuft erstmal wieder alles geschmeidig, bis ich eben iwas öffne,... dann stockt putty wieder.

Habe jetzt testweise mal den bitvise ssh genommen - und hier geht alles wie gehabt,...

hab putty dann folgendermaßen gestartet: "start /w putty -cleanup"
^^ Alles was Putty angelegt hat, wird gelöscht,...
wieder getestet - fehlanzeige, geht immernoch nicht wieder -.-

Hat das schonmal jemand gehabt? Am Server kanns ja eigentlich nicht liegen vermute ich mal!
 
Ich denke für Putty-Probleme solltest du einen extra Thread aufmachen. Wenn es mit anderen SSH-Clients geht, dürfte das Problem jedenfalls nicht beim Server liegen.

Im Übrigen... wenn du jedes VHost mit einem eigenen Benutzer laufen lassen willst, wäre FastCGI eine Option. Dadurch kannst du den Usern auch ihre Logs via FTP zur Verfügung stellen. Ausserdem erledigt sich damit das Problem, dass sie von Webapps generierte Dateien nicht verändern können.
 
Erledigt,...

So also wenn ich das richtig verstanden habe, brauche ich die php.ini's documentroot nicht mehr?!

Werden die Sessions dann weiterhin zentral gemanaged - so das ich das in der VHost-Datei noch anpassen sollte, oder erledigt sich das mit FastCGI ?

Die nächste Frage ist, kann ich einfach einen Virtuellen Nutzer für FastCGI angeben oder muss es ein auf dem System vorhandener sein? (Das wäre wieder doof)

Für die Nachwelt hänge ich hier mal zwei Links an, auf welchen ich mich ein wenig informiert habe:

Fast-CGI – was steckt dahinter? » Beitrag » PHP Performance

Apache Server mit PHP fcgid (ehemals FastCGI) und Debian (Lenny, Squeeze oder Wheezy) | Website von Christoph Fischer

So aber nun Gute Nacht ;)
 
So also wenn ich das richtig verstanden habe, brauche ich die php.ini's documentroot nicht mehr?!
Du siehst mich mit einem grossen Fragezeichen im Gesicht. ;) Was genau meinst du?

Werden die Sessions dann weiterhin zentral gemanaged - so das ich das in der VHost-Datei noch anpassen sollte, oder erledigt sich das mit FastCGI ?
Das kommt auf die Sessions an. Wenn du PHP-Sessions meinst... die kannst du über session.save_path dort hinlegen, wo du es für richtig hälst.

Die nächste Frage ist, kann ich einfach einen Virtuellen Nutzer für FastCGI angeben oder muss es ein auf dem System vorhandener sein? (Das wäre wieder doof)
Da der Skript-Interpreter mit den Rechten dieses Users läuft, muss natürlich auch das System den User kennen. Ich sehe darin aber auch kein Problem. Zum einen kannst du diesen User im FTP-Server weiterverwenden. Zum anderen reicht ein System-Benutzer (d.h. ohne Shell) vollkommen aus. Der Vorteil ist halt, dass die PHP-Laufzeitumgebungen der einzelnen VHosts dadurch eine richtige Trennung haben und nicht nur eine virtuelle im Webserver. Bei FastCGI wird für jedes VHost ein eigener PHP-Interpreter mit den Rechten des VHost-Users aufgerufen. Und damit das möglich ist, muss das System diese User natürlich auch kennen.
 
Das kannst du über die PHP-Settings lösen. Einfach jedem VHost eine eigene php.ini zuweisen (siehe PHPINIDir) und dort open_basedir u.ä. entsprechend konfigurieren.


Das meinte ich :D - Mein Gehirn hat wohl gestern schon etwas früher Feierabend gemacht ;)

Jetzt noch eine letzte abschließende Frage (hoffe ich jedenfalls :p ):
Und zwar heißt es auf einer von mir gefunden Seite zum Thema FastCGI folgendes:
Toll ist auch, dass unter den Prozessen die Datenbank-Verbindung gecached wird. Das bedeutet, dass nicht ständig eine neue Verbindung zur Datenbank erstellt und wieder geschlossen werden muss. Dieses Feature ähnelt einer persistenten Datenbankverbindung, die über mysql_pconnect() erzeugt werden kann.

Inwiefern beeinflusst das ganze mein PHP welches ich gewohnt bin? Ändert sicht überhaupt was, was man als Nutzer bemerken würde?

Danke für deine ausführlichen und informativen Antworten!
 
Der Nutzer bemerkt nur, dass er plötzlich keine Dateien mehr in seinem DocRoot findet, die www-data gehören. Und natürlich kann er mittels phpinfo() auch sehen, dass er eine komplett eigene PHP-Konfiguration nutzt, in der sich ggf. einige Werte vom Systemstandard unterscheiden. Für dich als Serverbetreiber ändert sich, dass du in Zukunft immer PHP-Instanzen in deiner Prozessliste findest, die den jeweiligen VHost-Usern gehören. Das kostet geringfügig Performance.Lässt sich aber abfangen indem man APC für PHP aktiviert.

Beispiel-Setup von einem meiner Server: Jedes VHost hat einen Ordner in /var/www. Dort befindet sich jeweils die Unterordner conf, htdocs, logs, sessions und tmp. In conf liegen der fcgi-Wrapper und die php.ini für das VHost. Der Wrapper sieht so aus:

Code:
#!/bin/sh
export PHPRC="/var/www/<vhostname>/conf/"
exec /usr/bin/php5-cgi

In der php.ini werden dann je nach Bedarf einige der globalen PHP-Werte überschrieben.

Code:
open_basedir = /var/www/<vhostname>/htdocs/public:/var/www/<vhostname>/tmp/
upload_tmp_dir = /var/www/<vhostname>/tmp
soap.wsdl_cache_dir = /var/www/<vhostname>/tmp
session.save_path = /var/www/<vhostname>/sessions

Beide Dateien bekommen ein Immutable-Bit verpasst. Das DocumentRoot ist für die VHosts auf /var/www/<vhostname>/htdocs/public gesetzt. Dadurch hat der User in htdocs die Möglichkeit temporäre Kopien usw. abzulegen, falls mal Migrationen der Webapps notwendig sind.

Für das VHost wird dann natürlich eine entsprechende Konfiguration benötigt:

Code:
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld
    ServerAdmin admin@email.tld
    DocumentRoot /var/www/<vhostname>/htdocs/public
    SuexecUserGroup <vhostuser> <vhostgruppe>

    <Directory /var/www/<vhostname>/htdocs/public>
        FCGIWrapper /var/www/<vhostname>/conf/fcgid .php
        <FilesMatch \.php$>
        	    SetHandler fcgid-script
        </FilesMatch>
        Options +ExecCGI -Indexes
        Order allow,deny
        allow from all
        AllowOverride All
    </Directory>

    LogLevel warn
    ErrorLog /var/www/<vhostname>/logs/error_log
    CustomLog "| /usr/sbin/rotatelogs /var/www/<vhostname>/logs/access_log.%Y.%m.%d 86400" combined
</VirtualHost>

Da damit auch jeder User ein eigenes tmp-Verzeichnis für PHP hat, sollte man sicherstellen, dass diese mit noexec gemountet sind. Das geht aber auch relativ einfach, indem man einfach ein Image verwendet, das man in die jeweiligen Ordner einhängt. Siehe dazu Rootserver mit noexec Temp-Verzeichnis ausstatten Mit diesem Setup kann man dann dem User FTP-Zugriff auf sein gesamtes VHost-Verzeichnis geben, so dass er auch selbst Logs einsehen und Sessions bei Bedarf manuell entfernen kann.
 
Und pro Tempverzeichniss brauche ich eine eigenes Image?! Wie groß sollte das Tmp Vz eines VHosts denn mindestens sein? Ist 1GB eher großzügig gehalten?
 
Ich nutze ein Image für alle. Der Aufwand ist damit aber etwas höher. Das Image muss in einen "neutralen" Ordner gemountet werden und jedes VHost hat dann darauf sein eigenes Temp-Verzeichnis, das dann entsprechend nach /var/www/<vhostname/tmp verlinkt ist. Vorteil: Man braucht keine globalen Rechte für diese Temp-Verzeichnisse. Sie können dem User gehören, unter dem das jeweilige VHost läuft.
 
Guten Abend,

jetzt hatte ich endlich Zeit das ganze umzusetzen, allerdings tut sich mir noch die ein oder andere Frage auf:

1. Du setzt den vHost auf
Code:
/var/www/<vhost>/htdocs/public
wie verhindere ich, dass der User den Ordner "public" löschen kann?!

2. Wie verändere ich generell, dass der User Ordner löschen kann? (Also die von mir angelegte Struktur - selbst angelegte Ordner soll er selbstverständlich löschen können) Oder ist es nicht ratsam "chown -R user:gruppe" auf den vHost anzuwenden?

Danke nochmals =)
 
Zuletzt bearbeitet:
Um das Löschen von Ordnern zu verhindern, gibt es leider nur einen Workaround, wenn du nicht mit ACLs oder RBAC arbeitest. Lege eine versteckte Datei in dem Ordner an und setze für diese das Immutable-Bit. Da der User die Datei nicht löschen kann, kann er auch den Ordner nicht löschen. Ein Immutable-Bit auf den Ordner selbst zu setzen geht leider nicht, weil man dann in dem Ordner keine Änderungen mehr vornehmen kann.
 
Hallo Leute,

ich hab das ganze gerade noch auf PHP7 umgestellt,

Hierzu gibt es 3 kleine Änderungen, wenn man an folgendem Leitfaden festhält:
Apache Server mit PHP fcgid (ehemals FastCGI) und Debian (Squeeze, Wheezy, Jessie) | Website von Christoph Fischer

Code:
[COLOR=#666666][/COLOR][COLOR=#c20cb9][B]apt-get install[/B][/COLOR] apache2-mpm-worker apache2-suexec php5-cgi libapache2-mod-fcgid

apache2-mpm-worker gibts bei Ubuntu 16.04 unter dem von mir installierten Apache2.4.18 nicht mehr - keine Panik, das Teil ist mittlerweile fester Bestandteil vom Apache2.
Wenn man das Paket php7.0 schon installiert hat muss hier nur noch das Paket php7.0-cgi installiert werden, ansonsten eben beide (php7.0 & php7.0-cgi)...

In der fcgid Konfigdatei, die bisher so aussah, muss auch noch was geändert werden:
Code:
[COLOR=#666666][I]#!/bin/sh[/I][/COLOR]  
[COLOR=#7a0874][B]export[/B][/COLOR] [COLOR=#007800]PHPRC[/COLOR]=[COLOR=#ff0000]"/etc/<vhost>/conf"[/COLOR]  
[COLOR=#7a0874][B]exec[/B][/COLOR] [COLOR=#000000][B]/[/B][/COLOR]usr[COLOR=#000000][B]/[/B][/COLOR]bin[COLOR=#000000][B]/[/B][/COLOR]php5-cgi

Hier muss der exec-Pfad angepasst werden, dieser sollte jetzt "/usr/bin/php-cgi7.0" sein,... alles andere bleibt beim alten & das Teil rennt :)
 
Zurück
Oben