[Post abbreviato e aggiornato con una risposta.]
Ruby 1.9.3 compilato su OS X 10.7.4 con MacPorts si blocca nelle mie app Rails quando si utilizza SSL in http.rb, ad es. durante l'autenticazione su 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]
Nota: questa è una soluzione reale al problema segfault, non una soluzione try-my-favorite-alternative-ruby-installer-du-jour. Non volevo modificare metà del mio sistema su una mezza dozzina di macchine di sviluppo e produzione installando RVM, rbenv, Homebrew o qualsiasi altra cosa. Voglio anche mostrare come ho trovato il problema poiché questo può verificarsi con qualsiasi programma di installazione di Ruby.
Alcune cose che ho notato per tentativi ed errori:
- Compilare OpenSSL e Ruby usando
--with-openssl-dir=/usr
o..=/opt/local
non ha aiutato. - Dopo aver ricompilato Ruby 1.9 usando / opt / local come openssl-dir, oltre che in numerosi altri post sul Web , potrei eseguire collegamenti basati su SSL dalla riga di comando. Tuttavia, SSL collega nei miei progetti Rails stavano ancora andando in crash.
- Il crash backtrace che OS X salva in
/Library/Logs/CrashReporter
contiene tracce dilibssl.1.0.0.dylib
(MacPorts) elibssl.0.9.8.dylib
(OS X). Ma tutti i miei file MacPorts erano collegati a OpenSSL 1.0.x. (find /opt/local -iname "*.dylib" | xargs otool -L
è tuo amico!) - Questo si è verificato solo sulle mie app live. Non su nuove app vergini.
- Questo si è verificato solo quando si utilizzava la gemma Postgres
pg
che contiene estensioni native.
Guardando il pacchetto della gemma 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 gemma PG non si collega al libpq
di MacPorts! E:
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)
(...)
... i libpq di OSX (ovviamente!) si collegano ai libssl
e libcrypto
di OS X. Bingo!
Soluzione: RTFM! README-OS_X di PG dice:
If you need a custom installation of PostgreSQL, you should ensure that you either compile it against the same version of OpenSSL as the OpenSSL extension of the Ruby you'll be using, or compile it without SSL support. If you fail to do this, you will likely see segfaults ...
sudo gem install pg -- --with-pg-config=/opt/local/lib/postgresql83/bin/pg_config
Bingo, problema risolto.
$ 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>
Se il tuo bundle non fa riferimento alla versione più recente di pg gem, dovrai specificare la versione quando si reinstalla, ad es.
gem install pg -v 0.13.2 -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config