使用nginx反向代理

时间:2018-04-01 00:58:02

标签: docker nginx go

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

我的计划是将单个域用于多个应用程序,例如:mydomain.com/myapp1

但是,每当我尝试使用localhost/myapp/something等网址访问我的应用时,请求都会重定向到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打印一些请求信息,但是当重定向发生时,它不起作用。

但是如果路径与任何处理程序都不匹配,一切正常,标准的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应用来说已经足够了,所以我不明白为什么它不起作用。如果有人能指出我到底做错了什么,我会非常感激。

2 个答案:

答案 0 :(得分:2)

你的nginx看起来很好。

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

baseRouter := mux.NewRouter()
subRouter := baseRouter.PathPrefix("/myapp").Subrouter()
subRouter.HandleFunc("/something", routes.SomeHandler).Methods("GET")

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

答案 1 :(得分:1)

你的nginx配置非常好。

您提到的路径(/ myapp / something)将显示404,因为您尚未在路线中注册该路径。

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

对于每个子域,您可以通过仅更改server_name值并保持nginx服务器文件的其余部分相同来创建单独的nginx服务器块。

然后,在使用中间件时,您可以过滤掉域并提供所请求的资源。