【问题标题】:Forward TCP connection to HTTP on Nginx在 Nginx 上将 TCP 连接转发到 HTTP
【发布时间】:2013-02-18 01:12:07
【问题描述】:

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

【问题讨论】:

  • 你在哪里设置这个配置?

标签: ruby-on-rails ruby http tcp nginx


【解决方案1】:

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

Here's an older question 提供两种解决方案。

【讨论】:

  • Websocket 需要涉及 SHA-1 的重要握手。要么必须在 gps 记录器上实现,要么无论如何添加代理。
【解决方案2】:

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

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

【讨论】:

  • 非常感谢!这种方法做到了!
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2013-04-14
  • 2020-11-23
  • 1970-01-01
  • 2016-04-11
  • 2015-07-26
  • 2021-02-18
相关资源
最近更新 更多