Tags

bin_sh blocage blosxom bsdfrance cblog chroot cluster dg834 dhcp dns dnsmasq fail-over fail2ban firefox freebsd ftp git install ipv6 jail kernel kimsufi libre linutop makefile netbook netbsd nginx ntp ntp.org openntpd openwrt proxy python reverse rmll rrdcgi sl2009 ssd symon update usb var_empty vimperator world xen zfs

Powered by

blOg
maRkdown
awK
shEll

28/03/2010

[ cblog chroot nginx reverse proxy ]

201003282136 cblog chroot nginx reverse proxy

cblog et chroot

Pour ceux qui ne connaissent pas, cblog est un moteur de blog écrit en C. J'y contribue un peu et je vais donc décrire comment je l'utilise.

Une fois les dépendances installées (clearsilver, fcgi-devkit et tinycdb), on peut récupérer cblog:

dsx@devel> git clone git://brokk.etoilebsd.net/CBlog.git
dsx@devel> cd CBlog
dsx@devel> make

On peut définir le chemin vers le fichier cblog.cdb:

dsx@devel> make CDB_PATH=/var/db

Pour vérifier ce chemin (utile pour le chroot):

dsx@devel> ./cli/cblogctl path
/var/db/cblog.cdb

Les chroot c'est bien mais il est très facile d'oublier un fichier. Pas de soucis ici:

dsx@devel> sudo ./chroot_cblog.sh

chroot_cblog.tgz contient tout ce qu'il nous faut. On ne peut pas utiliser Freebsd et zfs sans faire de jail. J'utilise pour ce faire deux petits scripts de ma composition:

root@kimsufi# ./mk_template medium
root@kimsufi# ./mk_template large
root@kimsufi# ./mk_jail medium proxy 'lo1|172.16.0.1'
root@kimsufi# ./mk_jail large blog 'lo1|172.16.0.2'

Une jail 'proxy' avec un nginx servira de reverse proxy tandis qu'une jail 'blog' fera tourner cblog dans un chroot.

Je commence par faire mon package 'nginx':

dsx@compil> cd /usr/ports/www/nginx-devel
dsx@compil> sudo make config
  [x] ipv6
  [x] http_module
  [x] http_cache_module
  [x] http_rewrite_module
  [x] http_ssl_module
  [x] www
dsx@compil> sudo make
dsx@compil> sudo make package

Je configure mon reverse proxy:

dsx@proxy> sudo pkg_add /tmp/nginx-devel-0.8.34.tbz
dsx@proxy> sudoedit /usr/local/etc/nginx/nginx.conf
[ snip ]
server {
    listen 80;
    server_name blog.bsdsx.fr;
    access_log off;
    location / {
        proxy_pass http://172.16.0.2/;
        proxy_set_header Host $host;
    }
}

Attention au access_log à off, c'est uniquement pour ne pas logguer plusieurs fois les requêtes. On passera à off une fois le reverse proxy correctement configuré (chemin, adresse ip...). Pour ceux qui se demande pourquoi un reverse proxy la réponse est simple: si je peux multiplier les jails, il n'en est pas de même avec mes ipv4. Tout le traffic http sur ipv4 arrive sur le reverse proxy qui dispatche vers la bonne jail (qui elle est accessible aussi en ipv6). De plus si un jour le besoin de cache se fait sentir, quelques directives proxy_cache_ et fastcgi_cache_ et le tour est joué.

Pour finir le gros morceau: la jail 'blog' avec son chroot.

root@blog# pkg_add -r spawn-fcgi
Fetching ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.0-release/Latest/spawn-fcgi.tbz... Done.
root@blog# mkdir /usr/local/chroot/bsdsx
root@blog# tar xzvf /tmp/chroot_cblog.tgz -C /usr/local/chroot/bsdsx

Et c'est parti pour la lecture de chroot.txt.


Lien vers ce billet

14/08/2008

[ nginx fail-over fail2ban ]

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.4

J'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 start

On 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.pid

Et le démarrage au boot:

download# echo 'nginx_enable="YES"' >> /etc/rc.conf

Reste 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 from <ssh_ok> to $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
455

Aux 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
table <spammers> persist file "/etc/spammers"
block quick from <spammers>

Et un script qui met à jour /etc/spammers:

[ 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


Lien vers ce billet