首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用nginx反向代理的Go服务器

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

Stack Overflow用户
提问于 2018-04-01 00:58:01
回答 2查看 2.2K关注 0票数 2

我一直试图用docker和nginx建立一个go web应用程序作为反向代理。

我的计划是为多个应用程序使用一个域,例如:mydomain.com/myapp1

然而,每当我试图使用localhost/myapp/something这样的url访问我的应用程序时,请求就会被重定向到http://localhost/something

我已经经历过各种各样的nginx吐露,但都没有起作用,所以我怀疑问题是站在一边的。

在应用程序本身中,我使用大猩猩mux作为路由,也使用negroni作为一些中间件。

相关代码如下所示:

代码语言:javascript
运行
复制
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处理程序通常只执行如下操作:

代码语言:javascript
运行
复制
templ, _ := template.ParseFiles("public/something.html")
templ.Execute(w, utils.SomeTemplate{
    Title: "something",
})

最后,我的nginx配置中的相关部分:

代码语言:javascript
运行
复制
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应用程序来说已经足够了,所以我不明白为什么它不能工作。如果有人能指出我做错了什么,我会非常感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-01 08:19:41

你的牙龈在我看来很好。

在Go代码中,当您创建路由器时,您可以使用myapp作为PathPrefix,如下所示:

代码语言:javascript
运行
复制
baseRouter := mux.NewRouter()
subRouter := baseRouter.PathPrefix("/myapp").Subrouter()
subRouter.HandleFunc("/something", routes.SomeHandler).Methods("GET")

或者简单地将myapp添加到路径:baseRouter.HandleFunc("/myapp/something", routes.SomeHandler).Methods("GET")

票数 3
EN

Stack Overflow用户

发布于 2018-04-01 08:11:48

您的nginx配置非常好。

您提到的路径(/myapp/东西)将显示404,因为您没有在您的路由中注册该路径。

我建议,如果您希望使用同一个域托管多个应用程序,请使用子域(myapp1.mydomain.com)而不是路径(mydomain.com/myapp1 1)。

对于每个子域,只需更改server_name值并保持nginx服务器文件的其余部分不变,就可以创建单独的nginx服务器块。

然后,在使用中间件时,您可以筛选出域并提供请求的资源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49593850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档