Host Multiple Web Sites of Go Using Reverse Proxy Example




Go supports built-in server. But there is a limitation that you can host only one site at once with one port.

Though you can host multiple sites with the domain name using gorilla mux then all site will come with one app that will be very hard to maintain and update. 

Another option is you can host your site with different ports and then use the reverse proxy to map to map the domain name to the port





Explanation

Scenario 

I have two sites running on my vultr vps. All of them are website that means request will be come in with  domain name and going to be arrived on the port 80. If  I assing one program [ site ] to listen to the port 80 others will not be able to listen on port 80. 

Condition
Requirement is that requests should be listend on port 80 and handled by the app to which it relates.
After struggling for 3 days i got this 😂 silly solution.


Source Code ( solution I got )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
func main() {
 // New functionality written in Go
 http.HandleFunc("/new", func(w http.ResponseWriter, r *http.Request) {
  fmt.Fprint(w, "New function")
 })

 // gospot.mchampaneri.in ===> localhost:8085
 u1, _ := url.Parse("http://localhost:8085/")
 http.Handle("gospot.mchampaneri.in/", httputil.NewSingleHostReverseProxy(u1))

 // www.mchampaneri.in ===> localhost:8081 
 u2, _ := url.Parse("http://localhost:8081/")
 http.Handle("www.mchampaneri.in/", httputil.NewSingleHostReverseProxy(u2))

 // Start the server
 http.ListenAndServe(":80", nil)
}
Compiled binary of this code is proxy server for us


Explanation  Of Code

We are using http package and httputil package to make this done.
I assign my every sites port in serise of 80xx

Now Created another golang app which works as http mux .
[ Which's Source Code I am Showing. Ya It Just 17+ 😁(imports + package main) lines for me]

Explanation of the core code

u1, _ := url.Parse("http://localhost:8085/")
In this line we are parsing the url of our end point
[my app of gospot.mchampaneri.in is running on local 8085 port]

http.Handle("gospot.mchampaneri.in/", httputil.NewSingleHostReverseProxy(u1))
It matches the request with the .Handle( input-url ) and if matches it forwards the request to the url which we parsed before.


Explaination of Work

After seeing code if still you are confused how it works, let me explaing the flow.

  • You search for gospot.mchampaner.in in you browser
  • DNS server will forward request to my vultu vps on port 80
  • Our Proxy is running on port 80 it will receive request
  • Proxy will match the request with the http.Handle("gospot.mchampaneri.in/") and so request will be handled by httputil.NewSignelHostReverseProxy(u1) [ which is actully the reverse proxy]


So inshort this proxy will map incomming request domain to the port on your vps which is inteded to handle it.

Hope you will find it usefull and easy to understand.
For this post your comments are welcomed so i can make it better.

Comments

  1. Hey Manish,
    i want to monitor the request and response of few API in my project using exactly such proxy server, please help..lets get connect via email : bahalkapil@gmail.com

    ReplyDelete

Post a Comment

Popular Posts