[Publicación abreviada y actualizada con una respuesta.]
Ruby 1.9.3 compilado en OS X 10.7.4 con MacPorts se bloquea en mis aplicaciones Rails cuando uso SSL en http.rb, por ejemplo. al autenticar en 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: esta es una solución real para el problema de segfault, no una solución try-my-favorite-alternative-ruby-installer-du-jour. No quería modificar la mitad de mi Sistema en media docena de máquinas de desarrollo y producción instalando RVM, rbenv, Homebrew o cualquier otra cosa. También quiero mostrar cómo encontré el problema, ya que esto puede ocurrir con cualquier instalador de Ruby.
Algunas cosas que noté por prueba y error:
- Compilar OpenSSL y Ruby utilizando
--with-openssl-dir=/usr
o..=/opt/local
no ayudó. - Después de volver a compilar Ruby 1.9 utilizando / opt / local como openssl-dir, aparte de muchos otros publicaciones en la web , podría ejecutar conexiones basadas en SSL desde la multa de la línea de comandos. Sin embargo, SSL se conecta en mis proyectos de Rails y seguían fallando.
- El rastreo de retroceso que OS X guarda en
/Library/Logs/CrashReporter
contenía trazas delibssl.1.0.0.dylib
(MacPorts) ylibssl.0.9.8.dylib
(OS X). Pero todos mis archivos MacPorts fueron vinculados contra OpenSSL 1.0.x. (find /opt/local -iname "*.dylib" | xargs otool -L
es tu amigo!) - Esto ocurrió solo en mis aplicaciones en vivo. No en aplicaciones nuevas y vírgenes.
- Esto ocurrió solo al usar la gema
pg
Postgres que contiene extensiones nativas.
Mirando el paquete de la gema 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 gema PG no se enlaza con libpq
de MacPorts! Y:
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)
(...)
... Los libpq de OSX (¡por supuesto!) se vinculan con libssl
y libcrypto
de OS X. Bingo!
Solución: RTFM! README-OS_X de PG dice:
Si necesita una instalación personalizada de PostgreSQL, debe asegurarse de compilarla con la misma versión de OpenSSL que la extensión OpenSSL de Ruby que usará, o compilarla sin soporte SSL. Si no lo haces, es probable que veas segfaults ...
Entonces:
sudo gem install pg -- --with-pg-config=/opt/local/lib/postgresql83/bin/pg_config
Bingo, problema resuelto.
$ 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 su paquete no hace referencia a la última versión de pg gem actual, deberá especificar la versión al reinstalar, por ejemplo,
gem install pg -v 0.13.2 -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config