2012-01-06 15 views
7

Czy ktoś wie jak uruchomić debuggera ruby ​​i SSL w tym samym czasie z Thin?Cienki z obsługą SSL i debugowaniem ruby ​​

Używam Thin pomyślnie z Rails 3.0.10.

Uruchamiam go przy użyciu rails server --debugger i mogę debugować mój kod.

Niedawno musiałem też dodać obsługę SSL do mojej aplikacji i chciałbym móc ją przetestować lokalnie z samopodpisanym certyfikatem.

Niestety, nie znalazłem sposobu na uruchomienie Thin z obsługą SSL przy korzystaniu z rails server.

mogę z powodzeniem rozpocząć Cienkie z obsługą SSL za pomocą:

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

Jednak nie znaleźli sposób, aby uaktywnić debugger używając thin start.

Wygląda na to, że mam możliwość uruchomienia debuggera (rails server) lub SSL (thin start), ale nie obu.

Wygląda na to, że Webrick może uruchomić SSL, używając rails server, modyfikując plik szyny/skryptu (see here). Eksperymentowałem z tym podejściem, ale nie odniosłem sukcesu. Oto jedna z prób:

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

Uwaga: dla tych, którzy mogą się zastanawiać, stworzyłem „ssllocal” Katalog z mojego katalogu aplikacji korzeń, i tam przechowywać kluczy SSL oraz certyfikatów.

Odpowiedz

4

Możesz spróbować samodzielnie wymagać debuggera w swoim środowisku programistycznym.

W swojej Gemfile:

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

A w bloku konfiguracyjnym swojej config/środowiskach/development.rb:

require 'ruby-debug' 
Debugger.start 

ta pozwala na umieszczenie oświadczenia debugger nigdzie w kodzie.

3

Oto moje rozwiązanie - zhakowałem serwer Thin TcpServer, aby załadować certyfikaty SSL z podpisem własnym, tylko w środowisku programistycznym. Moja script/rails wygląda następująco:

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

udało mi się z powodzeniem uzyskać debugowanie pracy z włączonym protokołem SSL cienkie, stosując rozwiązania proponowane przez Nathana. Choć miałem zrobić jedną małą zmianę odroczenie inicjalizacji @ssl po wezwaniu initialize_without_ssl (metoda alias zainicjować oryginalnego tcpserver'S)

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 

w powyższym kodzie snippett, @ssl jest ustawiony na true, po wywołaniu oryginalne wywołanie inicjujące Thin :: Backend :: TcpServer.Musiałem to zrobić, ponieważ tcpserver wywołuje jego rodzica initialize (Thin :: Backend: Base), który ustawia @ssl do zera

#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 

Jak zauważono w kodzie bloku Nathana, całe rozwiązanie wydaje się być hack wokół . Moim zdaniem, mam się dobrze z fragmentem, biorąc pod uwagę, że kod jest wykonywany w kontekście env.development i co najważniejsze pozwala na debugowanie z włączonym ssl.

0

Oto jak mam to na końcu pracy na produkcji przy użyciu Cienki:

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

Jeśli masz problemy z plikiem klucza, upewnij się potwierdzić CSR za pomocą witryny jak:

https://ssl-tools.verisign.com 

Jeśli CSR nie powiedzie się, to certyfikat, który otrzymasz od swojego organu podpisującego, również zawiedzie. Moja witryna odmówiłaby załadowania certyfikatów SSL, a jedynie po to, aby skrócić nazwę mojego stanu do "TX" zamiast "Texas" podczas tworzenia mojego klucza prywatnego. To był powód, dla którego nie działał cały czas! Certyfikaty SSL to ból w dupie!