Docker 使用nginx反向代理的Go服务器

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进行一些中间件 相关

我一直在尝试使用docker和nginx作为反向代理来设置go web应用程序

我的计划是将一个域用于多个应用程序,例如:
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实现了它的黑魔法。