Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Nginx上将TCP连接转发到HTTP_Ruby On Rails_Ruby_Http_Tcp_Nginx - Fatal编程技术网

Ruby on rails 在Nginx上将TCP连接转发到HTTP

Ruby on rails 在Nginx上将TCP连接转发到HTTP,ruby-on-rails,ruby,http,tcp,nginx,Ruby On Rails,Ruby,Http,Tcp,Nginx,我正在运行一个应用程序,它接受来自GPS记录器的数据,这些数据通过SMS、HTTP或TCP发送。我使用HTTP连接来传输数据,通过Rails应用程序上的GET请求可以直接接收数据 出于节省电池的目的,我们将连接更改为纯TCP,nginx目前不接受这些请求: 从nginx的access.log: HTTP: TCP: 有人知道如何在Nginx上过滤这些TCP请求,并将它们作为HTTP-GET请求处理,以便通过Rails应用程序获得这些请求吗 提前谢谢 答复: 我可以通过使用em proxy和法拉第

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

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

从nginx的access.log:

HTTP:

TCP:

有人知道如何在Nginx上过滤这些TCP请求,并将它们作为HTTP-GET请求处理,以便通过Rails应用程序获得这些请求吗

提前谢谢

答复:

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

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

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


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

您应该看看WebSocket。Nginx现在有了对它们的本机支持,但是Nginx有一个较旧的模块也可以完成这项工作


关于这一点,我们提供了两种解决方案。

非常感谢!这种方法成功了!您在哪里设置了此配置?WebSocket需要涉及SHA-1的重要握手。必须在gps记录器上实现,或者无论如何添加代理。
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 "-" "-"
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