是否可以在Golang中处理多个域?

时间:2016-10-10 06:54:08

标签: http go dns webserver

我想用Golang处理多域。

像这样,如果浏览器发送http://sampledomain.me请求,则使用特定的Golang程序处理它,

在其他情况下,我想在一台服务器上安装许多程序并告诉每一台程序,以处理每个域。

所有程序都在监听80,许多域指向一台服务器。

任何人都可以帮助我吗?

... THX

4 个答案:

答案 0 :(得分:5)

你的Go程序不能全部监听端口80.你需要前面的东西,比如nginx,作为反向代理。以下nginx配置摘录会将两个域转发到两个不同的程序,每个程序都在不同的端口上侦听:

server {
        listen 80;
        server_name www.domain1.com;

        location / {
                proxy_pass http://127.0.0.1:8080;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host            $host;
                proxy_read_timeout 600s;
        }

}  

server {
        listen 80;
        server_name www.domain2.com;

        location / {
                proxy_pass http://127.0.0.1:8081;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host            $host;
                proxy_read_timeout 600s;
        }

}

答案 1 :(得分:1)

你真的不需要任何东西,比如nginx, 虽然在某些情况下是推荐的。

请在此处找到类似的答案“Host Multiple Golang Sites on One IP and Serve Depending on Domain Request

答案 2 :(得分:0)

是的,由于域名在URL中,您可以轻松过滤您想要使用的处理程序。我找到了这个指南http://codepodu.com/subdomains-with-golang/

答案 3 :(得分:0)

我都使用,但最喜欢第二种解决方案:

  1. nginx作为代理,在多个端口上具有多个Golang应用 即GoApp1:8081 GoApp2:8082 GoApp3:8083 ....

    服务器{        ...        server_name www.example1.com example1.com;        ...        位置 / {           proxy_pass app_ip:8081;        }        ...     }     服务器{        ...        server_name www.example2.com example2.com;        ...        位置 / {           proxy_pass app_ip:8082;        }        ...     }     。     。     

  2. nginx作为代理,在同一端口上具有多个Golang应用程序(8081) 用(Golang)func(u * URL)Hostname()字符串分隔

    服务器{    ...    server_name www.example1.com example1.com;    ...    位置 / {       proxy_pass app_ip:8081;    }    ... }

还有另一种解决方法(没有nginx): sudo apt-get install iptables-persistent

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
sudo netfilter-persistent save
sudo netfilter-persistent reload