2013-03-04 486 views
0

我正在運行一個應用程序,它接受來自GPS記錄器的數據,通過SMS,HTTP或TCP發送此數據。我使用HTTP連接傳輸數據,這很容易通過我的Rails應用程序上的GET請求來接收。在Nginx上轉發TCP連接到HTTP

爲了省電的目的,我們改變了連接到TCP純nginx的和不接受,現在這些請求:

從nginx的的的access.log:

HTTP:

xx.xx.xx.xxx - - [03/Mar/2013:20:17:45 -0500] "GET /?imei=123456789&rmc=$GPRMC,035106.000,A,4145.1451,N,08506.8784,W,1.56,176.49,010213,,*13,3656mV,AUTO HTTP/1.1" 302 247 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22" 

TCP :

xx.xx.xx.xxx - - [03/Mar/2013:18:31:22 -0500] "imei=123456789&rmc=$GPRMC,233012.000,A,4221.6614,N,07106.1014,W,17.25,218.94,030313,,*21,4102mV,AUTO,310,260,ADB7,13EF,057,310,260,0000,0000,044,310,260,0000,0000,055,310,260,0000,0000,05A,310,260,0000,0000,059,310,260,0000,0000,05E,0,0,0000,0000,000,2" 400 172 "-" "-" 

有誰知道一種方法來過濾這些TCP請求在Nginx上,並將它們作爲HTTP GET請求通過Rails應用程序進行處理?

在此先感謝

答:

我能夠通過創建一個自定義代理來實現這一點,使用EM-代理和法拉第:

require 'em-proxy' 
require 'faraday' 

Proxy.start(:host => "0.0.0.0", :port => 8080, :debug => false) do |conn| 

    conn.on_data do |data| 
    http = Faraday.new(:url => 'http://example.com') do |faraday| 
     faraday.request :url_encoded    # form-encode POST params 
     faraday.response :logger     # log requests to STDOUT 
     faraday.adapter Faraday.default_adapter # make requests with Net::HTTP 
    end 
    http.get "/upload?#{data}" 
    end 
end 
+0

你在哪裏設置了這個配置? – 2014-04-27 09:48:39

回答

-2

Nginx的是一個HTTP服務器,因此它希望客戶說出HTTP。不可能讓客戶端以你描述的方式向nginx發送非HTTP協議(好吧,也許你可以編寫一個自定義模塊來完成它,但這看起來很愚蠢)。

我認爲你需要做的是編寫你自己的代理服務器,它將原始TCP協議轉換爲HTTP請求。您的GPS記錄儀會與代理進行通話,然後與nginx進行通話。這應該相當簡單,因爲TCP有效載荷似乎只是一個urlencoded字符串,所以您可以直接使用這些字符串。

+0

非常感謝!這種方法做到了! – jorgeoliveirasantos 2013-03-04 03:57:19

0

你應該看看websocket。 Nginx現在對它們有本地支持,但Nginx也有一個較老的模塊來完成這項工作。

Here's an older question對此提供了兩種解決方案。