GRP - 基于Go的反向代理

Posted by KC on August 11, 2016

目录:

GRP (Go Reverse Proxy) 是一个用Golang实现的反向代理服务器。

现有方案

目前已有的相对简单的解决方案包括nginx反向代理,还有一个基于PHP的g7host。

前者非常灵活,但是需要root权限,并且配置也比较复杂,需要比较强的专业能力。

后者简单,并且有简易的配置界面,基于PHP的方案也可以找到一些免费主机来支持,但是我尝试了一下,发现这个方案至少访问Google是有问题的,无法正常使用了。

GRP简介

GRP 希望让部署和配置简单化,启动可以无需root权限,并且能够在一台服务器上代理多个网站。

需要同时代理多个网站的时候,提供多个不同的子域名,可以在DNS服务器中指定这些子域名执行您部署GRP的服务器。

如果你没有自己的DNS服务器,或者无法指定多个子域名,也可以通过顶级域名或者IP地址访问,但由于顶级域名和IP地址只有一个,所以这时候只能支持代理单个网站。

配置示例文件在conf.yml中。你可以指定运行的端口号、配对的本地服务器和它所代理的远程服务器地址。当要在一个应用中代理多个远程服务器的时候,需要本地有不同的子域名解析。

示例文件中,proxy下一级的google/gmail/googleAccount等这几个关键字是任意指定的(不能重复),你可以换成自己喜欢的其他名字,也可以自行增加其他的网站。目前我测试过的站点包括google和baidu的搜索功能。另外还存在两个remoteSchema/localSchema关键字,可以是httphttps,默认值为http。由于部分网站必须通过https访问(比如百度),对这类网站可以手工指定remoteSchema: https

使用

分发版本包括三个文件:

  • grp – 可执行文件,包括Linux版,Mac版和Windows版;
  • conf.yml – 配置文件,本地要使用哪个端口,你通过哪个子域名代理哪个站点,都在这里进行配置;
  • log4go.xml – 日志配置文件,控制日志如何输出,这个你可以选择忽略。

将以上三个文件上传到你的服务器中,直接执行即可,例如:

1
$ nohup ./grp > /dev/null 2>stderr.log &

TODO

  • 单域名支持,无需DNS配置多个子域名的情况代理多个远程地址。(P0)
  • SSL支持,当本地服务不是起在80和443端口时,在做域名替换的时候要根据远程服务器的Schema或者端口号智能切换本地端口号。这个问题目前在登录accounts.google.com时会出现。(P1)
  • 登录和会话保持。(P1)
  • on-file-change auto reload
  • multi backend services and load balance support
  • 自动感知网站是否使用https? 避免手工在配置文件中进行配置。

引用