我有一个生产Rails应用程序,我希望尽可能无缝地集成非Rails,非Ruby服务器进程。也就是说,我希望某些路由由与Rails应用程序在同一服务器上运行的Haskell Snap Web应用程序处理。这些路由都将返回JSON有效负载,因此没有模板复杂性。但是我想避免设置CORS的开销,所以我希望这些JSON响应看起来好像它们来自与Rails生成的网页相同的源。
在这种情况下,最好的整合策略是什么?我是否应该设置Rails控制器向Haskell Web应用程序发出Web请求,然后将响应转发给客户端,或者使用Rack中间件或Nginx配置是否有更有效的方法来执行此操作?
答案 0 :(得分:1)
最简单的方法是在子目录中使用nginx的反向代理。例如(基于this question):
location /snap {
rewrite /snap/(.*) /$1 break;
proxy_pass http://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
将localhost:8000
更改为Snap应用程序运行的任何位置。
您还可以将目录名从snap
更改为您想要的任何内容。只需确保在出现的两个位置更改它,并且它不会与您的RoR应用程序中的任何路由冲突。
但是,如果您想通过Ruby应用程序使用身份验证/授权来访问Haskell应用程序的数据,您可能会发现更容易实现您制作自己的代理控制器的第一个建议,因为这样您就可以使用在调用Haskell应用程序之前,Rails应用程序的登录逻辑。