14/08/2008
200808140800 nginx fail-over fail2ban
Fail-over et nginx
Fail-over: pourquoi faire ?
Je devais depuis longtemps installer nginx, afin de mettre à disposition quelques lignes de code. Histoire de corser la chose, pourquoi ne pas utiliser la deuxième @IP de mon dédié ? Je suis bien conscient que le but premier d'une adresse fail-over n'est pas de réserver une adresse pour un service particulier mais il faut bien s'amuser :)
Comment faire ?
On commence par activer l'adresse fail-over dans la console de management. Une fois le courriel de confirmation reçu, je crée une jail:ks# ./bin/mk_jail.sh donwload 10240M dowload.bsdsx.fr 172.16.0.4J'installe nginx:
compil# cd /usr/port/www/nginx compil# make package compil# pkg_delete nginx-0.6.32 [ copie de nginx-0.6.32.tbz depuis compil vers download ] download$ sudo pkg_add nginx-0.6.32.tbz
La configuration se limite à l'emplacement des fichiers de logs et du document root.
On lance le serveur:download$ sudo /usr/local/etc/rc.d/nginx startOn n'oublie pas la rotation des logs:
download$ grep nginx /etc/newsyslog.conf /var/log/nginx/*.log 640 10 5000 $W6D0 JG /var/run/nginx.pidEt le démarrage au boot:
download# echo 'nginx_enable="YES"' >> /etc/rc.confReste la configuration du pf de l'hôte (extraits):
failover="adresse.ip.du.failover" nat on $ext_if from 172.16.0.4 -> $failover rdr pass on $ext_if proto tcp fromto $failover port ssh -> 172.16.0.4 port ssh rdr pass on $ext_if proto tcp to $failover port http -> 172.16.0.4 port http
Et c'est tout ?
Ben oui. Ce serveur web proposant (pour l'instant j'espère :) très peu de chose, je ne me suis pas soucié des logs. Grave erreur:download$ grep -c w00t /var/log/nginx/access.log 267 download$ grep -c php /var/log/nginx/access.log 455Aux grands maux, les grands remèdes:
download$ grep -A 2 'location.*php' /usr/local/etc/nginx/nginx.conf
location ~ \.php {
deny all;
}
Et depuis l'hôte:
ks# awk '{ print $11 }' /zfs/jail/download/var/log/nginx/error.log | sort -u | tr -d ',' >> /etc/spammers
Avec une règle pf kivabien:
ks# grep spammers /etc/pf.conf tableEt un script qui met à jour /etc/spammers:persist file "/etc/spammers" block quick from
[ snip alimentation /etc/spammers ] /sbin/pfctl -q -t spammers -T replace -f /etc/spammers
Et oui, fail2ban c'est bien, mais sous freebsd c'est demerdeune ziziche :)
Update:
Merci à dug pour la (double :) correction de la ligne de newsyslog.conf
13/08/2008
200808130800 symon rrdcgi bin_sh
symon et rrdcgi
rrdcgi n'est pas mon ami
Comme indiqué clairement dans le man:rrdcgi is a sort of very limited script interpreterCe qui signifie que ce genre de chose ne fonctionne pas:
<RRD::SETVAR _ma_var un> <RRD::SETVAR _mon_block multi ligne <RRD::GETVAR _ma_var> ligne multi > <RRD::GETVAR _mon_block> <RRD::SETVAR _ma_var deux> <RRD::GETVAR _mon_block>
Lors du deuxième appel, _ma_var n'est pas réévaluée. Moi qui pensais pouvoir définir un squelette pour RRD::GRAPH agrémenté de RRD::GETVAR, c'est loupé !
J'ai eu beau retourner le problème dans tous les sens (même à coup de réécriture d'url), pas moyen d'utiliser rrdcgi comme je le veux.
Est-il utile de préciser que je n'ai pas réussi à échapper une quote (simple ou double) ?
J'ai un autre ami
Comme d'habitude, les solutions les plus simples sont souvent les meilleures. Quelques lignes de shell et le tour est joué !
#!/bin/sh
. common.inc
_graph() {
[ snip definition du graph ]
}
head 'Titre de la page'
_graph 'Titre du graphique' <start>
_graph 'Titre du graphique' <autre_start>
footer
J'ai des amis
On active tout ça dans lighttpd.conf (extraits):
url.access-deny = ("~", ".inc") # defini par default
static-file.exclude-extensions = (".php", ".pl", ".fgci", ".sh") # on rajoute ".sh"
cgi.assign = ( ".pl" => "/usr/bin/perl", ".sh" => "/bin/sh" ) # idem
Et on peut admirer le résultat ici. On remarquera que:
- c'est brut de fonderie
- mon serveur n'en fout pas une ramée :)
Pour les amis
Le tout est disponible ici.
![Validate my Atom 1.0 feed [Valid Atom 1.0]](/valid-atom.png)
![Validate my RSS feed [Valid RSS]](/valid-rss-rogers.png)