有的小伙伴或许没有使用过 VPC 网络下的服务器,在该网络环境下,服务器默认没有公网 IP ,所以用户无法访问到服务器。一般策略是使用 SLB 进行入网流量代理,这样用户就能从公网访问服务器上的应用了。

但是这样只能解决流量进入的问题,并解决不了 VPC 环境下的内网机器访问公网资源的问题,给每一台机器单独分配 IP 显然不是最优解,这时我们一般会选择使用某一台服务器作为出口,搭建代理服务器。

使用容器配置 Apache 代理服务器

为内网环境服务器搭建代理服务器,我们一般会优先选择 Apache Traffic Server ,但是其实使用 Apache 也可以简单的解决问题。

相比较 Traffic Server,使用 Apache 作为代理服务器非常简单。容器编排文件 docker-compose.yml 只需要 22 行:

Apache 配置文件 httpd.conf也无需像网上配置那么复杂,只需要下面这30来行就行:

如果你和我一样,明确代理服务器的服务目标,可以在 <Proxy> 配置中将其声明,避免服务被盗用,当然,推荐搭配防火墙安全策略一起使用,万无一失。

使用 docker-compose up 启动应用,会看到类似下面的日志:

看日志服务确实是启动起来了,但是是否有效不得而知,所以我们要进行测试。

测试服务

在另外一台服务器上使用 curl 测试代理服务器是否正常工作,如果能否正常使用,结果会类似下面这样:

配置服务器

让服务器默认出公网的流量走代理服务器很简单,只需要在 /etc/profile 配置文件中添加两行即可:

对 profile 文件进行修改后,需要手动重载文件:

或者断开当前的终端连接,重新连接服务器,也可以让配置生效。再次使用 curl 对代理服务器进行验证,会看到默认出公网的流量会先经过代理服务器。

配置容器服务

Docker 官方文档中有提过 ,如果想要 Docker Daemon 使用系统代理配置,需要在其启动之前进行配置,所以配置 daemon.json 大法在此处就不适用啦。

解决方法是覆盖默认的 docker.service 配置文件,先创建一个服务配置目录:

然后创建一个文件并编辑文件内容 /etc/systemd/system/docker.service.d/http-proxy.conf ,添加环境变量:

接着重启服务:

最后,使用 docker pull 命令验证配置是否正常:

配置容器内部环境

如果不进行容器内部网络配置,使用容器访问公网服务,基本会遇到网络超时:

Docker 官方文档其实也有提过 ,解决方案的原理是:通过编辑 ~/.docker/config.json Docker 客户端配置文件,来为容器自动注入 PROXY 环境变量。

将上述配置添加好之后,无须重启容器服务,直接再次执行命令即可:

至此,VPC 环境下的服务器和容器访问外网就设置完毕啦。

最后

别忘记设置防火墙规则,服务器访问公网的 IP 不允许入网流量,减少服务器对外安全隐患。

—EOF