Virtuelle Server
Sogenannte Virtuelle Server ermöglichen bei Apache das gleichzeitige Anbieten von unterschiedlichen Webseiten auf der selben physikalischen Machine.
Sehr praktisch ist das beim Entwickeln, um die Projekte sauber zu trennen. Zudem ist es so auch noch näher an dem zu erwartenden produktiven Betrieb.
Konfiguration
Als ersten Schritt nehme ich die Adresse, unter der ich entwickeln will in die Hosts-Datei auf. Diese gibt es bei allen Betriebssystemen und dient dazu einen Namen in eine IP-Adresse zu übersetzen.
Die Datei ist normalerweise unter /etc/hosts bzw. C:\Windows\System\hosts
Diese wird im Editor geöffnet und eine neue Zeile eingetragen:
127.0.0.1 iswagner
Dann wird in der Konfigurationsdatei vom Apache ein neuer virtueller Server eingerichtet:
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /Users/akira/Work/projects/homepage/michael-wagner.de/site
ServerName iswagner
php_admin_value include_path /usr/lib/php
ErrorLog /var/log/iswagner.error_log
CustomLog /var/log/iswagner.access_log common
<Directory /Users/akira/Work/projects/homepage/michael-wagner.de/site>
Options +Indexes +FollowSymLinks
</Directory>
</VirtualHost>
Fehlerquellen
Ab dann sollte die Adresse "iswagner" über den Browser abrufbar sein. Immer wieder kommt es vor, dass irgendwo im Pfad noch Rechte fehlen. Es erscheint dann die Meldung:
[Fri May 26 09:25:53 2006] [error] [client 127.0.0.1] (13)Permission denied: access to / failed because search permissions are missing on a component of the path
Hierfür habe ich mir ein kleines Programm geschrieben, dass die Rechte entlang des Pfades auflistet:
<?php
/**
* This little program checks the permissions of the directories towards /.
*
* @version 0.1 27 May 2006 MW initial creation
* @copyright 2006 - 2007 Michael Wagner (http://www.michael-wagner.de)
*/
$dir = $argv[1];
if(!is_dir($dir) || $argv[2] == '' || $argv[3] == '' ){
die('checkperm.php <directory> <user> <group>' . "\n");
}
$wantedUserId = $argv[2];
$wantedGroupId = $argv[3];
if(chdir($dir)){
$dir = getcwd();
} else {
die('cant chdir' . "\n");
}
while($dir && $dir != '/'){
$handle = dir($dir);
clearstatcache();
while ($filename = $handle->read()){
if($filename == '.'){
$permString = getPermString($filename);
$userId = fileowner($filename);
$userString = exec('grep ' . $userId . ' /etc/passwd');
if($userString){
$userString = explode(':', $userString);
$userId = $userString[0];
}
$groupId = filegroup($filename);
$groupString = exec('grep ' . $groupId . ' /etc/passwd');
if($groupString){
$groupString = explode(':', $groupString);
$groupId = $groupString[0];
}
$userPerms = substr($permString, 1, 3);
$groupPerms = substr($permString, 4, 3);
$userId .= '(' . $userPerms . ')';
$groupId .= '(' . $groupPerms . ')';
echo sprintf('%s %-60s %10s %10s', $permString, $dir, $userId, $groupId);
echo "\n";
}
}
if(chdir('..')){
$dir = getcwd();
} else {
die('cannot getcwd ' . $dir);
}
}
/**
* Returns the permissions for the given path as string like on the linux shell.
* Sockets, symbolic links, directories, etc. are recognized.
*
* @param String $path The path.
* @return unknown
*/
function getPermString($path){
$perms = fileperms($path);
if (($perms & 0xC000) == 0xC000) {
// Socket
$info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
// Symbolic Link
$info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
// Regular
$info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
// Block special
$info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
// Directory
$info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
// Character special
$info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
// FIFO pipe
$info = 'p';
} else {
// Unknown
$info = 'u';
}
// Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
// Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
// World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
return $info;
}
?>
