Naszym celem jest zrobienie systemu, który zapewni nam
tworzenie vhost'ow (wirtualnych adresów) do Apache przy użyciu www. Wszystkie
dane na temat użytkownika są trzymane w bazie danych MySQL. Dodanie vhost'a
obejmuje dodanie wpisu do httpd.conf, utworzenie domeny w PowerDNS'ie oraz
ustawienie dostępu do strony przez ftp (PereFTPd). Wpis w cronie natomiast
zaczytuje nową konfigurację vhost'ów i powiadamia o tym Apache'a wysyłając do
niego HUP'a.
Co będziemy potrzebować ?
Do tego celu skorzystamy z następujących pakietów oprogramowania:
* mysql - baza danych
* apache - server www
* mod_php4 - obsluga php4 dla apache'a
* mod_sqlinclude - wczytywanie vhost'ow z bazy sql
* powerdns - server dns
* pure-ftpd - server ftp
Wszystkie te aplikacje znajdują się w portach, więc nie powinno być problemu
z
ich instalacja.
PowerDNS + MySQL
Na początku przygotowujemy współpracę mysql i powerdns. Stworzymy odpowiednią bazę oraz użytkownika.
mysql> use mysql
Database changed
---
Dodajemy użytkownika 'dns' i ustawiamy mu hasło 'dupa.8'
mysql> insert into user (Host, User,
Password) values("localhost","dns",PASSWORD("dupa.8"));
Query OK, 1 row affected (0.02 sec)
---
Tworzymy bazę o nazwie 'dns'
mysql> create database dns;
Query OK, 1 row affected (0.02 sec)
mysql> use dns
Database changed
---
Tworzymy tabele, która będzie zawierać informacje o naszych domenach. Z naszego punktu widzenia interesować nas będą 4 pola:
* id - identyfikator domeny
* name - nazwa naszej domeny
* master - adres IP server'a MASTER jeśli tak owy jest
* type - typ naszej domeny MASTER / SLAVE
mysql> create table domains (
-> id INT auto_increment,
-> name VARCHAR(255) NOT NULL,
-> master VARCHAR(20) DEFAULT NULL,
-> last_check INT DEFAULT NULL,
-> type VARCHAR(6) NOT NULL,
-> notified_serial INT DEFAULT NULL,
-> account VARCHAR(40) DEFAULT NULL,
-> primary key (id)
-> )type=InnoDB;
Query OK, 0 rows affected (0.04 sec)
---
Tworzymy tablicę rekordów, która będzie zawierać poddomeny. Tu jednak potrzebne będą nam wszystkie pola:
* id - identyfikator poddomeny
* domain_id - identyfikator domeny nadrzędnej
* name - nazwa domeny
* type - typ domeny
* contest - zawartość
* ttl - czas życia
* prio - priorytet dla poczty
* change_date - ostatnia zmiana
mysql> CREATE TABLE records (
-> id INT auto_increment,
-> domain_id INT DEFAULT NULL,
-> name VARCHAR(255) DEFAULT NULL,
-> type VARCHAR(6) DEFAULT NULL,
-> content VARCHAR(255) DEFAULT NULL,
-> ttl INT DEFAULT NULL,
-> prio INT DEFAULT NULL,
-> change_date INT DEFAULT NULL,
-> primary key(id)
-> )type=InnoDB;
Query OK, 0 rows affected (0.03 sec)
---
Tworzymy dodatkowe indeksy dla tabeli
mysql> CREATE INDEX rec_name_index
ON records(name);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> CREATE INDEX nametype_index
ON records(name,type);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> CREATE INDEX domain_id ON
records(domain_id);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
---
Tworzymy tabele dla supermasters. Nam to nie jest do niczego potrzebne, ale opis tego cuda jest pod adresem
:
http://doc.powerdns.com/slave.html#SUPERMASTER
mysql> create table supermasters (
-> ip VARCHAR(25) NOT NULL,
-> nameserver VARCHAR(255) NOT NULL,
-> account VARCHAR(40) DEFAULT NULL
-> );
Query OK, 0 rows affected (0.03 sec)
---
Ustawiamy odpowiednie prawa dostępu do bazy
mysql> GRANT SELECT ON supermasters
TO dns;
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT ALL ON domains TO dns;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL ON records TO dns;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
W tym momencie mamy już bazę przygotowana do współpracy z powerdns'em.
Teraz klepiemy konfig od powerdns'a /usr/local/etc/pdns.conf
# Uruchamianie jako daemon
daemon=yes
# Default'owa domena dla której jesteśmy authorative
default-soa-name=test.org
# Ustawiamy korzystanie z bazy do trzymania wpisów.
launch=gmysql
# Wyłączamy rekursje
lazy-recursion=yes
# Zapytania rekursywne ślemy do xxx.xxx.xxx.xxx
recursor=xxx.xxx.xxx.xxx
# Pracujemy jako master
master=yes
# Nazwa bazy
gmysql-dbname=dns
# IP server'a, ktory trzyma baze
gmysql-host=127.0.0.1
# Hasło do bazy
gmysql-password=dupa.8
# User do bazy
gmysql-user=dns
|
PowerDNS odpalamy poleceniem pdns_server. Warto też dodać go skrytów
startowych w /usr/local/etc/rc.d ale tak żeby był odpalany przed apache'em bo inaczej nam apache'a nie wczyta vhost'ow bez działającego dns'a.
Apache + mod_sqlinclude
Najpierw zajmiemy się skonfigurowaniem apache'a a potem stworzymy odpowiednia baze.Klepiemy więc httpd.conf.
# Odkomentowywujemy linijki:
LoadModule sqlinclude_module libexec/apache/mod_sqlinclude.so
AddModule mod_sqlinclude.c
# Dodajemy nastepujacy wpisy:
SQL_ServerName 127.0.0.1
SQL_SQLUser apache
SQL_SQLPassword dupa.8
SQL_SQLDB apache
SQL_Include "SELECT data FROM vhosts"
|
Wyjaśnienia wymaga jedynie ostatnia linijka , która zawiera zapytanie sql, którym mamy uzyskiwać wpisy.
Teraz stworzymy odpowiedniego user'a oraz base.
---
Dodajemy user'a 'apache' z hasłem 'dupa.8'
mysql> use mysql
Database changed
mysql> insert into user (Host, User,
Password) values("localhost","apache",PASSWORD("dupa.8"));
Query OK, 1 row affected (0.02 sec)
---
Tworzymy bazę 'apache'
mysql> create database apache;
Query OK, 1 row affected (0.01 sec)
mysql> use apache
Database changed
---
Tworzymy tabelę 'vhosts', która będzie zawierać nasze wpisy do vhost'ow.
mysql> CREATE TABLE vhosts (
-> data text,
-> name varchar(32) default 'Unnamed'
-> );
Query OK, 0 rows affected (0.03 sec)
---
Ustawiamy odpowiednie prawa dla bazy
mysql> GRANT SELECT ON apache.* TO apache;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
No i ten etap mamy również w tym momencie zakończony.
Pureftpd + sql
Na początek zrobimy plik konfiguracyjny a następnie stworzymy odpowiednią bazę.
Klepiemy wiec /usr/local/etc/pureftpd-mysql.conf:
# Myślę, że tych opcji już nie trzeba wyjaśniać.
MYSQLServer 127.0.0.1
MYSQLSocket /tmp/mysql.sock
MYSQLUser ftp
MYSQLPassword dupa.8
MYSQLDatabase ftp
# Hasla trzymamy jako zwykle pola tekstowe
MYSQLCrypt cleartext
# Zapytanie do uzyskiwania hasel z bazy
MYSQLGetPW SELECT Password FROM users WHERE User="L"
# UID i GID z jakim bedzie pracowal user po autoryzacji
MYSQLDefaultUID 80
MYSQLDefaultGID 80
# Zapytania do uzyskiwania katalogu domowego user'a.
MYSQLGetDir SELECT Dir FROM users WHERE User="L" |
Pureftpd odpalamy poleceniem:
# pure-ftpd -j -A -l mysql:/usr/local/etc/pureftpd-mysql.conf
-j - tworzenie katalogu domowego przy pierwszym logowaniu
-A - chroot'owanie do katalogu domowego
-l - rodzaj autoryzacji oraz plik konfiguracyjny
Tworzymy jeszcze katalog /howe/www gdzie będziemy trzymać strony user'ow.
Nadajemy mu odpowiedni GID, UID oraz prawa.
# chown www:www /home/www
# chmod 755 /home/www
Teraz tworzymy odpowiednia bazę.
---
Dodajemy user'a 'ftp' z hasłem 'dupa.8'
mysql> use mysql
Database changed
mysql> insert into user (Host, User,
Password) values("localhost","ftp",PASSWORD("dupa.8"));
Query OK, 1 row affected (0.02 sec)
---
Tworzymy bazę 'ftp'
mysql> create database ftp;
Query OK, 1 row affected (0.02 sec)
---
Tworzymy tabelę, która będzie zawierać informacje na temat user'ów.
mysql> use ftp
Database changed
mysql> CREATE TABLE users (
-> User varchar(16) NOT NULL default
'',
-> Password varchar(64) NOT NULL
default '',
-> Dir varchar(128) NOT NULL default
'',
-> PRIMARY KEY (User) );
---
Ustawiamy odpowiednie prawa
mysql> grant SELECT on users to ftp;
Query OK, 0 rows affected (0.03 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
Podsumowanie engine'u
W tej chwili mamy już skonfigurowane zaplecze sprzężone z bazą mysql.
Odpalamy więc:
# pdns_server
# apachectl start
# pure-ftpd -j -A -l mysql:/usr/local/etc/pureftpd-mysql.conf
Dodajemy jeszcze wpis do cron'a aby np. co 15 minut apache ponownie odczytywał informacje z bazy. Klepiemy więc:
# crontab -e
*/15 * * * * killall -HUP httpd |
Interfejs WWW
Teraz zabierzemy się za za zrobienie prostego interfejsu www, który umożliwi nam dodawanie vhost'ow. Tego etapu nie będę szczegółowo opisywał tylko umieszczę odpowiednie pliki. Potrzebne będą nam config.php, index.php oraz vhost.php.
config.php
-----------
<?php
$server = "127.0.0.1";
$home = "/home/www";
$uid = 80;
$gid = 80;
$dns_db = "dns";
$dns_db_user = "dns";
$dns_db_pass = "dupa.8";
$apache_db = "apache";
$apache_db_user = "apache";
$apache_db_pass = "dupa.8";
$ftp_db = "ftp";
$ftp_db_user = "ftp";
$ftp_db_pass = "dupa.8";
?> |
index.php
----------
<?php
include "config.php";
$link = mysql_connect($server, $dns_db_user, $dns_db_pass );
mysql_select_db( $dns_db ) or die(mysql_error());
$query = "SELECT name,id FROM domains WHERE type="MASTER"";
$result = mysql_query( $query );
print '<form action="vhost.php" method="POST"><BR>';
print 'Uzytkownik:'.' <input type="text" name="user"><BR>';
print 'Haslo:'.'<input type="text" name="passwd"><BR>';
print 'Vhost:'.' <input type="text" name="vhost"><BR>';
while ($row = mysql_fetch_row ($result))
{
print "<INPUT TYPE="radio" NAME="domena" VALUE="$row[1]">" . $row[0]."<BR>";
}
mysql_close($link);
print '<INPUT TYPE="submit" VALUE="Dodaj">';
?> |
vhost.php
----------
<?php
include "config.php";
$id = $_POST["domena"];
$vhost = $_POST["vhost"];
print "Connecting to database...<BR>";
$link = mysql_connect($server, $dns_db_user, $dns_db_pass ) or die(mysql_error());
print "<B>Connected<BR></B>";
print "Selecting database...<BR>";
mysql_select_db( $dns_db ) or die(mysql_error());
print "<B>Selected<BR></B>";
$query = "SELECT name FROM domains WHERE id=".$_POST["domena"];
$result = mysql_query( $query ) or die(mysql_error());
$row = mysql_fetch_row ($result);
$domain = $row[0];
print "Adding DNS entry... $vhost.$domain<BR>";
$query = "INSERT INTO records (domain_id, name, type, content, ttl) VALUES($id, "$vhost.$domain","CNAME","$domain", 3600)";
mysql_query($query) or die(mysql_error());
mysql_close($link);
print "<B>DNS entry added<BR></B>";
print "Connecting to database...<BR>";
$link = mysql_connect($server, $apache_db_user, $apache_db_pass ) or
die(mysql_error());
print "<B>Connected<BR></B>";
print "Selecting database...<BR>";
mysql_select_db( $apache_db ) or die(mysql_error());
print "<B>Selected<BR></B>";
print "Adding Virtual Host entry<BR>";
$full = $vhost.".".$domain;
$query = "INSERT INTO vhosts VALUES ("<VirtualHost $full>
ServerName $full
DocumentRoot
$home/$full
</VirtualHost>","$full")";
mysql_query($query) or die(mysql_error());
mysql_close($link);
print "<B>Virtual Host entry added<B><BR>";
print "Enabling ftp access...<BR>";
print "Connecting to database...<BR>";
$link = mysql_connect($server, $ftp_db_user, $ftp_db_pass ) or die(mysql_error());
print "<B>Connected<BR></B>";
print "Selecting database...<BR>";
mysql_select_db( $ftp_db ) or die(mysql_error());
print "<B>Selected<BR></B>";
$path = $home."/".$full;
$query = "INSERT INTO users (User,Password,Dir) VALUES("".$_POST["user"]."","".$_POST["passwd"]."","$path")";
mysql_query($query) or die(mysql_error());
mysql_close($link);
print "<B>Ftp access enabled</B><BR>";
?> |
Wrzucamy sobie te pliki np do /usr/local/www/data i odpalamy lynx 127.0.0.1 :)
Podsumowanie
I to by było wszystko.
Od autora
Opis ten powstał podczas tworzenia tak owego systemu. Ponieważ mi się udało tak zrobić i system ten działa, więc bardzo możliwe jest , że może jeszcze komuś innemu się uda jeśli będzie czegoś takiego potrzebował. Jestem otwarty na wszelkie kreatywne formy krytyki oraz pytania. Jeśli moje
powyższe wypociny się komuś do czegoś przydadzą będzie mi miło.
Krzysztof "msciciel" Pawłowski
Źródła
*
http://downloads.powerdns.com/documentation/html/
* /usr/local/share/doc/mod_sqlinclude/README.txt
*
http://www.pureftpd.org/README.MySQL
Autor: Krzysztof "msciciel" Pawłowski
msciciel(at)darkzone.ma.cx Tylko zarejestrowani użytkownicy mogą pisać komentarze. Prosze zaloguj się i dodaj komentarz. Powered by AkoComment! |