0

我正在运行一个应用程序,它接受来自 GPS 记录器的数据,这些数据是通过 SMS、HTTP 或 TCP 发送的。我使用 HTTP 连接来传输数据,这很容易通过我的 Rails 应用程序上的 GET 请求接收。

出于省电的目的,我们将连接更改为纯 TCP,而 nginx 目前不接受这些请求:

从 nginx 的 access.log 中:

HTTP:

xx.xx.xx.xxx - - [03/Mar/2013:20:17:45 -0500] "GET /?imei=123456789012345&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=123456789012345&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 "-" "-"

有谁知道在 Nginx 上过滤这些 TCP 请求并将它们作为 HTTP GET 请求处理以通过 Rails 应用程序可用的方法?

提前致谢

回答:

我可以通过使用 em-proxy 和 faraday 创建一个自定义代理来实现这一点:

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
4

2 回答 2

0

你应该看看websockets。Nginx 现在有对它们的原生支持,但是有一个旧的 Nginx 模块也可以工作。

这是一个较旧的问题,提供了两种解决方案。

于 2013-03-04T01:48:51.173 回答
-2

Nginx 是一个 HTTP 服务器,因此它希望客户端使用 HTTP。不可能让客户端以您描述的方式向 nginx 讲非 HTTP 协议(​​好吧,也许您可​​以编写一个自定义模块来做到这一点,但这似乎很愚蠢)。

我认为您需要做的是编写自己的代理服务器,它将原始 TCP 协议转换为 HTTP 请求。您的 GPS 记录器会与代理对话,然后代理会与 nginx 对话。这应该相当简单,因为 TCP 有效负载似乎只是一个 urlencoded 字符串,因此您可以直接使用它们。

于 2013-03-04T01:47:40.630 回答