Subdomény (apache, .htaccess, awstats, logrotate)
6. July 2007
Každý jen trošku větší web admin jednou narazí na to, že potřebuje udělat vytváření subdomén poněkud více uživatelsky přátelštější. Větší hostingy už to mají povětšinou nastaveno, proto vy co někde pouze hostujete můžete s klidem odejít ostatně možná i ti kteří nemají shell s uživatelem uid 0 :)
Takže - mojím cílem bylo trošku zjednodušit celý postup vytvoření subdomén a hlavně logování jednotlivých subdomén pomocí awstatu. Vytváření domén druhého řádu jsem chtěl nechat - jednak kvůli oddělení logům a druhak k odlišným nastavením různých atributů pro php - na manuálním zapsání do konfiguráku apache.
1. Nazačátek je nutné definovat správný log formát. Předefinované direktivy(common a combined) nepodporují vůbec subdomény resp. při jejich použití se všechny subdomény tváří jako jedna což se právě snažíme změnit. Awstats sám o sobě potřebuje “combined”, aby dokázal rozlišit odkud je co, přidáme na začátek hodnotu Host z posílané HTTP hlavičky. Ve finále by tedy měl náš formát logu (v httpd.conf), pojmenován cplus, vypadat takto
LogFormat "%{Host}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" cplus
2. Jednotlivé hlavní domény pak budou definovány takto
<VirtualHost *:80>
ServerAdmin sh@isecure.cz
DocumentRoot /home/sh/public_html/isecure.cz
ServerName isecure.cz
ServerAlias *.isecure.cz
ErrorLog /home/sh/logs/isecure.cz-error_log
CustomLog /home/sh/logs/isecure.cz-access_log cplus
</VirtualHost>
pro jednoduchost mám logy pro všechny svoje domény v jednom adresáři, ostatně taky to dost zjednoduší konfiguraci logrotate.
3. o samotné subdomény se může postarat nativně apache, ale pokud to nechcete dělat ve velkém imho lepší definovat přes htaccess a mod_rewrite. Osobně používám tenhle zápis už pár měsícu a zatím bez problémů. .htaccess v mém případě nahraji do “/home/sh/public_html/isecure.cz/”. Pak by mohla struktura vypadat třeba takhle
/home/sh/public_html/isecure.cz/.htaccess
/home/sh/public_html/isecure.cz/subdomains/ads/
/home/sh/public_html/isecure.cz/subdomains/subdomena1/
/home/sh/public_html/isecure.cz/subdomains/subdomena2/
/home/sh/public_html/isecure.cz/subdomains/www/
pokud by uživatel zadal adresu bez www na začátku, tedy pouze isecure.cz, bude přesměrován automaticky na www.isecure.cz
4. Momentálně by měl být web už kompletně funkční pokud máte správně nastaveny DNS servery. Instalace awstats je myslím bezproblémová takže se vrhnu rovnou na nastavení. První změna oproti awstats.model.conf je právě formát logu
# LogFormat = "%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
protože mým záměrem bylo vytvářet konfigurace nějakým rozumnějším způsobem než přímo úpravou, bylo nutné ještě změnit
LogFile="/home/sh/logs/{logdomain}-access_log"
SiteDomain="{domain}"
HostAliases="{alias} 127.0.0.1"
awstats.model.conf
jednoduchý ruční skript na vytvoření configu pak může vypadat takhle awstats.gen-conf.pl - první zadáte nadřazenou doménu, pak celou adresu subdomény a třetí aliasy pokud nějaké jsou, šlo by to ještě víc zautomatizovat tím že by skript každých pár minut kontroloval vytvořené adresáře a podle nich rovnou tvořil…
5. jelikož používám dávkové zpracování cronem napsal jsem si jednoduchý skriptík(awstats.gen-stats.pl - do /etc/cron.daily/) na zpracování všech logů, které jsou nakonfigurované, takže není ani potřeba měnit nastavení cronu když chcete cokoliv ve statistikach přidat nebo odebrat.
6. rotování logů je nastaveno v /etc/logrotate.d/apache-sh-logy
/home/sh/logs/*-access_log {
rotate 8
weekly
create
ifempty
olddir /home/sh/logs/oldlogs
prerotate
/etc/cron.daily/awstats.gen-stats.pl
endscript
postrotate
/usr/sbin/apachectl restart
endscript
}
/home/sh/logs/*-error_log {
rotate 8
weekly
create
ifempty
olddir /home/sh/logs/oldlogs
postrotate
/usr/sbin/apachectl restart
endscript
}
rotování nastaveno každý týden na cirka dva měsíce, prerotate je tam přesně proto abychom nepřišli o data při rotování a postrotate znovuvytvoření logů resp. znovu načtení fd - někde jsem viděl i killall -HUP apache, ale “not works for me” a třísekundový výpadek ve čtyři ráno taky ještě nikoho nezabil :)
7.Nakonec jedonduchý výpis v PHP a odkazy na jednotlivé statistiky - mám dojem že při zapnutém safe_mode nefunkční :D
<ul>
<?php
if($_SERVER["REMOTE_ADDR"] == 'moje_adresa') {
if ($handle = opendir('/etc/awstats')) {
while (false !== ($file = readdir($handle))) {
if(preg_match('/^awstats\.(.*)\.conf$/', $file, $matches)) {
echo "<li><a href=\"awstats/awstats.pl?config=$matches[1]\">$matches[1]</li>\n";
}
}
closedir($handle);
}
}
?>
</ul>
8. a to je vše přátelé :)

15 September, 2007 [1:48 am]
Nejsem schopný donutit awstats, aby brali v potaz toho virtualhosta. Prostě v těch statistikách akorát vidím, požadavky na /, ale nic víc. :(
15 September, 2007 [12:11 pm]
mrkni se na bod 1 :) …ono apache to defaultne zapisuje bez virtualky a dokud mu nevnutis
LogFormat “%{Host}i…
tak to fungovat nebude
29 October, 2007 [6:56 pm]
Mel bych dotaz, nejsem shopen rozjet subdomeny at uz na localhostu,ci na verejne domene.Byla by tu moznost, ze byste mi pomohl? Dekuji
6 June, 2008 [12:02 pm]
Ahoj,
myslis ze ny jsi jeste mohl dozverejnit ten logrotate?
7 June, 2008 [3:06 pm]
už to tam je…se to zřejmě přechodem na nový wp nějak zprasilo