繁体   English   中英

在Nginx上将TCP连接转发到HTTP

[英]Forward TCP connection to HTTP on Nginx

我正在运行一个应用程序,该应用程序接收来自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

您应该看看websockets。 Nginx现在已经为它们提供了本机支持,但是Nginx有一个较旧的模块也可以工作。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM