gitweb et nginx sous Debian

Cela fait un petit moment que j’utilise NGINX et je l’aime vraiment beaucoup. Il vous faudra changer quelques petites choses pour faire tourner du CGI. Je tenais a documenter rapidement la methode sur Debian. Je presume ici que vous utilisez /var/www comme racine de site web et que vous tournez Debian. Installez apt-get install gitweb fcgiwrap et faites ensuite un lien symbolique comme suit : ln -s /usr/share/gitweb /var/www/.

Il ne vous reste qu’a ajouter ceci a votre configuration (dans le fichier defaults ou le vhost que vous utilisez) :

       location /gitweb/ {
		index index.cgi;
		include fastcgi_params;
                gzip off;

               if ($uri ~ "/gitweb/index.cgi") {
                        fastcgi_pass unix:/var/run/fcgiwrap.socket;
                }

        }

Mon fichier fastcgi_params est un petit peu different de celui par default, le voici donc, editez /etc/nginx/fastcgi_params

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Il ne vous reste qu’a executer un service nginx restart et pointer votre navigateur sur /gitweb, et voila !

IPVS en redondant (VRRP)

VRRP est un mecanisme tres sympathique qui permet de balancer une IP d’une machine a une autre. J’ai poste sur IPVS la semaine derniere dans le cadre d’un setup simple, voici ici une facon plus robuste d’approcher la chose. Si vous vous souvenez de la semaine derniere, nous avions une adresse IP joignable sur 192.168.66.6 sur laquelle nous routions notre traffique http. Pour que cela marche correctement, il vous faut aussi une adresse IP statique sur le meme sous reseau telle que 192.168.66.5. Une fois configuree, vous pouvez verifier votre setup avec ip addr (j’ai recemment decouvert que ifconfig est trop bancal pour donner un bon resultat).

Voici le fichier keepalived.conf sur la premiere machine :

global_defs {
        router_id  My_LB_1
}
vrrp_instance lb_network {
        state BACKUP
        interface eth0
        track_interface {
                eth0
        }
	lvs_sync_daemon_interface eth0
        virtual_router_id 100
        priority 150
        authentication {
                auth_type PASS
                auth_pass superfancysecretpass
        }
        virtual_ipaddress {
                192.168.66.6
        }
        nopreempt
}
virtual_server 192.168.66.6 80 {
        delay_loop 30
        lb_algo wrr
        lb_kind NAT
        protocol TCP

        real_server 10.10.1.101 80 {
                weight 10
                TCP_CHECK {
                        connect_timeout 3
                }
        }
        real_server 10.10.1.102 80 {
                weight 10
                TCP_CHECK {
                        connect_timeout 3
                }
        }
}

Et sur la seconde machine :

global_defs {
        router_id  My_LB_2
}

vrrp_instance lb_network {
        state BACKUP
        interface eth0
        track_interface {
                eth0
        }
	lvs_sync_daemon_interface eth0
        virtual_router_id 100
        priority 100
        authentication {
                auth_type PASS
                auth_pass superfancysecretpass
        }
        virtual_ipaddress {
                192.168.66.6
        }
        nopreempt
}
virtual_server 192.168.66.6 80 {
        delay_loop 30
        lb_algo wrr
        lb_kind NAT
        protocol TCP

        real_server 10.10.1.101 80 {
                weight 10
                TCP_CHECK {
                        connect_timeout 3
                }
        }
        real_server 10.10.1.102 80 {
                weight 10
                TCP_CHECK {
                        connect_timeout 3
                }
        }
}

Et voila, une configuration redondante avec keepalived !

Graphite (ou le meilleur systeme de metriques)

J’aimerais vous entretenir de Graphite. En restant simple, probablement le meilleur systeme de stats/graphs qu’il m’ait ete donne de travailler. Il utilise un systeme similaire a RRDtool mais en plus intelligent, surtout quand il s’agit d’ecrire des donnees antecedentes a la date en cours, ce qui peux etre bien pratique dans certains cas.

J’ai travaille avec pas mal d’autres systemes de metriques au fil des annees (mrtg, cacti, collectd, munin). Certaines d’entres elles valent le detour tel que yaketystats qui peux vous servir si vous voulez grapher beaucoup de metriques.

Graphite vous permet de mettre en place un systeme qui tiens bien la charge avec des operations par minutes bien robustes (je lui envoie environ 100k+ de metriques a la minute). Mon installation actuelle utilise egalement varnish qui permet de cacher les graphs pour les clients, enlevant un peu de charge des serveurs. Graphite utilise un moteur qui se decompose en deux parties : carbon-cache.py permettant de compiler les donnees dans la base de donnees (whisper) et carbon-relay.py permettant d’envoyer des donnees filtrees vers un autre serveur pour decharger ce premier.

Restez en ligne pour quelques infos sur ce setup dans mes prochains posts…

IPVS tout propre chez toi

J’ai du travailler sur IPVS recemment et j’ai decide de documenter mes experimentations. Imaginons que vous ayez une adresse IP utilisee pour plusieurs machines repondant sur le port 80 : 192.168.66.6, prenons a presents 3 machines, celle tournant IPVS en 10.10.1.66, et deux autres machines servant du contenu web sur le port 80 avec les IPS suivantes : 10.10.1.101 et 10.10.1.102.

Afin de faire marcher le tout, il vous faudra installer ipvsadmin et keepalived. Ce dernier vous servira a distribuer le trafique entre les deux machines. Voici la configuration pour ce faire :

global_defs {
     notification_email {
         luser@frlinux.net
     }
     notification_email_from root@frlinux.net
     smtp_server 127.0.0.1
     smtp_connect_timeout 3000
     router_id MYFANCY_IPVS
}
virtual_server 192.168.6.66 80 {
    delay_loop 30
    lb_algo wrr
    lb_kind NAT
    protocol TCP
       real_server 10.10.1.101 80 {
        weight 10
        TCP_CHECK {
		connect_timeout 3
        }
     real_server 10.10.1.102 80 {
        weight 10
        TCP_CHECK {
		connect_timeout 3
        }
    }
}

Pensez bien evidemment a activer ip_forward dans le sysctl.conf: net.ipv4.ip_forward = 1.

Il faut ensuite ajouter la route par default pour les machines, la plus propre etant de diriger le trafique par defaut vers la machine IPVS : route add default gw 10.10.1.66. Assurez vous de sauver ces changements pour survivre un redemarrage.

Vous pouvez a present demarrer IPVS et admirer sa haute disponibilite :)

dhclient : tout propre

Ce n’est pas un probleme tres complique mais je prefere le documenter avant d’oublier. Imaginons que vous ayez une machine qui parle a un serveur DHCP aggressif (timings de lease tres courts) et que vous ayez besoin de preciser des DNS particuliers. Il y a plusieurs facons de regler ceci y compris la hache. La maniere elegante est d’editer /etc/dhclient/dhclient.conf et de decommenter :

supersede domain-search "domain.com", "another.domain.com", "etc.domain.com";
prepend domain-name-servers 127.0.0.1;

Notez que j’ajoutes egalement mon propre DNS local car je prefere l’utiliser aux DNS externes.