Docker 使用nginx反向代理的Go服务器
我一直在尝试使用docker和nginx作为反向代理来设置go web应用程序 我的计划是将一个域用于多个应用程序,例如:Docker 使用nginx反向代理的Go服务器,docker,nginx,go,Docker,Nginx,Go,我一直在尝试使用docker和nginx作为反向代理来设置go web应用程序 我的计划是将一个域用于多个应用程序,例如:mydomain.com/myapp1 但是,每当我尝试使用类似于localhost/myapp/something的url访问中的应用程序时,请求将重定向到http://localhost/something 我已经经历了各种nginx配置,但都没有成功,所以我怀疑问题还在继续 在应用程序本身中,我使用gorilla mux进行路由,也使用negroni进行一些中间件 相关
mydomain.com/myapp1
但是,每当我尝试使用类似于localhost/myapp/something
的url访问中的应用程序时,请求将重定向到http://localhost/something
我已经经历了各种nginx配置,但都没有成功,所以我怀疑问题还在继续
在应用程序本身中,我使用gorilla mux进行路由,也使用negroni进行一些中间件
相关代码如下所示:
baseRouter := mux.NewRouter()
baseRouter.HandleFunc("/something", routes.SomeHandler).Methods("GET")
baseRouter.HandleFunc("/", routes.IndexHandler).Methods("GET")
commonMiddleware := negroni.New(
negroni.HandlerFunc(middleware.Debug),
)
commonMiddleware.UseHandler(baseRouter)
log.Fatal(http.ListenAndServe(":5600", commonMiddleware))
根据这一点,每个请求都应该通过我的调试中间件,它只是将一些请求信息打印到stdout,但是当重定向发生时,它就不起作用了
但是,如果路径与任何处理程序都不匹配,则一切正常,标准go 404消息按预期显示,并且请求也由调试中间件打印
我的GET处理程序通常只执行以下操作:
templ, _ := template.ParseFiles("public/something.html")
templ.Execute(w, utils.SomeTemplate{
Title: "something",
})
最后,我的nginx配置中的相关部分:
server {
listen 80;
server_name localhost;
location /myapp/ {
# address "myapp" is set by docker-compose
proxy_pass http://myapp:5600/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
在过去,这种nginx配置对于nodeJS应用程序来说已经足够了,所以我不明白为什么它不起作用。如果有人能指出我到底做错了什么,我将不胜感激。您的nginx配置非常好 您提到的路径(/myapp/something)将显示404,因为您尚未在路由中注册该路径 我建议,如果您希望使用同一个域托管多个应用程序,最好使用子域(myapp1.mydomain.com)而不是路径(mydomain.com/myapp1) 对于每个子域,您可以通过仅更改server_name值并保持nginx服务器文件的其余部分不变来创建单独的nginx服务器块
然后,在使用中间件时,您可以过滤掉域并提供请求的资源。您的nginx配置非常好 您提到的路径(/myapp/something)将显示404,因为您尚未在路由中注册该路径 我建议,如果您希望使用同一个域托管多个应用程序,最好使用子域(myapp1.mydomain.com)而不是路径(mydomain.com/myapp1) 对于每个子域,您可以通过仅更改server_name值并保持nginx服务器文件的其余部分不变来创建单独的nginx服务器块
然后,在使用中间件时,您可以过滤掉域并提供请求的资源。我觉得您的nginx很好 在Go代码中,当您创建路由器时,您可以使用myapp作为路径前缀,如下所示:
baseRouter := mux.NewRouter()
subRouter := baseRouter.PathPrefix("/myapp").Subrouter()
subRouter.HandleFunc("/something", routes.SomeHandler).Methods("GET")
或者简单地将myapp添加到路径:
baseRouter.HandleFunc(“/myapp/something”,routes.SomeHandler).Methods(“GET”)
我觉得你的nginx很好
在Go代码中,当您创建路由器时,您可以使用myapp作为路径前缀,如下所示:
baseRouter := mux.NewRouter()
subRouter := baseRouter.PathPrefix("/myapp").Subrouter()
subRouter.HandleFunc("/something", routes.SomeHandler).Methods("GET")
或者简单地将myapp添加到路径:
baseRouter.HandleFunc(“/myapp/something”,routes.SomeHandler).Methods(“GET”)
您也应该使用golang中的基本url来避免问题。然后您应该将baseRouter:=mux.NewRouter()
更改为baseRouter:=mux.NewRouter().PathPrefix(“/myapp”)
,并更改proxy\u passhttp://myapp:5600/;代码>至代理\u通行证http://myapp:5600;代码>在您的nginx中,因此/myapp
也会发送到golang服务器是的,谢谢,我现在已经收到了。为任何其他正在处理类似问题的人提供保护:删除浏览器缓存,或完全禁用它。。。显然,我的请求甚至没有到达服务器,因为某种原因firefox发挥了它的魔法。你也应该使用golang中的基本url来避免问题。然后您应该将baseRouter:=mux.NewRouter()
更改为baseRouter:=mux.NewRouter().PathPrefix(“/myapp”)
,并更改proxy\u passhttp://myapp:5600/;代码>至代理\u通行证http://myapp:5600;代码>在您的nginx中,因此/myapp
也会发送到golang服务器是的,谢谢,我现在已经收到了。为任何其他正在处理类似问题的人提供保护:删除浏览器缓存,或完全禁用它。。。显然,我的请求甚至没有到达服务器,因为某种原因,firefox实现了它的黑魔法。