Apache med Virtuelle hosts i MySQL
Vi elsker det næsten alle sammen. At have al vores konfiguration i en MySQL database. Og sannelig så, er vi kommet til Apache denne gang.
Det viser sig nemlig, at man også med apache kan få den til at hente hosts ud af en MySQL database. Følgende vejledning viser dig hvordan."
Jeg vil gerne takke http://www.casius.dk/ for denne fantastiske fil, der gør arbejdet.
Hvad har vi brug for?
Du skal have følgende Debian pakker installeret, dette er Woody pakker. Samt du skal have en fungerende Apache server kørende.
- libapache-mod-perl
Oprette databasen, og tabeller
Vi går ud fra, at du allerede kender til MySQL, og derfor behøver vi ikke forklare, hvordan du opretter databasen, og andet. (Husk at logge ind som root i MySQL)
Inden du kan starte med at oprette databasen og tabeller, skal oprette en bruger kaldet "apache" i mysql. Denne bruger skal ingen rettigheder have til andre databaser. Derefter genstarter du din mysql server.
Følgende kode er til oprettelse af hele Apache VHosts mysql system. Jeg skal her gøre opmærksom på, at der i bunden skal rettes lidt i koden, da kodeordet for "apache" brugeren skal indsættes i SQL syntaksen.
create database domains;
use domains;
DROP TABLE IF EXISTS `vhosts`;
CREATE TABLE `vhosts` (
`id` int(11) NOT NULL auto_increment,
`domain` varchar(255) NOT NULL default '',
`docroot` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `domain` (`domain`(200),`docroot`(200))
) TYPE=MyISAM AUTO_INCREMENT=0 ;
GRANT SELECT
ON domains.*
TO apache@localhost
IDENTIFIED BY 'kodeord';
Husk at ændre "kodeord" oven for, til dit eget kodeord, inden du eksekverer syntaksen..
Konfiguration af Apache
Konfigurationen af apache er simpelt, følgende kode indsættes nederest i apache's httpd.conf fil. Husk at rette koden til, med hensyn til kodeord til din bruger der skal logge på mysql databasen. Samt også at tjekke igennem, at den passer til dine behov.
<Perl>
use DBI;
# Declare and initialize variables
$host = 'localhost';
$db = 'domains';
$db_user = 'apache';
$db_password = '';
$server_admin = 'root@linux-support.dk';
# Connect to the requested server
$dbh = DBI->connect("dbi:mysql:$db:$host", "$db_user", "$db_password");
$sth = $dbh->prepare("SELECT domain, docroot FROM vhosts ORDER BY domain ASC");
$sth->execute();
while (($domain, $docroot) = $sth->fetchrow_array()) {
system("/bin/mkdir -p $docroot");
system("/bin/mkdir -p $docroot/logs/");
push @{$VirtualHost{'*'}}, {
ServerName => "$domain",
ServerAlias => "www.$domain $domain",
ServerAdmin => "$server_admin",
DocumentRoot => "$docroot",
ErrorLog => "$docroot/error.log",
CustomLog => ["$docroot/access.log", "combined"],
};
}
</Perl>
Jeg vil gøre opmærksom på, at systemet selv opretter mapperne til domæner/vhosts hvis disse ikke findes. Husk at læse koden igennem, så den passer til dit behov.
Når dette er gjort, er dit system klar til brug. Du tilføjer et domæne samt dokument mappens rod i mysql databasen og restarter mysql.
Et eksempel kunne være: domain = linux-support.dk, docroot = /www/linux-support.dk - læg her mærke til, at jeg IKKE afslutter med / til sidst, i docroot. Det er vigtigt, ikke at gøre dette.


Sidst opdateret: 21-09-2006