2013-03-04 3 views
0

У меня запущено приложение, которое принимает данные от регистраторов GPS, будучи этими данными, отправленными через SMS, HTTP или TCP. Я использовал HTTP-соединение для передачи данных, которые было легко получить через запрос GET в моем приложении Rails.Прямое TCP-соединение с HTTP на Nginx

В целях экономии батареи, мы изменили соединение с чистого TCP и Nginx не принимает эти запросы на ныне:

От access.log Nginx в:

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?

Заранее спасибо

Ответ:

мне удалось добиться этого путем создания пользовательского прокси, используя эм-прокси и Фарадея:

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

Где вы установили эту конфигурацию? –

ответ

-2

Nginx является сервером HTTP, так это ожидает, что клиенты будут говорить HTTP. Невозможно, чтобы клиент, говорящий на не-HTTP-протоколе, был nginx в том виде, который вы описываете (хорошо, возможно, вы могли бы написать собственный модуль для этого, но это кажется глупым).

Я думаю, что вам нужно написать собственный прокси-сервер, который преобразует необработанный TCP-протокол в HTTP-запросы. Ваши регистраторы GPS будут разговаривать с прокси-сервером, который затем будет разговаривать с nginx. Это должно быть довольно простым, поскольку полезная нагрузка TCP, по-видимому, является строкой с urlencoded, поэтому вы можете просто использовать ее напрямую.

+0

Спасибо большое! Этот подход сделал это! – jorgeoliveirasantos

0

Вы должны посмотреть на веб-узлы. Nginx теперь имеет встроенную поддержку для них, но для Nginx существует и более старый модуль, который также выполняет эту работу.

Here's an older question об этом с обоими решениями.