Тонкий с поддержкой SSL и ruby-debug - PullRequest
7 голосов
/ 06 января 2012

Кто-нибудь знает способ запуска отладчика ruby ​​и SSL одновременно с Thin?

Я успешно использую 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 ( см. Здесь ). Я экспериментировал с этим подходом, но у меня не было успеха. Вот одна из попыток:

#!/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 ]

4 голосов
/ 23 января 2012

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

В вашем Gemfile:

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

И в блоке config вашего config / environment / development.rb:

require 'ruby-debug'
Debugger.start

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

3 голосов
/ 26 июля 2012

Вот мое решение - я взломал 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 голосов
/ 06 августа 2013

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

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

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

https://ssl-tools.verisign.com

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

0 голосов
/ 04 мая 2013

Мне удалось успешно запустить отладку с поддержкой ssl thin, используя решение, предложенное Натаном.Хотя мне пришлось сделать одно небольшое изменение отложенной инициализации @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

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

  #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.

...