2012-01-06 5 views
7

Кто-нибудь знает, как запустить рубиновый отладчик и SSL одновременно с Thin?Тонкая поддержка SSL и ruby-debug

Я успешно использовал Thin с Rails 3.0.10.

Я начинаю с rails server --debugger, и я могу отлаживать свой код.

Недавно мне также нужно было добавить поддержку SSL в мое приложение, и я бы хотел проверить его локально с помощью самозаверяющего сертификата.

К сожалению, я не нашел способ запустить Thin с поддержкой SSL при использовании rails server.

Я могу успешно начать Thin с поддержкой SSL с помощью:

thin start --ssl --ssl-verify --ssl-key-file ssllocal/server.key 
    --ssl-cert-file ssllocal/server.crt 

Однако я не нашел способ активировать отладчик, используя thin start.

Так что у меня есть выбор запуска отладчика (rails server) или SSL (thin start), но не оба.

Возможно, вы получите Webrick для запуска SSL с использованием rails server, изменив файл rails/script (see here). Я экспериментировал с этим подходом, но у меня не было успеха. Вот одна из попыток:

#!/usr/bin/env ruby 
# This command will automatically be run when you run "rails" with Rails 3 
# gems installed from the root of your application. 

APP_PATH = File.expand_path('../../config/application', __FILE__) 
require File.expand_path('../../config/boot', __FILE__) 


# THIS IS NEW: 
require "rails/commands/server" 
require 'rack' 
require 'thin' 
module Rails 
    class Server 
    def default_options 
     super.merge({ 
     :Port  => 3000, 
     :environment => (ENV['RAILS_ENV'] || "development").dup, 
     :daemonize => false, 
     :debugger => false, 
     :pid   => File.expand_path("tmp/pids/server.pid"), 
     :config  => File.expand_path("config.ru"), 
     :SSLEnable => true 
     :ssl => true, 
     "ssl-verify" => true, 
     "ssl-key-file" => File.expand_path("ssllocal/server.key"), 
     "ssl-cert-file" => File.expand_path("ssllocal/server.crt")  
     }) 
    end 
    end 
end 


require 'rails/commands' 

Примечание: для тех, кто может быть интересно, я создал «ssllocal» каталог с моего корневой директории приложения, и где хранить ключи SSL и сертификаты.

ответ

4

Вы можете попробовать просто потребовать отладчика самостоятельно в своей среде разработки.

В вашем Gemfile:

if RUBY_VERSION =~ /^1.9/ 
    gem "ruby-debug19", :group => :development 
else 
    gem "ruby-debug", :group => :development 
end 

И в конфигурации блока вашей конфигурации/сред/development.rb:

require 'ruby-debug' 
Debugger.start 

Это позволяет вам поместить заявление отладчика в любом месте вашего кода.

3

Вот мое решение - я взломал Thin TcpServer для загрузки моих самоподписанных сертификатов SSL только в среде разработки. Моя script/rails выглядит следующим образом:

#!/usr/bin/env ruby 
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. 

APP_PATH = File.expand_path('../../config/application', __FILE__) 
require File.expand_path('../../config/boot', __FILE__) 

# Hack our SSL certs into Thin TcpServer, only in development environment 
require 'thin' 
module Thin 
    module Backends 
    TcpServer.class_eval do 
     def initialize_with_SSL(host, port) 
     if Rails.env.development? 
      Rails.logger.info "Loading SSL certs from ./ssl_dev..." 
      @ssl = true 
      @ssl_options = { 
      :private_key_file => File.expand_path("../../ssl_dev/server.key", __FILE__), 
      :cert_chain_file => File.expand_path("../../ssl_dev/server.crt", __FILE__), 
      :verify_peer => nil 
      } 
     end 

     initialize_without_SSL(host, port) 
     end 

     alias_method :initialize_without_SSL, :initialize 
     alias_method :initialize, :initialize_with_SSL  
    end 
    end 
end 

# Must load 'rails/commands' after Thin SSL hack 
require 'rails/commands' 
0

я смог успешно получить отладку работы с SSL включен тонким, используя решение, предложенное Натаном. Хотя я должен был сделать одно небольшое изменение отложив инициализацию @ssl после вызова initialize_without_ssl (метод псевдонима Инициализировать оригинальный TCPServer в)

require 'thin' 
module Thin 
    module Backends 
    TcpServer.class_eval do 
     def initialize_with_SSL(host, port) 
     if Rails.env.development? 
      Rails.logger.info "Loading SSL certs from ./ssl_dev..." 
      @ssl_options = { 
      :private_key_file => File.expand_path("../../ssl_dev/server.key", __FILE__), 
      :cert_chain_file => File.expand_path("../../ssl_dev/server.crt", __FILE__), 
      :verify_peer => nil 
      } 
     end 

     initialize_without_SSL(host, port) 
     # @ssl initialized after calling the original initialize of TcpServer 
     @ssl = true if Rails.env.development? 

     end 

     alias_method :initialize_without_SSL, :initialize 
     alias_method :initialize, :initialize_with_SSL  
    end 
    end 
end 

    alias_method :initialize_without_SSL, :initialize 
    alias_method :initialize, :initialize_with_SSL  
end 

В приведенном выше коде snippett, @ssl устанавливаются истина после вызова первоначальный вызов инициализации Thin :: Backend :: TcpServer.Я должен был сделать это, так как TCPServer вызывает его родителя инициализации (Thin :: Backend: Base), которая устанавливает @ssl к нулю

#Base initialize method. Thin gem version 1.5.0 
    def initialize 
    @connections     = [] 
    @timeout      = Server::DEFAULT_TIMEOUT 
    @persistent_connection_count = 0 
    @maximum_connections   = Server::DEFAULT_MAXIMUM_CONNECTIONS 
    @maximum_persistent_connections = Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS 
    @no_epoll      = false 
    @ssl       = nil 
    @threaded      = nil 
    end 

Как отмечается в блоке кода Натана, все решение, как представляется, хак вокруг , На мой взгляд, я в порядке с фрагментом, считая, что код выполняется в контексте env.development, и, самое главное, он позволяет отлаживать с включенным ssl.

0

Вот как я получил его, наконец, работать на производстве с использованием Thin:

rvmsudo thin start -p 443 --ssl --ssl-key-file ssl/server.key --ssl-cert-file ssl/server.crt 

Если у вас возникли проблемы с ключевым файлом, убедитесь, что вы проверить CSR с помощью сайта, как:

https://ssl-tools.verisign.com 

Если ваш CSR терпит неудачу, то сертификат, который вы получаете от своего органа подписи, тоже не сработает. Мой сайт откажется загружать сертификаты SSL, только чтобы узнать, что я сократил свое имя штата до «TX» вместо «Texas» при создании своего личного ключа. Вот почему он не работал все время! Сертификаты SSL - это боль в заднице!