2012-09-24 18 views
7

Tôi đã có một ứng dụng thử nghiệm rất cơ bản. Khi tôi thực hiện lệnh này, máy chủ bỏ qua cổng mà tôi chỉ định và chạy Thin trên cổng 4567. Tại sao cổng tôi chỉ định bị bỏ qua?Làm thế nào để chạy Thin trên một cổng khác?

$ruby xxx.rb start -p 8000 

== Sinatra/1.3.3 has taken the stage on 4567 for production with backup from Thin 
>> Thin web server (v1.4.1 codename Chromeo) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:4567, CTRL+C to stop 

tập tin xxx.rb

require 'Thin' 

rackup_file = "config.ru" 

argv = ARGV 
argv << ["-R", rackup_file ] unless ARGV.include?("-R") 
argv << ["-e", "production"] unless ARGV.include?("-e") 

puts argv.flatten 

Thin::Runner.new(argv.flatten).run! 

tập tin config.ru

require 'sinatra' 
require 'sinatra/base' 

class SingingRain < Sinatra::Base 
    get '/' do 
     return 'hello' 
    end 
end 

SingingRain.run! 

Trả lời

14

Vấn đề của bạn là với dòng:

SingingRain.run! 

Đây là Sinatra của run method, mà nói với Sinatra để khởi động máy chủ web riêng của mình chạy trên cổng 4567 theo mặc định. Đây là tệp config.ru của bạn, nhưng config.ru chỉ là Ruby, vì vậy dòng này được chạy như thể nó nằm trong bất kỳ tệp nào khác .rb. Đây là lý do tại sao bạn thấy Sinatra bắt đầu trên cổng đó.

Khi bạn dừng máy chủ này bằng CTRL-C, Thin sẽ cố gắng tiếp tục tải tệp config.ru để xác định ứng dụng nào sẽ chạy. Bạn không thực sự xác định một ứng dụng trong config.ru bạn, do đó bạn sẽ thấy một cái gì đó như:

^C>> Stopping ... 

== Sinatra has ended his set (crowd applauds) 
/Users/matt/.rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/builder.rb:129:in `to_app': missing run or map statement (RuntimeError) 
     from config.ru:1:in `<main>' 
     ... 

Lỗi này chỉ đơn giản là thông báo rằng bạn không thực sự chỉ định một ứng dụng để chạy trong tập tin cấu hình của bạn.

Thay vì SingingRain.run!, sử dụng:

run SingingRain 

run là một phương pháp rack đó quy định cụ thể mà ứng dụng để chạy. Bạn cũng có thể làm run SingingRain.new - Sinatra thực hiện các bước để cho phép bạn sử dụng chính lớp đó ở đây hoặc một cá thể.

Sản lượng này nên bây giờ chỉ là:

>> Thin web server (v1.4.1 codename Chromeo) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:8000, CTRL+C to stop 

Bạn không nhận được thông báo == Sinatra/1.3.2 has taken the stage on 4567 for production with backup from Thin vì Sinatra không chạy nó được xây dựng trong máy chủ, nó chỉ là máy chủ Thin của bạn khi bạn cấu hình nó.

+0

Nó thực sự khó khăn đôi khi để có được câu trả lời tốt như của bạn. Cảm ơn bạn một thế giới :) – Roman

+0

Câu trả lời của bạn đã làm việc cho tôi nhưng tôi có một câu hỏi khác.Bây giờ khi tôi chạy lệnh '$ ruby ​​thinx.rb start -d', tôi nhận được hai kết quả đầu ra' exit' mặc dù máy chủ khởi động đúng. Bạn có biết đó là gì không? – Roman

+0

@Arman xin lỗi, tôi không biết điều gì đang xảy ra với hai kết quả đầu ra của bạn - điều đó không xảy ra với tôi. – matt

-3

trong config.ru bạn thêm

thiết lập: cổng => 8000

Ngoài ra tôi rất muốn đề nghị sử dụng Sinatra với một cái gì đó như hành khách + nginx mà làm cho triển khai để sản xuất một cách dễ dàng. Nhưng bạn không cần phải lo lắng về điều này nếu bạn đang đi để triển khai để heroku.

+0

Không Thin: constructor Runner đặc biệt phân tích đối số dòng lệnh như tài liệu ở đây? https://github.com/macournoyer/thin/blob/master/lib/thin/runner.rb – Roman

+0

có vẻ như nó nhưng iam không thực sự chắc chắn như thế nào mà hoạt động ra khi u đang sử dụng một tập tin config.ru. Nếu bạn đã không tạo ra một tập tin config.ru và nó chỉ là .rb mỏng chấp nhận tham số -p – djd

16
#\ -p 8000 

đặt này ở phía trên cùng của config.ru

+0

Điều này làm việc cho tôi bằng cách sử dụng sinatra/shotgun/webrick – scaraveos

+0

tuyệt vời. Cảm ơn – kakubei

+0

Điều này làm việc cho Sinatra/Thin bằng cách chạy lệnh "rackup". Hoàn hảo! – chrisallick