Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/html/wp-includes/post-template.php on line 284

Rails : Installer la gem pg sous Debian Squeeze

L’installation d’un serveur PostgreSQL 9.1 en collaboration avec Rails a toujours été ma bête noire. En effet, je fais toujours face à au moins un problème… Ce doit être une malédiction…

Après tous ces déboires, j’en profite pour en partager quelques uns en compagnie de leur solution, en espérant pouvoir vous faire gagner du temps.

1. Autorisations d’accès à distance au serveur de base de données

L’un de mes premiers problèmes a été d’accéder depuis mon poste de travail à la base de données de développement, qui ne sont pas les mêmes machines, mais qui sont présents au sein du même réseau (réel ou virtuel).

PostgreSql gère ses autorisations d’accès réseau à l’aide d’un fichier nommé « pg_hba.conf ». Dans ce document, chaque ligne contient des autorisations en fonctions de la base de données, de l’utilisateur, et de l’adresse IP. Une logique y est associée permettant d’accepter ou de rejeter une connexion.

Par exemple, pour autoriser toutes les adresses IP du type 192.168.1.* pour toutes les bases de données, pour tous les utilisateurs, la ligne ressemblera à :

[sourcecode language= »text »]host all all 192.168.1.0/24 trust[/sourcecode]

Il ne faudra pas oublier non plus de modifier le fichier postgresql.conf pour indiquer au serveur d’écouter d’autres adresses que la boucle local (127.0.0.1). Il faudra donc remplacer :

[sourcecode language= »text »]listen_addresses = ‘localhost'[/sourcecode]

par :

[sourcecode language= »text »]listen_addresses = ‘*'[/sourcecode]

2. Installation de la gem pg pour Ruby

Plus récemment, mon problème fut lié à l’installation de notre petite gem « pg », à l’aide de la commande :

[sourcecode language= »bash »]gem install pg[/sourcecode]

Malheureusement, la commande échouait avec une belle erreur, très compréhensible :

[sourcecode language= »text »]Building native extensions. This could take a while…
ERROR: Error installing pg:
ERROR: Failed to build gem native extension.

/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb

checking for pg_config… yes

Using config values from /usr/bin/pg_config

checking for libpq-fe.h… yes

checking for libpq/libpq-fs.h… yes

checking for pg_config_manual.h… yes

checking for PQconnectdb() in -lpq… no

checking for PQconnectdb() in -llibpq… no

checking for PQconnectdb() in -lms/libpq… no

Can’t find the PostgreSQL client library (libpq)

*** extconf.rb failed ***

Could not create Makefile due to some reason, probably lack of

necessary libraries and/or headers. Check the mkmf.log file for more

details. You may need configuration options.

Provided configuration options:

–with-opt-dir

–with-opt-include

–without-opt-include=${opt-dir}/include

–with-opt-lib

–without-opt-lib=${opt-dir}/lib

–with-make-prog

–without-make-prog

–srcdir=.

–curdir

–ruby=/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby

–with-pg

–without-pg

–with-pg-dir

–without-pg-dir

–with-pg-include

–without-pg-include=${pg-dir}/include

–with-pg-lib

–without-pg-lib=${pg-dir}/lib

–with-pg-config

–without-pg-config

–with-pg_config

–without-pg_config

–with-pqlib

–without-pqlib

–with-libpqlib

–without-libpqlib

–with-ms/libpqlib

–without-ms/libpqlib

Gem files will remain installed in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/pg-0.14.0 for inspection.

Results logged to /usr/local/rvm/gems/ruby-1.9.3-p194/gems/pg-0.14.0/ext/gem_make.out[/sourcecode]

En regardant de plus près dans le log de la compilation présent dans le fichier « /usr/local/rvm/gems/ruby-1.9.3-p194/gems/pg-0.14.0/ext/mkmf.log » pour mon serveur, il s’avère que l’ensemble des erreurs concernent la librairie OpenSSL.

En vérifiant, la librairie SSL était bien installée, pg_config m’affichait bien sa dépendance à cette même lin, et RVM avait bien importé son package ssl. Voici un résumé des commandes permettant respectivement de vérifier ces points :

a. la librairie de Postgresql

[sourcecode language= »bash »]pg_config –libs[/sourcecode]

doit afficher « -lssl »

[sourcecode language= »text »]-lpgport -lxslt -lxml2 -lpam -lssl -lcrypto -lkrb5 -lcom_err -lgssapi_krb5 -lz -ledit -lcrypt -ldl -lm[/sourcecode]

b. la librairie système

[sourcecode language= »bash »]aptitude search libssl[/sourcecode]

doit afficher le flag « i » pour « installé »

[sourcecode language= »text »]i libssl-dev – SSL development libraries, header files and documentation
i libssl0.9.8 – SSL shared libraries[/sourcecode]

c. le package RVM

[sourcecode language= »bash »]ls /usr/local/rvm/usr/lib/[/sourcecode]

doit afficher par exemple :

[sourcecode language= »text »]engines libcrypto.so libssl.a libssl.so.0.9.8 libyaml-0.so.2.0.2 libyaml.la libz.a libz.so.1 pkgconfig
libcrypto.a libcrypto.so.0.9.8 libssl.so libyaml-0.so.2 libyaml.a libyaml.so libz.so libz.so.1.2.7[/sourcecode]

En fait, le problème vient de RVM. Pour préparer mon serveur, j’avais installé Ruby 1.9.3 via RVM. Toujours très pratique, il a une facheuse tendance à compiler certaines librairies dans des dossiers que l’utilitaire gem ne connaît pas. La solution est donc de déplacer de dossier, ou mieux, de faire pointer un lien symbolique de l’un vers l’autre. Ainsi pour Debian Squeeze (6.0), les commandes sont :

[sourcecode language= »bash »]aptitude install postgresql-9.1 libpq5 postgresql-server-dev-9.1
mv /usr/local/rvm/usr/lib/ /usr/local/rvm/usr/lib_rvm
gem install pg[/sourcecode]

Sachant que la commande

[sourcecode language= »bash »]mv /usr/local/rvm/usr/lib/ /usr/local/rvm/usr/lib_rvm[/sourcecode]

doit pouvoir se remplacer par

[sourcecode language= »bash »]ln -s /usr/local/rvm/usr/lib/ /usr/local/rvm/usr/lib_rvm[/sourcecode]

En espérant que cela pourra aider les âmes errantes, n’hésitez pas à me faire vos remarques !

Vous aimerez aussi...

Laisser un commentaire

%d blogueurs aiment cette page :