Thin with SSL support and ruby-debug

后端 未结 4 459
梦如初夏
梦如初夏 2020-12-17 00:04

Does anyone know of a way to run the ruby debugger and SSL at the same time with Thin?

I\'ve been using Thin successfully with Rails 3.0.10.

I start it using

相关标签:
4条回答
  • 2020-12-17 00:33

    Here's how I got it to finally work on production using Thin:

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

    If you are having issues with your KEY file, make sure you validate the CSR by using a site like:

    https://ssl-tools.verisign.com
    

    If your CSR fails, then the certificate you receive from your signing authority will fail too. My site would refuse to load with the SSL certs, only to find out that I abbreviated my State name to "TX" instead of "Texas" while creating my private key. That was the reason it wasn't working all along! SSL certs are a pain in the ass!

    0 讨论(0)
  • 2020-12-17 00:36

    Here's my solution - I hacked the Thin TcpServer to load my self-signed SSL certs, only in the development environment. My script/rails looks like this:

    #!/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 讨论(0)
  • 2020-12-17 00:46

    You could try just requiring the debugger yourself in your development environment.

    In your Gemfile:

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

    And within the config block of your config/environments/development.rb:

    require 'ruby-debug'
    Debugger.start
    

    This permits you to place the debugger statement anywhere in your code.

    0 讨论(0)
  • 2020-12-17 00:51

    I was able to successfully get the debugging working with ssl enabled thin, using the solution suggested by nathan. Though I had to do one small change of deferring initialization of @ssl after the call of initialize_without_ssl (an alias method for the original TcpServer's initialize)

    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
    

    In the above code snippett, @ssl is set to true after calling the original initialize call of Thin::Backend::TcpServer. I had to do this since the TcpServer invokes its parent's initialize (Thin::Backend:Base) that sets the @ssl to 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
    

    As noted in nathan's code block, the whole solution appears to be a hack around. In my opinion, I am fine with the snippet considering the code is done within the context of env.development and most importantly it allows debugging with ssl enabled.

    0 讨论(0)
提交回复
热议问题