2012-01-06 14 views
7

¿Alguien sabe de una forma de ejecutar Ruby Debugger y SSL al mismo tiempo con Thin?Thin con soporte SSL y ruby-debug

He estado utilizando Thin con éxito con Rails 3.0.10.

Lo inicio utilizando rails server --debugger, y puedo depurar mi código.

Recientemente, también he necesitado agregar soporte SSL a mi aplicación, y me gustaría poder probarlo localmente con un certificado autofirmado.

Lamentablemente, no he encontrado la manera de iniciar Thin con soporte SSL al usar rails server.

puedo iniciar correctamente fina con soporte SSL mediante el uso de:

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

Sin embargo, no he encontrado una manera de activar el depurador utilizando thin start.

Parece que tengo la opción de ejecutar el depurador (rails server) o SSL (thin start), pero no ambos.

Parece posible hacer que Webrick ejecute SSL usando rails server modificando el archivo de guías/guiones (see here). Experimenté con este enfoque, pero no he tenido éxito. Aquí está uno de los intentos:

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

Nota: para aquellos que podrían estar preguntándose, he creado un directorio 'ssllocal' fuera de mi directorio raíz de la aplicación, y ahí es donde guardo las llaves SSL y los CERT.

Respuesta

4

Puede intentar simplemente requerir el depurador en su entorno de desarrollo.

En su Gemfile:

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

Y dentro del bloque de configuración de tu config/ambientes/development.rb:

require 'ruby-debug' 
Debugger.start 

Esto le permite colocar la declaración depurador cualquier parte del código.

3

Aquí está mi solución: pirateé Thin TcpServer para cargar mis certificados SSL autofirmados, solo en el entorno de desarrollo. Mi script/rails se parece a esto:

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

que era capaz de conseguir con éxito la depuración trabajar con SSL activado fina, utilizando la solución sugerida por Nathan. A pesar de que tenía que hacer un pequeño cambio de diferir la inicialización de @ssl después de la llamada de initialize_without_ssl (un método de alias para inicialización del tcpserver originales)

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 

En el snippett código anterior, @ssl se establece en true después de llamar la llamada de inicialización original de Thin :: Backend :: TcpServer.Tenía que hacer esto ya que el tcpserver invoca inicialización de su matriz (Thin :: Backend: Base) que establece el @ssl a cero

#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 

Como se señaló en el bloque de código de Nathan, toda la solución parece ser un corte alrededor . En mi opinión, estoy de acuerdo con el fragmento de código considerando que el código se realiza dentro del contexto de env.development y lo más importante es que permite la depuración con ssl habilitado.

0

Así es como llegué a trabajar finalmente en la producción usando fina:

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

Si está teniendo problemas con su archivo de clave, asegúrese de validar la RSE mediante el uso de un sitio como:

https://ssl-tools.verisign.com 

Si falla su CSR, también fallará el certificado que reciba de su autoridad de firma. Mi sitio se rehusaría a cargar con los certificados SSL, solo para descubrir que he abreviado mi nombre de estado como "TX" en lugar de "Texas" mientras creo mi clave privada. ¡Esa fue la razón por la que no estuvo funcionando todo el tiempo! ¡Los certificados SSL son un dolor en el culo!