hostonomy: .htaccess vs apache2 configuration

Bonjour,

Comme je le disais, Hostonomy utilise ISPConfig3 pour gérer vos sites. En tant que client de l’offre Hostonomy, vous avez par défaut un profil de revendeur, ce qui vous autorise à créer vos clients, vos sites, leurs sites, vos comptes mails. Par défaut, vous ne pouvez pas modifier manuellement la configuration de votre serveur Apache2 autrement que par un fichier htaccess. Très bien, mais si vous connaissez bien apache et le hosting en général, vous savez que l’interprétation d’un fichier htaccess, se faisant par apache à chaque accès dans le répertoire, prend un temps non négligeable et vous fait perdre un peu de performance.

Demandez au support Altern-IT, de vous passer en mode administrateur, vous aurez alors la possibilité de changer les options apache et php!

Posted in apache2, hostonomy | Leave a comment

Conseil configuration hostonomy

Utilisateur et concepteur de l’offre hostonomy, je vous donne un petit conseil pour héberger vos wordpress, drupal, et joomla.
L’offre se basant sur le projet ISPconfig, Il est plus simple d’activer l’option SuEXEC, afin qu’apache2 exécute les scripts non pas en tant que www-data mais avec votre nom d’utilisateur. Cela vous permet de gérer simplement les droits d’accès et d’exécution.

Posted in apache2 | 2 Comments

Configuration reverse proxy et apache pour garder les IP des clients

L’intérêt de l’utilisation d’un reverse proxy n’est plus à démontrer dans le domaine de l’hébergement. Chez Altern-IT, tous les serveurs web sont derrière un reverse proxy. Par contre, pour pouvoir exploiter pleinement la fonction et gérer correctement ses statistiques, par exemple, il est important de garder l’adresse IP du client dans les logs du serveur web. Par défaut, ce sont ceux du reverse proxy qui apparaitront. Dans notre cas, nous utilisons nginx, en reverse proxy et apache en serveur web. Comment faire pour garder cet IP du client?

Juste un tout petit peu de configuration de chaque côté…
Dans nginx, il faut ajouter les lignes suivantes dans la configuration du serveur:

                proxy_set_header   Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Dans apache, il faut utiliser un module supplémentaire libapache2-mod-rpaf et faire la configuration suivante dans

        RPAFenable On
        RPAFsethostname On
        RPAFproxy_ips ip_webserver1 ip_webserver2

En espérant que cela puisse vous aider.

Posted in apache2 | Leave a comment

Un procés pour microsoft


Comment? GCU fait un procés à Microsoft?
Personnellement, je fais confiance à la justice du jardin magique pour traiter le présumé innocent en digne coupable d’un certain nombre d’exactions envers le logiciel libre et ce procés a eu au moins pour effet d’illustrer l’imposture intellectuelle de la société pré-citée. Comment peut-on afficher semblant reprendre à son compte de vénérables noms issus du logiciel libre sur une stand du salon Solution Linux 2011: python, mysql, apache…? En faisant le tour de passe-passe d’afficher son inter-opérabilité? Entre quoi et quoi? Entre python et windows? Entre mysql et windows? Entre microsoft et php?

J’aime la métaphore, alors comme à mon habitude je me lance… C’est un peu comme-ci Vinci se vantait de faire des routes sur lesquels des renault, des peugeot, mais aussi des mercedes, des porsche et des citroën pouvaient rouler! Figurez-vous que même une citroën 15, la fameuse peut encore rouler sur nos routes… Et un 38 tonnes volvo? Oui, aussi, mais pas trop longtemps parce qu’après, ça ne marche plus. Bah, oui, il ne vous viendrait quand même pas à l’idée de faire tourner un apache sous windows pour faire tourner un site de video en ligne, par exemple!

Que microsoft soit ou ne soit pas coupable au regard de la loi française n’est pas important, car tel un électeur de Levallois béat qui revoterait toujours pour qui vous savez au mépris de toute morale, l’utilisateur qui n’a pas consience de sa liberté, reprendra toujours un windows. Non, il faut éclairer et la lumière viendra de l’april avec sa patience, sa réflexion, de la quadrature du net, avec son militantisme, et de gcu et ses 15 ans d’insoumission et d’n’importe de quoi!

Posted in open-source | Leave a comment

D’autres activités…

Bonjour,

Des mois que j’y travaillais, c’est fait, je me suis lancé, j’ai créé l’entreprise Altern-IT, avec la volonté d’offrir des solutions d’hébergement, de téléphonie et de sauvegarde toutes issues du logiciel libre.
Je vous donnerai peut-être des nouvelles de mon aventure dans quelques mois, aventure rendue possible grâce au travail quotidien de toute la communauté du logiciel libre et plus particulièrement grâce à deux personnes, qui, si elles lisent ces lignes, se reconnaîtront. Je confirme une nouvelle fois que nous recevons toujours plus de la communauté que nous ne donnons, au moins pour la plupart d’entre nous.

A bientôt.

Posted in open-source | Leave a comment

Un module puppet d’installation pour paquet debian avec preseeding

J’installais jusqu’à aujourd’hui des paquets debian avec puppet à condition que ceux-ci n’aient pas de configuration interactive lors de l’installation. Cela limitait sérieusement le nombre de paquets que j’étais en mesure d’installer par l’intermédaire de puppet. Impossible par exemple d’installer un serveur mysql, ou samba, pour qui il est nécessaire de répondre à des questions. La solution est relativement simple, puisqu’elle consiste à utiliser le concept de preseeding de debian dans puppet.
Si vous ne connaissez pas le preseeding, explication rapide, c’est relativement simple: l’outil debconf-set-selections du paquet debconf-utils permet de charger les réponses aux questions avec l’installation depuis un fichier plat:

debconf-set-selections < mysql-server.preseed
apt-get install mysql-server

Le format est relativement simple, et une recherche google vous permet de retrouver pour de nombreux paquets la meilleur configuration.

J’ai par conséquent écrit la classe suivante permettant de réaliser les deux opérations ci-dessous dans puppet:

class install {
        # je crée une classe me permettant d'installer des paquets.
        file { "/etc/apt/sources.list":
                # le fichier sources.list utile pour pointer sur les repo. Attention, il est nécessaire dans mon exemple de pointer sur le repo backport de lenny
                mode => "644",
                owner => root,
                group => root,
                source => "puppet://$fileserver/$environment/etc/apt/sources.list"
        }
        define pkginstall ($pkgname,$preseed='no')
        # la fonction pkginstall est en charge de l'installation, avec pour parametre, le nom du paquet et le preseeding oui ou non. Par défaut, c'est non.
        {
                case $preseed {
                        yes: {
                                #si c'est oui, on appelle la fonction preseed_package
                                preseed_package { "$pkgname": }
                               # et on installe en prenant par défaut le paquet de backport
                                exec { "install_$pkgname":
                                        command => "apt-get update && sudo apt-get -t lenny-backports -y install $pkgname",
                                        path => "/bin:/usr/bin/:/usr/sbin",
                                        timeout => "-1",
                                        require => Exec["debconf-set-selections_$pkgname"]
                                }
                        }
                        no: {
                                # si c'est non, c'est de l'install simple de backport
                                exec { "install_$pkgname":
                                        command => "apt-get update && sudo apt-get -t lenny-backports -y install $pkgname",
                                        path => "/bin:/usr/bin/:/usr/sbin",
                                        timeout => "120",
                                }
                        }

                }

        }
        define preseed_package () {
                file { "/var/local/preseed":
                        ensure => directory,
                }
                file { "/var/local/preseed/$name.preseed":
                        # le fichier de preseeding est installé dans /var/local/preseed/ avec comme format nomdepaquet.preseed, mysql-server.preseed, par exemple.
                        source => "puppet://$fileserver/$environment/var/local/preseed/$name.preseed",
                        mode => "644",
                        owner => root,
                        group => root,
                }
                exec { "debconf-set-selections_$name" :
                        # le fichier de preseed est utilisé avec debconf-set-selections, la commande issue du paquet debconf-utils permettant de charger le preseed.
                        command => "debconf-set-selections < /var/local/preseed/$name.preseed",                         require => [Exec["install_debconf-utils"],File["/var/local/preseed/$name.preseed"]],
                        path => "/bin:/usr/bin/:/usr/sbin",
                }
        }
}

Comment l’utiliser maintenant?
Sur mes machines, en général, j’installe les deux premiers paquets rsync et debconf-utils, ce qui me donne, à titre d’exemple, une classe d’install de base:

class baseinstall {
        install::pkginstall {
                "rsync":
                        pkgname => "rsync";
                "debconf-utils":
                        pkgname => "debconf-utils";
        }
}

Ensuite, prenons l’exemple d’un serveur http sous apache et mysql-server. Vous pourrez noter que la plupart des packages sont installés sans preseeding, excepté mysql-server.

class http {
        install::pkginstall {
                "apache2":
                pkgname => "apache2";
                 "mysql-server":
                pkgname => "mysql-server",
                preseed => "yes";
                "php5":
                pkgname => "php5";
                "php-pear":
                pkgname => "php-pear";
                "php5-cli":
                pkgname => "php5-cli";
                "php5-gd":
                pkgname => "php5-gd";
                "php5-mysql":
                pkgname => "php5-mysql";
                "php5-mcrypt":
                pkgname => "php5-mcrypt";
                "memcached":
                pkgname => "memcached";
                "php5-memcache":
                pkgname => "php5-memcache";
}

Le fichier /var/local/preseed/mysql-server.preseed sera placé dans votre serveur de fichier de l’environnement puppet utilisé.

mysql-server mysql-server/root_password select
mysql-server-5.1        mysql-server/root_password_again        password PASS
mysql-server-5.1        mysql-server/root_password      password PASS
mysql-server-5.1        mysql-server/error_setting_password     error
mysql-server mysql-server/root_password select PASS
mysql-server mysql-server/root_password_again select PASS
mysql-server-5.1        mysql-server-5.1/start_on_boot  boolean true
mysql-server-5.1        mysql-server-5.1/postrm_remove_databases        booleanfalse
mysql-server-5.1        mysql-server-5.1/nis_warning    note
mysql-server-5.1        mysql-server-5.1/really_downgrade       boolean false
mysql-server-5.1        mysql-server/password_mismatch  error
mysql-server-5.1        mysql-server/no_upgrade_when_using_ndb  error

En espérant que cela vous aidera.

Ciao

Posted in admin, mysql | 2 Comments

Migration à chaud de vm avec libvirt et kvm (3/3)

Dans mon article précédent, la migration à chaud de vm en utilisant libvirt et kvm n’avait pas fonctionné. Pour être plus précis, ma vm migrait bien d’un host à l’autre, était pingable mais se retrouvait avec un système de fichier en lecture seule. Regretable! Pourquoi? Simplement parce que le transfert du contexte durant la migration se fait par ssh en root (je n’ai pas encore trouvé le moyen de changer cela). Le fichier est exécuté par kvm qui tourne sous le user libvirt-qemu avec les droits 755 et n’a donc pas accès en écriture à la vm après la migration.
Mais pourquoi cela fonctionne-t-il quand je redémarre la vm par la fonction :

virsh create toto.xml

Cette fonction change les owners et groups du fichier de disk de vm, ce que ne fait pas la fonction migrate.

La solution est donc d’ajouter le user libvirt-qemu au groupe root et de mettre les droits 775 au fichier de disks de vm.

En conclusion, une restriction d’utilisation est identifiée: la nécessité d’ouvrir le ssh à root. Ce qui n’est pas une bonne pratique. Il faut au moins supprimer la connexion par mot de passe et la remplacer par une connexion par clé.

Posted in admin, virtualization | Leave a comment

Migration à chaud de vm avec libvirt et kvm (1/3)

Bonjour,

L’objectif de cet article est de vous relater mes expériences de migration à chaud de VM (machines virtuelles) entre deux serveurs KVM utilisant libvirt-bin.
En préambule, j’ai eu quelques soucis de mise à jour de version de libvirt-bin. Ce sera le sujet de la première partie.

Pour information, j’utilise deux serveurs HP Proliant G5 qui sont au début de mes expérimentations en debian lenny, 2.6.26-amd64 pour le kernel et en version 0.4.6 pour libvirt-bin.

Stockage centralisé des VMs
Dans l’état actuel des choses, mes VMs sont stockées dans l’arborescence locale de chacune des machines. Ceci ne rend pas la migration d’une machine à l’autre possible. Pour ce faire, il faut être équipé d’un stockage centralisé, de type SAN ou NFS. NFS est la méthode la plus économique et la plus facile à mettre en oeuvre. Dans l’idéal, pour avoir un intérêt en production, j’aurais besoin d’une autre machine pour faire serveur nfs. Ce n’est pas le cas, je configure donc ma première machine en serveur NFS. J’exporte le répertoire où je stocke les disques et le répertoire où je stocke les fichiers xml de description des vms utilisé par libvirt. Par défaut, celui-ci est en /etc/libvirt/qemu.

Mon fichier /etc/exports de la machine nfs server:

/home/stephbul/vms/disks monlan/255.255.255.0(rw,no_subtree_check,no_root_squash)
/home/stephbul/vms/vms monlan/255.255.255.0(rw,no_subtree_check,no_root_squash)

nfs1 est le serveur nfs1 et monlan est mon réseau local, comme défini dans /etc/networks. Je restreins l’accès à ce nfs au seul réseau monlan.

Mes fichiers /etc/fstab de mes deux machines:

nfs1:/home/stephbul/vms/disks /sbufarm/disks nfs rw,rsize=4096,wsize=4096,hard,async 0 0
nfs1:/home/stephbul/vms/vms /sbufarm/vms nfs rw,rsize=4096,wsize=4096,hard,async 0 0

Attention, à ne pas oublier de changer les chemins d’accès dans vos fichiers xml de description de vos VMs.

Il est maintenant temps de faire les premiers essais. Malheureusement, je note vite que la fonction de migration n’est disponible dans l’hyperviseur qu’à partir de la version 0.5.0. Etant en 0.4.6, il est nécessaire de faire une mise à jour de libvirt. Ne souhaitant pas me lancer, à l’origine dans un upgrade depuis lenny vers squeeze de mes deux HP Proliant G5 utilisé pour différents services, j’ai décidé de tenter le package pinning, fonction bien pratique de debian pour utiliser la version de debian squeeze pour libvirt-bin qui est la 0.8.1.
Malheureusement les dépendances de libvirt ont nécessité un upgrade de udev. Et celui-ci m’a fait tombé sur le problème connu chez debian (bug #566000).

Preparing to replace libudev0 149-1 (using .../libudev0_150-2_i386.deb)
....
Unpacking replacement libudev0 ...
Preparing to replace udev 149-1 (using .../archives/udev_150-2_i386.deb)
....
Since release 150, udev requires that support for the CONFIG_SYSFS_DEPRECATED feature is disabled in the running kernel.

Please upgrade your kernel before or while upgrading udev.

AT YOUR OWN RISK, you can force the installation of this version of udev
WHICH DOES NOT WORK WITH YOUR RUNNING KERNEL AND WILL BREAK YOUR SYSTEM
AT THE NEXT REBOOT by creating the /etc/udev/kernel-upgrade file.
There is always a safer way to upgrade, do not try this unless you
understand what you are doing!


Il semble nécessaire d’installer un nouveau kernel, mais l’installation n’est alors plus possible du fait de la dépendance cassée…
Bon, comment m’en suis-je sorti?


$ apt-get update
# Désinstallation de libvirt-bin
$ apt-get remove libvirt-bin
$ apt-get autoremove
# Désinstallation de tous les kernels
$ apt-get remove linux-image-2.6....
# Installation du dernier kernel par son méta-package
$ aptitude install linux-image-2.6-amd64
$ reboot
$ aptitude full-upgrade
$ reboot

Cela correspond à ce que je ne voulais pas faire (un upgrade vers squeeze), mais c’était devenu nécessaire.
Ensuite, je réinstalle libvirt-bin

$ apt-get install libvirt-bin

Ce qui me donne

$ virsh --version
0.8.1

Je peux enfin commencer mes tests. Ce que vous trouverez dans un le post suivant.

Posted in admin, virtualization | Leave a comment

Migration à chaud de vm avec libvirt et kvm (2/3)

Vous avez pu lire dans l‘article précédent la préparation des tests de migration. Passons aux choses sérieuses maintenant.

Comment effectuer une migration à chaud?
La commande est assez simple :

virsh migrate --live domain destinationURI

où l’URL est définie comme cela:

qemu://host/system # pour kvm
xen://host # pour xen

Par défaut, si on ne le précise, le transport d’une machine à l’autre se fait par TLS. J’utilise ssh, donc l’URI devient:

qemu+ssh://host/system

Je me lance.
Alors, sur ma machine at-at-3:

at-at-3:/sbufarm/vms# virsh list
Id Name State
----------------------------------
1 diodore running

Sur ma machine destination at-at-1:

at-at-1:/sbufarm/vms# virsh list
Id Name State
----------------------------------

Je tente un ping sur la machine

ping -i 0.2 diodore
PING 10.165.144.66 (10.165.144.66) 56(84) bytes of data.
64 bytes from 10.165.144.66: icmp_seq=1 ttl=63 time=0.357 ms
64 bytes from 10.165.144.66: icmp_seq=2 ttl=63 time=0.395 ms
64 bytes from 10.165.144.66: icmp_seq=3 ttl=63 time=0.358 ms
64 bytes from 10.165.144.66: icmp_seq=4 ttl=63 time=0.372 ms
64 bytes from 10.165.144.66: icmp_seq=5 ttl=63 time=0.351 ms
64 bytes from 10.165.144.66: icmp_seq=6 ttl=63 time=0.374 ms

que je laisse tourner.

Et eventually (tu parles, à mon avis, ce n’est que le début)

virsh migrate --live diodore qemu+ssh://at-at-1/system

Je surveille le ping

64 bytes from 10.165.144.66: icmp_seq=632 ttl=63 time=198 ms
64 bytes from 10.165.144.66: icmp_seq=633 ttl=63 time=199 ms
64 bytes from 10.165.144.66: icmp_seq=634 ttl=63 time=200 ms
64 bytes from 10.165.144.66: icmp_seq=635 ttl=63 time=200 ms
64 bytes from 10.165.144.66: icmp_seq=636 ttl=63 time=197 ms
64 bytes from 10.165.144.66: icmp_seq=637 ttl=63 time=198 ms
64 bytes from 10.165.144.66: icmp_seq=638 ttl=63 time=198 ms
64 bytes from 10.165.144.66: icmp_seq=639 ttl=63 time=200 ms
64 bytes from 10.165.144.66: icmp_seq=640 ttl=63 time=200 ms
64 bytes from 10.165.144.66: icmp_seq=641 ttl=63 time=197 ms
64 bytes from 10.165.144.66: icmp_seq=648 ttl=63 time=2.24 ms
64 bytes from 10.165.144.66: icmp_seq=649 ttl=63 time=0.399 ms
64 bytes from 10.165.144.66: icmp_seq=650 ttl=63 time=1.54 ms
64 bytes from 10.165.144.66: icmp_seq=651 ttl=63 time=0.388 ms
64 bytes from 10.165.144.66: icmp_seq=652 ttl=63 time=0.378 ms
64 bytes from 10.165.144.66: icmp_seq=653 ttl=63 time=3.29 ms
64 bytes from 10.165.144.66: icmp_seq=654 ttl=63 time=3.30 ms
64 bytes from 10.165.144.66: icmp_seq=655 ttl=63 time=1.85 ms

et voilà, c’est fait. On voit ici que le temps de réponse du ping augmente sensiblement, puis s’arrête une ou dexu secondes pour redémarrer sur l’autre machine.
Sur la machine de destination, on obtient:

at-at-1:/sbufarm/vms# virsh list
Id Name State
----------------------------------
1 diodore running

Sur ma machine source at-at-3:

at-at-3:/sbufarm/vms# virsh list
Id Name State
----------------------------------

ouaouh! ET BIEN NON, aucune satisfaction, puisque la machine ping, mais les accès aux disques ne fonctionnent pas.
La console indique les erreurs suivantes:

hda: task_pio_intr: status 0x41 {DriveReady Error}
hda: task_pio_intr: status 0x04 {DriveStatus Error}
hda: possibly failed opcode 0x39

La destruction de la vm et sa recréation (à partir du même fichier de disk) fonctionne parfaitement.

Voici aujourd’hui, l’état de mes investigations. Si quelqu’un a une idée, elle est bien venue!

Posted in admin, virtualization | Leave a comment

A l’heure du twitte…

A l’heure où l’information du soir efface l’information du matin, lire XXI est un vrai petit bonheur.
Qu’est-ce que XXI? Une revue, un trimestriel passionnant.
XXI se vend en librairie.
XXI prend le temps de dire, d’expliquer, de questionner.
XXI n’utilise aucune hypothèse simplificatrice.
XXI a une marque de fabrique journalistique basée sur le principe d’Albert Londres: « Je demeure convaincu qu’un journaliste n’est pas un enfant de chœur et que son rôle ne consiste pas à précéder les processions, la main plongée dans une corbeille de pétales de roses. Notre métier n’est pas de faire plaisir, non plus de faire du tort, il est de porter la plume dans la plaie.»

XXI est bien plus célèbre que ce modeste blog, mais j’avais envie de partager ma découverte.

Posted in presse | Leave a comment

Swedish Greys - a WordPress theme from Nordic Themepark.