[Bài viết rút ngắn và cập nhật với một câu trả lời.]
Ruby 1.9.3 được biên dịch trên OS X 10.7.4 với MacPorts gặp sự cố trong ứng dụng Rails của tôi khi sử dụng SSL trong http.rb, ví dụ: khi xác thực với 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]
Lưu ý: Đây là một giải pháp thực sự cho vấn đề segfault, không phải là giải pháp thử-yêu thích-thay thế-ruby-cài đặt-du-jour. Tôi không muốn sửa đổi một nửa hệ thống của mình trên nửa tá máy phát và sản xuất bằng cách cài đặt RVM, rbenv, Homebrew hoặc bất cứ thứ gì khác. Tôi cũng muốn chỉ ra cách tôi tìm thấy sự cố vì điều này có thể xảy ra với bất kỳ trình cài đặt Ruby nào.
Một số điều tôi lưu ý khi dùng thử và lỗi:
- Biên dịch OpenSSL và Ruby bằng cách sử dụng
--with-openssl-dir=/usr
hoặc là..=/opt/local
đã không giúp được gì. - Sau khi biên dịch lại Ruby 1.9 bằng cách sử dụng / opt / local dưới dạng openssl-dir, ngoài nhiều thứ khác bài đăng trên web , Tôi có thể chạy kết nối SSL dựa trên dòng lệnh tốt. Tuy nhiên, SSL kết nối trong các dự án Rails của tôi vẫn bị rơi.
- Backtrace mà OS X lưu trong
/Library/Logs/CrashReporter
dấu vết củalibssl.1.0.0.dylib
(Cổng thông tin) vàlibssl.0.9.8.dylib
(HĐH X). Nhưng tất cả các tệp MacPorts của tôi được liên kết với OpenSSL 1.0.x. (find /opt/local -iname "*.dylib" | xargs otool -L
là bạn của bạn!) - Điều này chỉ xảy ra trên các ứng dụng trực tiếp của tôi. Không phải trên ứng dụng mới trinh tiết.
- Điều này chỉ xảy ra khi sử dụng
pg
Đá quý Postgres có chứa phần mở rộng bản địa.
Nhìn vào gói của PG gem:
$ 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)
Đá quý PG không liên kết với MacPorts libpq
! Và:
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)
(...)
... libpq của OSX (tất nhiên!) Liên kết với OS X libssl
và libcrypto
. Chơi lô tô!
Giải pháp: RTFM! README-OS_X của PG nói:
Nếu bạn cần cài đặt tùy chỉnh PostgreSQL, bạn nên đảm bảo rằng bạn biên dịch nó theo cùng phiên bản OpenSSL như phần mở rộng OpenSSL của Ruby mà bạn sẽ sử dụng hoặc biên dịch nó mà không cần hỗ trợ SSL. Nếu bạn không làm điều này, bạn có thể sẽ thấy segfaults ...
Vì thế:
sudo gem install pg -- --with-pg-config=/opt/local/lib/postgresql83/bin/pg_config
Bingo, vấn đề được giải quyết.
$ 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>
Nếu gói của bạn không tham chiếu phiên bản đá quý pg mới nhất hiện tại, thì bạn sẽ cần chỉ định phiên bản khi cài đặt lại, ví dụ:
gem install pg -v 0.13.2 -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config