Przenosimy vhost'y Lighttpd do bazy danych MySQL

Ostatnio pisałem o spięciu vsftpd wraz z MySQL'em, kolejnym etapem ułatwiania sobie życie może być spięcie naszego serwera WWW z bazą danych, ułatwi to w przyszłości zarządzanie systemami hostingowymi. Jak wspominałem w poprzednim wpisie, przenoszenie konfiguracji do bazy danych posiada bardzo dużą zaletę jeśli chodzi o centralizację informacji. Możemy tak zaprojektować bazę danych, by przechowywać w niej zarówno vhost'y, użytkowników czy domeny. Takim systemem daję się później zarządzać bez problemów przez prostą stronę WWW, dodatkową zaletą jest to, że nasi użytkownicy mogą sami podpinać kolejne domeny, zakładać nowe konta, czy zmieniać hasła.

Dziś wypadło na Lighttpd + MySQL. Tradycyjnie zaczniemy od instalacji niezbędnych pakietów:

root@iDev:/home/jamzed# apt-get install lighttpd lighttpd-mod-mysql-vhost mysql-server mysql-client

Mając już działającą bazę danych, możemy przejść do założenia użytkowników i struktury tabel:

root@iDev:/home/jamzed# mysql -uroot -p

CREATE DATABASE lighttpd;
GRANT SELECT ON lighttpd.* TO lighttpd@localhost IDENTIFIED BY 'lighty123';

USE lighttpd;

CREATE TABLE domains (
domain varchar(64) not null primary key,
docroot varchar(128) not null
);

Stworzyliśmy właśnie bazę danych lighttpd, dodaliśmy użytkownika lighttpd z hasłem lighty123 oraz stworzyliśmy tabelę domains (pierwsze pole zawiera domenę, drugie katalog w którym będzie umieszczona strona). Od razu możemy dodać jakiś testowy vhost:

root@iDev:/home/jamzed# mysql -uroot -p
USE lighttpd;
INSERT INTO domains VALUE('testowa.pl','/var/www/testowa.pl/');

Dodaliśmy właśnie pierwszą domenę do naszego systemu, przechodzimy teraz do konfiguracji lighttpd.

root@iDev:/home/jamzed# vi /etc/lighttpd/lighttpd.conf

Musimy dodać nasz moduł MySQL vhost do konfiguracji, robimy to dodając wpis w sekcji server.modules, całość powinna wyglądać mniej więcej tak:

server.modules              = (
"mod_access",
"mod_alias",
"mod_accesslog",
"mod_compress",
"mod_mysql_vhost"
)

Przechodzimy teraz na koniec pliku z konfiguracją i dodajemy konfigurację do połączenia się z bazą danych:

mysql-vhost.db = "lighttpd"
mysql-vhost.user = "lighttpd"
mysql-vhost.pass = "lighty123"
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"
mysql-vhost.hostname = "localhost"
mysql-vhost.port = 3306

  • mysql-vhost.db - oznacza nazwę bazy danych
  • mysql-vhost.user - użytkownik na którego się łączymy
  • mysql-vhost.pass - hasło do bazy
  • mysql-vhost.sql - określamy nasze zapytanie SQL, odpowiedź musi być document root'em
  • mysql-vhost.hostname - host na którym działa baza danych
  • mysql-vhost.port - port na którym słucha nasza baza

Załóżmy teraz katalog /var/www/testowa.pl i stwórzmy plik index.html:

root@iDev:/home/jamzed# mkdir /var/www/testowa.pl
root@iDev:/home/jamzed# echo "testowa.pl" > /var/www/testowa.pl/index.html

Spróbujmy zrestartować serwer i sprawdźmy czy wszystko działa poprawnie:

root@iDev:/home/jamzed# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET / HTTP/1.0
Host: testowa.pl

HTTP/1.0 200 OK
Content-Type: text/html
Accept-Ranges: bytes
ETag: "1628042861"
Last-Modified: Sun, 07 Mar 2010 15:45:17 GMT
Content-Length: 11
Connection: close
Date: Sun, 07 Mar 2010 15:46:35 GMT
Server: lighttpd/1.4.22

testowa.pl
Connection closed by foreign host.

Jak widać, połączenie z serwerem udało się, następnie wysłałem żądanie o stronę główną (/), prosząc o stronę dla hosta testowa.pl i w odpowiedzi otrzymałem ciąg znaków "testowa.pl", tak więc wszystko działa poprawnie. Zapraszam do głosowania w ankiecie:

[poll id="6"]