使用 rails 和 puma 通过绑定端口区分传入请求
Differentiate incoming requests by bound port using rails and puma
我有一个带有两个 API 的 rails 应用程序 --- 一个 public 和一个私有 API。使用 puma,我已将此应用程序绑定到端口 3000 和 3001。我的 google VPC 中有一个内部 IP 地址绑定到端口 3000 上的 rails 应用程序的虚拟机,以及 public 3001端口绑定的IP地址。
我期望的是能够根据该侦听器端口了解请求来自哪个源,但请求只知道 URL 中的端口,因此它始终列在 80。所有请求通过 GKE 负载平衡器,因此 REMOTE_IP header 始终相同。
我能够获得所需功能的唯一方法是启动应用程序的两个实例,每个实例绑定一个端口,并包含一个环境变量。
是否可以根据请求绑定到的端口来区分请求?这将允许我使用应用程序的一个实例而不是两个。
我意识到我看错地方了。当我在同一个进程中传递数据时生成 HTTP headers 没有意义。我从内部应用程序控制器request
object中找到了我想要的数据。
request.headers['puma.socket'].addr
# => ["AF_INET", 3001, "127.0.0.1", "127.0.0.1"]
所以我用它来实现我正在寻找的授权:
case request.headers['puma.socket'].addr[1]
when 3000 then :private
when 3001 then :public
else :unknown
我有一个带有两个 API 的 rails 应用程序 --- 一个 public 和一个私有 API。使用 puma,我已将此应用程序绑定到端口 3000 和 3001。我的 google VPC 中有一个内部 IP 地址绑定到端口 3000 上的 rails 应用程序的虚拟机,以及 public 3001端口绑定的IP地址。
我期望的是能够根据该侦听器端口了解请求来自哪个源,但请求只知道 URL 中的端口,因此它始终列在 80。所有请求通过 GKE 负载平衡器,因此 REMOTE_IP header 始终相同。
我能够获得所需功能的唯一方法是启动应用程序的两个实例,每个实例绑定一个端口,并包含一个环境变量。
是否可以根据请求绑定到的端口来区分请求?这将允许我使用应用程序的一个实例而不是两个。
我意识到我看错地方了。当我在同一个进程中传递数据时生成 HTTP headers 没有意义。我从内部应用程序控制器request
object中找到了我想要的数据。
request.headers['puma.socket'].addr
# => ["AF_INET", 3001, "127.0.0.1", "127.0.0.1"]
所以我用它来实现我正在寻找的授权:
case request.headers['puma.socket'].addr[1]
when 3000 then :private
when 3001 then :public
else :unknown