Page 1 of 1
Suche Script
Posted: 2003-07-15 15:55
by zero
Hallo Leute,
bin in bash Sprache oder auch CGI nicht so fit. Ich brauche ein Script was mir aus einer MYSQL Tabelle Werte ziehen kann. (3Spalten) anhand dieser Werte soll dann eine eigene Apache.conf erstellt werden die von der httpd.conf (festeingebaut) included wird. Kann mir da jemand helfen ?
In Der Tabelle befindet sich ID, Domain und eine IP Adresse, daraus soll in der eigenen conf Datei jeweils pro Zeile aus der Tabelle ein V-Host nach diesem prinzip ertselt werden.
Code: Select all
<VirtualHost SERVERIP:80>
ServerName DomainAusDB
Redirect / http://IPAusDB
</VirtualHost>
Kann mir da jemand von den CGI oder PERL Freaks helfen ;-)
Gruß zero
Re: Suche Script
Posted: 2003-07-15 19:32
by squize
Hier das ganze mal als PHP:
Code: Select all
#!/path/to/php
<?
$fp = fopen("/path/to/Apache.conf","w");
$db = mysql_connect("db", "name","passwort");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT domain,serverip FROM table_name",$db);
while ($myrow = mysql_fetch_array($result)) {
fputs($fp, "<VirtualHost IP:80>n ServerName ".$myrow["domain"]."n Redirect / http://".$myrow["serverip"]."n </VirtualHost> n");
}
fclose($fp);
?>
Es fehlt natürlich aller Code zum Fehlerabfangen (Ist die Datei vorhanden und schreibar ....) usw. und ich habe es jetzt nicht getestet, sollte aber so funktionieren.
Gruss
Marc
Re: Suche Script
Posted: 2003-07-15 20:32
by alexander newald
Für Apache2 und mod_perl:
in die httpd.conf
Code: Select all
LoadModule perl_module modules/mod_perl.so
PerlModule Apache2
<Perl >
use DBI;
my $mysql_user = "dbuser";
my $mysql_pwd = "password";
my $mysql_host = "127.0.0.1";
my $mysql_port = "3306";
my $mysql_db = "db";
my $db = "DBI:mysql:database=$mysql_db:host=$mysql_host:port=mysql_port";
my $dbh = DBI->connect( $db, $mysql_user, $mysql_pwd );
my $sth = $dbh->prepare( "SELECT domain, ip FROM vhosts" );
$sth->execute;
$sth->bind_columns( my ( $domain, $ip ) );
while ( $sth->fetch ) {
push @{$VirtualHost{'*'}}, {
ServerName => $domain,
DocumentRoot => /tmp,
Redirect => "/ http://$ip"
};
}
$sth->finish;
$dbh->disconnect;
</Perl>
<Perl > muss als <Perl > und
nicht als <Perl> geschrieben sein.
Bei jedem Neustart des Apache (Auch Gracefull) werden die Vhosts automatisch von Apache selbstständig aus der DB geholt und erstellt. Es reicht also einen neuen Vhost in die DB einzutragen und apachectl -k gracefull aufzurufen

Re: Suche Script
Posted: 2003-07-16 07:57
by zero
Ich glaube das ja nicht, da sist ja klasse...
Einfach so mal schnell das Script getippt ohne knorren ;-)
Vielen Vielen Dank, man findet selten soviel Hilfe wie hier. Meist wäre wohl jetzt die Antwort gekommen das ich mich erstamal damit beschäftigen soll, was ja auch richtig ist. Jedoch habe ich das nur leider reicht es für solche Sachen nocht nicht aus. Nun habe ich ein perfektes Beispiel wie man es lösen kann. Werde es gleich testen. Vielen Dank an beide Programmierer . Vielen Dank
Gruß Zero
Re: Suche Script
Posted: 2003-07-16 09:08
by zero
So habe nun beide Scripte probiert beide klappen nach kurzer anpassung auf den Server ohne Porbleme.
Jetzt habe ich noch eine Frage ich möchte nun per CRON alle 15 Minuten das Script (PHP) aufrufen lassen. Das ist ja kein Problem ich mache das in einer Batch so kann ich danach ein apache reload oder ein apachectl graceful absetzten. Ist das ein Problem wenn ich alle 15 minuten ein Reload oder graceful mache ... wenn ja wie kann ich es sonst machen bzw. welchen Befehl nehme ich von beiden am besten.
Vielen Dank.
Re: Suche Script
Posted: 2003-07-16 12:25
by squize
Hallo Zero,
deinen Webserver alle 15 Minuten neu starten ist eine Sache, die ich eher bleiben lassen würde.
Dir geht es doch darum, dass du Ã?nderungen bei den virtuellen Domänen gleich ändern willst, oder?
Dann musst du deinen Server auch nur neu Starten, wenn sich da was getan hat, also wenn sich eine Domain geändert hat oder eine neue hinzugekommen ist.
Dann musst du deinen Cronjob so bauen, dass er erst überprüft, ob sich etwas geändert hat und nur neu startet, wenn dies Zutrifft.
Erst einmal die Sache mit Datei neu erzeugen:
Code: Select all
if(rename("/path/to/Apache.conf","/path/to/Apache.conf".date("Ymdhi")))
echo "Datei wurde umbenannt";
else
echo "Datei konnte nicht umbenannt werden";
So hast du immer ein Backup der gerade aktuellen Datei. Jetzt natürlich noch die Frage, wie du abcheckst, ob sich etwas geändert hat :)
Da gibt es mehrere Möglichkeiten, du liest das alte File ein und vergleicht es mit dem Neuen, du setzt beim Ã?ndern Flags in die Datenbank usw.
Ich würde an deiner Stelle einfach mal selfphp downloaden und anfangen mit rumzuspielen, ist bei weitem nicht so schwer, wie du es dir vorstellst.
Gruss
Marc
Re: Suche Script
Posted: 2003-07-16 14:02
by zero
Hallo Marc,
danke für deine schnelle Antwort.
Nun ja das hast du recht mit der neuen File das hatte ich schon gelöst so neu bin ich da auch nicht ;-)
Das mit dem Prüfen überlege ich mir noch wie ich es am sinnvollsten mache ... werde mich dann noch mal melden.
Soweit vielen Dank an alle.
Re: Suche Script
Posted: 2003-07-16 14:05
by zero
Würde nicht ein reload reichen.. wie genau verhält sich das ? Es werden doch nur di conf Files neu eingelesen oder ?
Gruß Zero
Re: Suche Script
Posted: 2003-07-16 14:11
by squize
Ein Reload sollte ausreichen, macht aber am Ende für den Surfer, dem du dann ständig der Apache unterm Arsch wgeziehst keinen Unterschied.
Beim Reload bekommt der Apache soweit ich weiss ein SIGHUP Signal geschickt, dass ihn anweisst die Conf neu zu laden.
Marc
Re: Suche Script
Posted: 2003-07-16 14:16
by alexander newald
Ã?hhh, das macht schon einen Unterschied!
Bei einem apachectl -k graceful werden nur die Prozesse direkt beendet, die keine Anfrage bedienen, alle anderen werden erst dann beendet wenn die Anfrage fertig ist. Desweiteren werden gleichzeitig soviele Prozesse neu gestartet, dass immer die Mindestanzahl (aus httpd.conf) an Prozessen vorhanden ist.
Ein graceful Neustarten ist also jederzeit Möglich
Re: Suche Script
Posted: 2003-07-16 14:29
by squize
Super,
auch wieder was dazugelernt. So ähnlich hatte ich es zwar verstanden, wenn man mein obiges Posting dazu liest, muss ich aber sagen, das ich mein Halbwissen auch noch suboptimal dargestellt habe :oops: :oops:
Gruss
Marc
Re: Suche Script
Posted: 2003-07-16 14:31
by zero
Also könnte ich ein graceful sagen wir alle 15 minuten ohne Probleme absetzten ?
Re: Suche Script
Posted: 2003-07-16 14:42
by alexander newald
Ja kann man. Aber warum, wenn man nur alle 2 Tage das Configfile ändert?? Aber ich will mal nicht so sein:
irgendwie /tmp/httpd.conf.new erstellen
apache_neustarten:
Code: Select all
if test -e /tmp/httpd.conf.new ; then
if ! `diff /tmp/httpd.conf.new /etc/httpd.conf 1>/dev/null `; then
cp /tmp/httpd.conf.new /etc/httpd.conf
apachectl gracefull
# bei apache 2 apachectl -k graceful
rm /tmp/httpd.conf.new
fi
fi
Apache wird nur neugestartet, wenn sich die httpd.conf verändert hat
Re: Suche Script
Posted: 2003-07-16 15:00
by zero
Habe es angepasst und es klappt kalsse vielen Dank. Nun ja sobald sich die File also ändern wird der Server bzw. die files neu eingelesen.
Vielen Dank.
Gruß Zero
Re: Suche Script
Posted: 2003-07-18 11:11
by florian b
Weiß nicht, ob das jemanden interessiert, aber ich hab n gutes modul gefunden für den indianer.
mod_vshap
http://www.pookey.co.uk/sas-apache.php
Ich finde es super!