[Post abrégé et mis à jour avec une réponse].
Ruby 1.9.3 compilé sur OS X 10.7.4 avec MacPorts plante dans mes applications Rails lorsque j'utilise SSL dans http.rb, par exemple lors de l'authentification sur Facebook :
(facebook) Callback phase initiated.
/opt/local/lib/ruby1.9/1.9.1/net/http.rb:799: [BUG] Segmentation fault
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11]
Remarque : il s'agit d'une véritable solution au problème de segfault, et non d'une solution de type "try-my-favorite-alternative-ruby-installer-du-jour". Je ne voulais pas modifier la moitié de mon système sur une demi-douzaine de machines devel et de production en installant RVM, rbenv, Homebrew ou autre. Je veux aussi montrer comment j'ai trouvé le problème car cela peut se produire avec n'importe quel installateur de Ruby.
J'ai appris certaines choses par essais et erreurs :
- Compiler OpenSSL et Ruby en utilisant
--with-openssl-dir=/usr
o..=/opt/local
n'a pas aidé. - Après avoir recompilé Ruby 1.9 en utilisant /opt/local comme répertoire openssl, à part dans de nombreux autres cas, il n'y a pas eu d'amélioration. messages sur le web J'ai pu établir des connexions SSL à partir de la ligne de commande. Cependant, les connexions SSL dans mes projets Rails s'écrasaient toujours.
- Le backtrace de crash que OS X enregistre dans
/Library/Logs/CrashReporter
contenait des traces delibssl.1.0.0.dylib
(MacPorts) ylibssl.0.9.8.dylib
(OS X). Mais tous mes fichiers MacPorts étaient liés à OpenSSL 1.0.x. (find /opt/local -iname "*.dylib" | xargs otool -L
est votre ami) - Cela ne s'est produit que sur mes applications en direct. Pas sur les nouvelles applications vierges.
- Cela ne s'est produit que lors de l'utilisation de la
pg
Gemme Postgres qui contient des extensions natives.
Je regarde le paquet de la gemme PG :
$ otool -L /opt/local/lib/ruby1.9/gems/1.9.1/gems/pg-0.14.1/lib/pg_ext.bundle
/opt/local/lib/ruby1.9/gems/1.9.1/gems/pg-0.14.1/lib/pg_ext.bundle:
/opt/local/lib/libruby.1.9.1.dylib (compatibility version 1.9.1, current version 1.9.1)
/usr/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.3.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
La gemme PG n'est pas liée à la gemme MacPorts libpq
! Et :
Jens ~/Sites/testapp$ otool -L /usr/lib/libpq.5.dylib
/usr/lib/libpq.5.dylib:
/usr/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.3.0)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 44.0.0)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 44.0.0)
(...)
... La libpq d'OSX (bien sûr !) est liée à la libpq d'OS X. libssl
y libcrypto
. Bingo !
Solution : RTFM ! Le README-OS_X de PG dit :
Si vous avez besoin d'une installation personnalisée de PostgreSQL, vous devez vous assurer de le compiler avec la même version d'OpenSSL que l'extension OpenSSL du Ruby que vous utiliserez, ou de le compiler sans le support SSL. Si vous ne le faites pas, vous verrez probablement des erreurs de segmentation ...
Donc :
sudo gem install pg -- --with-pg-config=/opt/local/lib/postgresql83/bin/pg_config
Bingo, problème résolu.
$ bundle exec rails runner "require 'net/http'; require 'net/https'; h=Net::HTTP.new('gmail.com', 443); h.use_ssl=true; puts h.get('/');"
#<Net::HTTPMovedPermanently:0x007fe48d5590a0>
Si votre paquet ne fait pas référence à la dernière version de la gemme pg, vous devrez spécifier la version lors de la réinstallation, par ex.
gem install pg -v 0.13.2 -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config