duangouyan3328
duangouyan3328
2018-04-01 00:58

使用Nginx反向代理进行服务器

已采纳

I've been trying to set up a go web application with docker and nginx as a reverse proxy.

My plan is to use a single domain for multiple applications e.g.: mydomain.com/myapp1.

However whenever I try to access my app in with an url like localhost/myapp/something, the request is redirected to http://localhost/something.

I've gone through all kinds of nginx configs, none of them worked, so I suspect that the problem is on the go side.

In the app itself, I'm using gorilla mux for routing, and also negroni for some middleware.

The relevant code looks something like this:

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))

According to this, every request should go through my debug middleware, which just prints some request info to stdout, however when the redirects happen, it doesn't work.

But if the path doesn't match any handlers, everything works just fine, the standard go 404 message appears as expected, and the request is printed by the debug middleware as well.

My GET handlers generally only do something like this:

templ, _ := template.ParseFiles("public/something.html")
templ.Execute(w, utils.SomeTemplate{
    Title: "something",
})

And finally, the relevant part in my nginx config:

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;
    }
}

This kind of nginx config used to be enough for nodeJS apps in the past, so I don't understand why it wouldn't work. If anyone could point out what the hell I'm doing wrongly, I would appreciate it a lot.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • doushanmo7024 doushanmo7024 3年前

    Your nginx looks fine to me.

    In your Go code, when you create your router, you may use the myapp as the PathPrefix like below:

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

    Or simply add myapp to the path: baseRouter.HandleFunc("/myapp/something", routes.SomeHandler).Methods("GET")

    点赞 评论 复制链接分享
  • dongtazu3080 dongtazu3080 3年前

    Your nginx configuration is perfectly fine.

    The path you mentioned (/myapp/something) will show you 404 because you have not registered that in your routes.

    I would suggest that if you wish to host multiple applications using the same domain, prefer using subdomains (myapp1.mydomain.com) instead of path (mydomain.com/myapp1).

    For each subdomain, you can create a separate nginx server block by changing the server_name value only and keeping the rest of the nginx server file the same.

    Then, while using middleware, you may filter out the domains and provide the requested resource.

    点赞 评论 复制链接分享