PDA

Bekijk Volledige Versie : Apache2 Virtualhosts makelijk aan maken



SebastiaanStok
30/11/05, 16:55
Ik vraag me af of apache2 nu een ondersteuning heeft om makelijk virhostst aan te maken?

Ik nu deze gevonden, maar dit is alleen apache1 en is heeel buggy tevens bied het geen ene ondersteuning voor bijvoorbeeld mod_suphp :(
http://pguserdir.wampir.org/

Ik kan best de virhosting bestanden bewerken via een automatich script :) Alleen... Dan moet apache weer helemaal opnieuw worden gestart, dit kan ik dan doen door om de 5 Minuten een cronjob laten controleren of er nog records in de database zijn gewijzigt en zo ja de bestanden overschijven en apache herstarten, alleen is wat om slagtig.


Weet iemand of er een manier om makelijk de Apache virhosts te wijzigen of dat ik bij voorbeeld apache kan dwingen de instellingen opnieuw telezen zonder een voledige reload? :)

Wido
30/11/05, 16:59
graceful :)

RvdH
30/11/05, 17:09
Als je *echt* moeilijk wil doen gebruik je mod_perl en laat je de config dynamisch lezen uit een databeestje :)

SebastiaanStok
30/11/05, 17:32
Sorry maar maar perl kennis is dus 0,9% :)

Hoe bedoel je dit als ik vragen mag?

maxnet
30/11/05, 19:16
Je kan mod_vhost_alias gebruiken.
In de meest simpele configuratie:



NameVirtualHost *:80

<VirtualHost *:80>
UseCanonicalName Off
VirtualDocumentRoot /websites/%0
</VirtualHost>


En vervolgens de bestanden zetten in:

/websites/www.domein1.nl/
/websites/www.domein2.nl/
..etc..

Of symlinken:

/websites/www.domein1.nl -> /home/gebruiker1/public_html


Het probleem met mod_vhost_alias is echter de beveiliging. Het is niet te gebruiken in combinatie met modulen als suexec.

SebastiaanStok
30/11/05, 20:16
@RickJansen: Wat bedoel jij met perl?

Dat het virhost bestand eigenlijk als een proces doet??

mpk
01/12/05, 00:09
Dit is wellicht ook een optie,



mod_vhost_dbi creates virtual hosts for Apache 2.0 completely dynamically, without the need to edit your configuration file or restart Apache if you change a Vhost.


http://www.outoforder.cc/projects/apache/mod_vhost_dbi/

Kan er verder niets over zeggen want ik heb er nooit mee gewerkt.

Als dat het niet is kan je altijd nog de oplossing van RickJansen volgen.

http://perl.apache.org/

Beetje kennis van apache internals/configuratie en perl programmeren is hiervoor uiteraard wel vereist.

SebastiaanStok
01/12/05, 11:22
Die mod_vhost_dbi heb ik gistern ook gevonden, maar dit heeft weer is geen onderstuing voor mod_suphp :)

Ik heb iets gevonden dat is gemaak voor de mod_perl zoals RickJansen, moet ik alleen nog een beetje verder ontwikkelen ;) Dus dat word perl kennis aanscherpen...

Ps: Waar ik het heb gevonden is hier: (Moet ik straks even opzoeken...)

SebastiaanStok
01/12/05, 13:39
Oke ik heb die ene website gevonden :)

http://babelfish.altavista.com/babelfish/trurl_pagecontent?lp=it_en&url=http%3A%2F%2Fwww.risorse.net%2Fapache%2Fconfig urazione_virtualhost.asp

SebastiaanStok
01/12/05, 17:03
Oke heeft iemand hier mischien veranstand van perl ??

Ik krijg ik dit script met geen moggelijkhijt aan de praat :mad:

Dit staat helemaal aan het einde van httpd.conf


<Perl>
# Definition of some variable ones
local (#, $host, $admin, $vroot, $aliases);
local (#, $args);
# Opening and parsing of the configuration rows
open (ROWS, "/usr/local/apache/conf/vhost-perl.conf");
while (ROWS) {
# Skippa all the lines that they begin with #
next if /^\s*(#|$) /;
if (/^d+/) {
(#, $host, $admin, $vroot, $aliases)=split /\s*, \s * /, $ _;
#} = {
ServerName => #,
ServerAdmin => #,
DocumentRoot => "/home/www/".$vroot,
ErrorLog => "logs/".$host."_error.log",
TransferLog => "logs/".$host."_access.log"
};
# Alias Management
$VirtualHost {#} {ServerAlias} = # if #;
# Management of the directive port
$VirtualHost {#} {Port} = $1 if (# /);
# Adding of eventual directives, specified in the configuration rows /usr/local/apache/conf/vhost-perl.conf
} elsif (#) {
(#, $args)=split//, $_, 2;
$VirtualHost {#} {#;
}
}
# Closing of the rows and the script
close (rows);
_ END _
</Perl>


Met deze fouten:

[root@localhost conf]# service httpd configtest
Syntax error on line 1045 of /data/apache2/conf/httpd.conf:
syntax error at /data/apache2/conf/httpd.conf line 1049, at EOF\nsyntax error at /data/apache2/conf/httpd.conf line 1061, at EOF\nsyntax error at /data/apache2/conf/httpd.conf line 1067, at EOF\n

mpk
02/12/05, 13:01
Dat hier syntax errors uit komen verbaast mij helemaal niets :)

Het "#" teken wordt in Perl gebruikt om een comment te maken, maar zo te zien wordt het in dit script hier en daar ook gebruikt als variable (wtf?). Comments eruit en "#" als 'variable' waar nodig omgezet ($var, $directive, $args, etc) aan de hand van een beetje googlen.

Dit is waarschijnlijk wat het ongeveer had moeten zijn,



<Perl>
local ($var, $host, $admin, $vroot, $aliases);
local ($directive, $args);
open (ROWS, "/usr/local/apache/conf/vhost-perl.conf");
while (ROWS) {
next if /^\s*($var|$) /;
if (/^d+/) {
($var, $host, $admin, $vroot, $aliases)=split /\s*,\s* /, $_;
$VirtualHost{$var} = {
ServerName => $host,
ServerAdmin => $admin,
DocumentRoot => "/home/www/".$vroot,
ErrorLog => "logs/".$host."_error.log",
TransferLog => "logs/".$host."_access.log"
};
$VirtualHost{$var}{'ServerAlias'} = $aliases if $aliases;
$VirtualHost{$var}{'Port'} = $1 if ($var =~/:(\d+)$/);
} elsif ($var) {
($directive, $args) = split / /, $_, 2;
$VirtualHost{$var}{$directive} = $args;
}
}
close (rows);
_END_
</Perl>



Ik heb het verder niet getest, maar goed. Dit zou in elk geval wel door een interpreter heen moeten kunnen.

De file /usr/local/apache/conf/vhost-perl.conf
staat vol met lijnen als,


213.198.151.253:80, openskills.info, webmaster@openskills.info,
/home/www/openskills


(Esempio de http://openskills.info/infobox.php?IDbox=508 ).

Perl file geattached (als txt file, want de pl extensie is niet goedgekeurd..) voor het geval copy/paste de boel weer verziekt..

SebastiaanStok
02/12/05, 13:06
Ik heb gistern een handlijding door gelezen over perl en snap nu de syntax :)


Ik tevens een handlijding gevonden die prefect werkt!!! :D

http://162.105.203.19/apache-doc/99.htm#BIN211

Ik ben nu bezig met een DBI::pg connectie hier voor teschrijven :p

Maar als nog bedankt ;)

SebastiaanStok
02/12/05, 15:28
Nu word ik geloof ik een beetje gek :mad:

Nu heb ik een script zonder fouten gaat apache toch lope te k***** dat er een fout in zit. Die fout hij aangeeft is op een lege lijn :eek:

Dus wat doe ik nu weer niet goed??



<Perl>
use Apache2::PerlSections();

use DBI;

my $DBname = 'rollerscapes_webservice_db';
my $DBhost = 'rollerscapes.net';
my $DBport = '5432';
my $DBusername = 'postgres';
my $DBpassword = '';

my $Virhosts_DB = DBI->connect("dbi:Pg:dbname=$DBname;host=$DBhost;port=$DBport", $DBusername, $DBpassword);

if (!$Virhosts_DB) { die "ERR: Couldn't open connection: ".$Virhosts_DB::errstr."\n"; }

# Get the virtualhosts from database, we current use postgres this needs to be a non write user for security.
$sQuery = "SELECT (host_name||'.'||(SELECT account_domain FROM virhosting_customers WHERE account_id = virhosting_httpd_virhosts.account_id))::text AS host_name, host_location, (SELECT sys_uid FROM virhosting_customers WHERE account_id = virhosting_httpd_virhosts.account_id)::integer, host_directives FROM virhosting_httpd_virhosts WHERE host_status=true AND host_type='sub'";

# Was ther an error?
$sth = $Virhosts_DB->prepare($sQuery) or die "prepare error: ($sQuery) $sth::errstr";

$VirtualHost_Result = $sth->execute or die "prepare error: ($sQuery) $sth::errstr";

# One stuppid while, OMG this is harden then it is whit php, (PHP Rulles!!!!).
while (@aEntry = $VirtualHost_Result->fetchrow_hashref)
{
$VirtualHost{'*:80'} = {
ServerName => $aEntry['host_name'],
DocumentRoot => $aEntry['host_location'],
};
}
$sth->finish;
$Virhosts_DB->disconnect;
print STDERR Apache2::PerlSections->dump();
__END__
</Perl>



Edit: /Typo :rolleyes:
Edit: Wel verdome :eek: plaats ik verdome gewoon het postgres wachtwoord zonder censuur :X

SebastiaanStok
02/12/05, 16:42
Ik ben nu weer verder gekomen :)

Inmidels werkt het script zonder fouten :D En laat zelf de virtualhosts :W:

Alleen, ik moet apache herstarten als ik een nieuwe heb toegevoegt :(

Weet iemand hoe je dat moet doen, onder tussen ga ik even googlen ;)

Oja dit is het scrpt:



<Perl>
use Apache2::PerlSections();
use DBI;

my $DBname = 'rollerscapes_webservice_db';
my $DBhost = 'rollerscapes.net';
my $DBport = '5432';
my $DBusername = 'postgres';
my $DBpassword = ''; // In stoot me dus niet twee keer aan de zelfde steen :rolleyes:

my $Virhosts_DB = DBI->connect("dbi:Pg:dbname=$DBname;host=$DBhost;port=$DBport", $DBusername, $DBpassword);

if (!$Virhosts_DB) { die "ERR: Couldn't open connection: ".$Virhosts_DB::errstr."\n"; }

# Get the virtualhosts from database, we current use postgres this needs to be a non write user for security.
my $sQuery = "SELECT (host_name||'.'||(SELECT account_domain FROM virhosting_customers WHERE account_id = virhosting_httpd_virhosts.account_id))::text AS host_name, host_location, (SELECT sys_uid FROM virhosting_customers WHERE account_id = virhosting_httpd_virhosts.account_id)::integer, host_directives FROM virhosting_httpd_virhosts WHERE host_status=true AND host_type='sub'";

#
my $sth = $Virhosts_DB->prepare($sQuery) or die "prepare error: ($sQuery) $sth::errstr";
my $VirtualHost_Result = $sth->execute or die "prepare error: ($sQuery) $sth::errstr";

## One stuppid while, OMG this is harder then it is whit php, (PHP Rulles!!!!).
#while (my %aEntry = $VirtualHost_Result->fetchrow_hashref)
#{
# $VirtualHost{'*:80'} = {
# ServerName => $aEntry{'host_name'},
# DocumentRoot => $aEntry{'host_location'},
# };
#}

my $numres = $sth->rows;
for (my $i=1; $i<=$numres; $i++)
{
my $row = $sth->fetchrow_hashref;

$VirtualHost{'*:80'} = {
ServerName => $row->{'host_name'},
DocumentRoot => $row->{'host_location'},
};
}

# The End, I love a happy ending.
print STDERR Apache2::PerlSections->dump();
__END__
</Perl>

mpk
03/12/05, 00:08
Ok, ik ga er nu even een end op los speculeren, dus.. neem het met een korreltje zout ..

De mod_perl script die je hier hebt schrijft eigenlijk een stuk apache configuratie. Net als een gewone conf file.

Die configuratie wordt vervolgens geparsed en apache bouwt zijn virtualhost config memory structuur op.

Jouw code wordt dus bij het opstarten gedraaid en daarna niet meer. Vrij essentieel punt dit.

Wat jij wil is dat dat virtualhost config dynamisch uit de DB wordt gehaald.

Twee mogelijkheden, lijkt me.

1. Bij elke HTTP request met een Host: header een query doen om a) te kijken of deze host hier bestaat en zo ja b) de config te SELECT-en en aan de hand hiervan een file serven, interpreter/handler aanroepen, etc.

2. Uitzoeken wat apache doet als de opgevraagde vhost niet bestaat (default site uitspugen) en deze actie overriden met een functie die een query richting DB maakt om te kijken of de host hier bestaat en zo ja deze binnenhaalt en toevoegt aan de vhost struct binnen apache's memory.

Je voorziet hier wellicht al een paar problemen. Als mod_perl al diep genoeg gaat voor methode 1 dan zit je meteen opgescheept met een enorme performance killer. Bij elke request een DB query uitvoeren? Nee dus, dat wordt een cache in-process-memory bouwen en die eerst testen voor je de DB query uitvoert.

Methode 2 zou eigenlijk wel te doen moeten zijn, als de apache developers (en de mod_perl apache API implementers) daar rekening mee gehouden hebben. Hiervoor moet je dus de virtual-host-not-found functie kunnen aanpassen en een (hopelijk al geimplementeerde) voeg-vhost-toe-aan-active-vhost-list kunnen aanroepen.

Nogmaals, allemaal speculatie. Misschien is zo'n constructie allang geimplementeerd en hoef je alleen maar twee regels perl ergens toe te voegen. Maar goed, dit is waar ik zou beginnen. (API docs voor Apache, APR, mod_perl, dus).

SebastiaanStok
03/12/05, 10:59
Een perfermonce killer zou inderdaat een probleem zijn, het werkt nu en eigenlijk hoef ik alleen maar service httpd reload uitevoeren en dan is hij ververst :)

En dan laaste kan ik gewoon doen een cron-job/tab, en zo wie zo word elke reuest al gelogt ;) DE acces_log word direct wegscheven naar de potgresql data, (Reken maar uit hoeveel records dit wel niet zijn :D )

Triloxigen
03/12/05, 11:05
Origineel geplaatst door RickJansen
Als je *echt* moeilijk wil doen gebruik je mod_perl en laat je de config dynamisch lezen uit een databeestje :)

Dat wil je niet voor een productieserver :)

SebastiaanStok
03/12/05, 11:12
Dit script wat ik nu gebruik is eigenlijk het meeste perfecte :)

Hij haalt gewoon de virhosts uit de database en en die gebruikt hij dan, alleen als ze zijn gewijzigt dan herlaat ik apache anders doet hij niets met de database.


Als dit op tenduur echt te gek gaat worden kan ik altijd nog terug switchen.


Edit: Maar ik heb dit getest op echt heel langzaam out beesje en daar werkte het gewoon goed :)