2012-01-31 95 views
2

我想要一個運行sinatra應用程序到聽兩個端口 80和4567?Sinatra可以聽多個端口嗎?

這是可能的

  • 在Windows XP
  • 使用Ruby只
  • 只運行一個我西納特拉應用的實例?
+0

出於好奇,你有什麼用途呢? – Phrogz 2012-02-01 19:12:54

+0

我使用標準4567端口開發了整個應用程序。這只是我自己的一個工具,但現在我會爲其他人「釋放」它,所以我認爲使用標準端口80會更好。然後,我認爲如果我可以在兩個端口上運行它,它會很好。看起來我只會去80。 – Radek 2012-02-01 23:25:59

回答

3

當然可以。這就是所謂的端口轉發。您在端口80上運行您的應用程序,並將端口4567轉發到80.這樣您就可以擁有兩個端口。或者,您可以通過其他方式運行本地應用程序,並將受保護的端口80轉發到您的4567端口。這是多數託管服務運行其客戶端應用程序的順便說一句。

+0

是的,iptables在* nixes上做它。它看起來很難,這並不困難,但仍然... – three 2012-02-01 19:11:57

+0

我可以在Windows上這樣做嗎?我可以只使用'ruby解決方案'嗎? – Radek 2012-02-01 23:06:44

+1

@Radek - Google發現[this utility](http://www.quantumg.net/portforward.php)。我沒有看到用於控制Windows上的Windows設置的任何Ruby方法(儘管如果您可以找到命令行解決方案,當然可以使用Ruby反引號來調用該方法)。 – Phrogz 2012-02-01 23:12:22

2

你可以啓動應用程序的兩個不同的副本,共享同一個數據庫:

ruby myapp.rb -p 80 & 
ruby myapp.rb -p 4567 & 

這將在兩個單獨的Ruby運行過程,這可能會或可能不會導致問題(取決於您是否在過程中存儲任何信息)。然而,默認的基於cookie的會話甚至可以跨流程的工作:

require 'sinatra' 

enable :sessions 
get '/in/:msg' do 
    session[:msg] = params[:msg] 
    "I stored #{session[:msg]}" 
end 

get '/out' do 
    "Here you go: #{session[:msg]}" 
end 

在行動:

phrogz$ ruby sessions.rb -p 3000 & 
[1] 58698 

phrogz$ ruby sessions.rb -p 3001 & 
[1] 58699 

phrogz$ curl -b cookies.txt -c cookies.txt http://localhost:3000/in/foo 
I stored foo 

phrogz$ curl -b cookies.txt -c cookies.txt http://localhost:3000/out 
Here you go: foo 

phrogz$ curl -b cookies.txt -c cookies.txt http://localhost:3001/out 
Here you go: foo 
+0

我不使用db。只有rb代碼。我可以在同一應用程序的兩個實例之間共享變量嗎?如果我想確保一次只執行一次,我需要知道它正在運行...... – Radek 2012-02-01 23:11:26

+0

@Radek我不完全理解你的要求。 – Phrogz 2012-02-02 01:46:34

+0

我使用我的sinatra應用程序來運行需要很長時間才能完成的測試自動化腳本。我需要確保如果一個sinatra實例開始測試,另一個測試腳本將不會再次啓動。我可以在Sinatra之外使用這些信息嗎?只是在記憶中? – Radek 2012-02-02 01:49:43