nginx背后的多个Web应用程序。 我在nginx后面运行了不同的Web应用程序。
这是我的下图,我用于我的设置来处理多个应用程序。
如何访问App-1 / App-2 / App-3应用程序
一个。浏览器发送访问主网站的请求&主网站为他们提供304重定向与cookie值(Device_type = xx& IP = 45)来推迟。
* Device_Type = App-1或App-2 - >要连接的设备。 * IP = 45,系统IP地址的最后一个八位字节。
只需看看设备类型& IP最后一个八位字节值可以重定向到正确的应用程序。
B中。浏览器通过cookie&amp ;;向nginx发送请求。 nginx只是通过查看设备类型& IP最后一个八位字节值将重定向到正确的应用程序。 并且所有进一步的请求都根据cookie值和&amp ;;进行正确的应用。 nginx的规则。
如果只能从每个APP的一个浏览器访问应用程序(App-1 / App-2 / App-3),这个工作正常。
问题: - 没有两个应用程序可以从同一浏览器访问。 即如果两个应用程序都从相同的浏览器运行,即使它们共享不同的选项卡,也会共享cookie。
现在如果他们共享cookie,那么nginx大多数时候都会重定向到不正确的APP。
我知道这不是最好的方法,但它是按原样完成的。
实现: - 我想在nginx上进行动态路由,具体取决于每个用户的浏览器会话。所以,每次用户请求任何我将路由它正确的APP
我一直在调查nginx中的很多内容,但是来自nginx的内容,它保存浏览器会话,以便所有后续请求都转到同一个APP服务器。 同时考虑ceryx-dynamic-nginx。
答案 0 :(得分:0)
为了将基于cookie的请求定向到特定服务器,您需要做的就是制作如下地图:
func App() *buffalo.App {
if app == nil {
app = buffalo.Automatic(buffalo.Options{
Env: ENV,
SessionName: "_liam_session",
})
app.GET("/", HomeHandler)
app.ANY("/admin/{path:.+}", buffalo.WrapHandler(http.StripPrefix("/admin", Other())))
app.ServeFiles("/assets", packr.NewBox("../public/assets"))
}
return app
}
func Other() http.Handler {
f := func(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, req.URL.String())
fmt.Fprintln(res, req.Method)
}
mux := mux.NewRouter()
mux.HandleFunc("/foo", f).Methods("GET")
mux.HandleFunc("/bar", f).Methods("DELETE")
return mux
}
您需要为每个
创建应用流map $cookie_IP $app_upstream {
default main_app;
45 app1;
46 app2;
66 app3;
}
并在您所在的位置
upstream main_app {
server 192.168.12.10;
}
upstream app1 {
server 10.122.123.45;
}
upstream app2 {
server 10.122.123.46;
}
upstream app3 {
server 10.122.123.66;
}
如果您为每个上游设置了自定义网址,那么您需要做的是为每个上游创建服务器并使其根据主机名值进行定向。