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