需求描述
现有三台配置相同,且处于同一网络中的 CentOS 服务器,需要对这三台服务器进行合理的负载均衡配置,使各服务器的硬件及带宽资源均得到有效利用。
功能规划
三台服务器分别用 A、B、C 指代。A 服务器 80 端口上的负载均衡服务,负责将用户的请求分流至三个 Web 应用服务,这三个 Web 应用服务分别运行在本机的 8080 端口及 B、C 服务器的 80 端口。
服务器 | 用途 | 端口 |
---|
A | 负载均衡 | 80 | A | Web应用 | 8080 | B | Web应用 | 80 | C | Web应用 | 80 |
路径规划
负载均衡服务及 Web 应用服务均通过 Nginx 实现,为了方便开发,这里采用 Docker 来部署三台服务器上的四个 Nginx。
Nginx 配置及 Dockerfile 部署路径见下表。
- | 负载均衡 | Web应用 |
---|
根路径 | /var/nginx/load-balancer | /var/nginx/web-server | 网站配置 | ./conf.d/load-balancer.conf | ./conf.d/web-server.conf | Dockerfile | ./Dockerfile | ./Dockerfile |
服务配置
两类服务的基础配置 ,也就是 nginx.conf 文件是相同的。不同之处只是具体的功能设置,在 conf.d 目录下的 conf 文件中体现。
负载均衡
用于负载均衡服务的 Nginx 镜像,其配置文件及 Dockerfile 如下所示。
这里有一个关键点要注意,由于 A 服务器上将会运行两个 Nginx 容器,要想将负载均衡服务的请求导向同一服务器上的 Web 应用服务,就需要把请求发给 Web 应用服务用于 Docker 容器间通信的 IP,而不是 A 服务器的外网 IP 或者局域网 IP,因此这里 upstream 中为 A 服务器上的 Web 应用服务所设置的 IP 为 172.17.0.3。
# 负载均衡服务的配置文件
# load-balancer.conf
upstream servers {
? ? server 172.17.0.3:8080; # Docker 容器间通信,需用此 IP
? ? server B;
? ? server C;
}
server {
? ? listen? ? ? ?80;
? ? server\_name? localhost;
? ? location / {
? ? ? ? proxy\_pass http://servers;
? ? }
}
# 负载均衡服务的 Dockerfile
FROM nginx:latest
RUN rm /etc/nginx/nginx.conf
RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./conf.d/load-balancer.conf /etc/nginx/conf.d/load-balancer.conf
Web 应用
用于 Web 应用服务的 Nginx 镜像,其配置文件及 Dockerfile 如下所示。
# Web应用的配置文件
# load-balancer.conf
server {
? ? listen? ? ? ?80; # 对于 A 服务器,这里需要改成 8080
# 因为默认的 80 端口已被负载均衡服务占用了
? ? server\_name? localhost;
? ? location / {
? ? ? ? root? ?/usr/share/nginx/html;
? ? ? ? index? index.html index.htm;
? ? }
? ? # 公用静态资源
? ? location /vendor {
? ? ? ? alias /var/www/vendor;
? ? }
? ? # 网站路径
? ? location /website {
? ? ? ? alias /var/www/website;
? ? }
}
# Web 应用服务的 Dockerfile
FROM nginx:latest
RUN rm /etc/nginx/nginx.conf
RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./conf.d/web-server.conf /etc/nginx/conf.d/web-server.conf
镜像编译
完成两类服务的 Nginx 配置文件和 Dockerfile 的编辑之后,就需要编译生成镜像了。
分别进入负载均衡服务和 Web 应用服务所在的目录,确保 Dockerfile 就在所进入的路径下,然后执行下面的命令,即可编译镜像:
# 负载均衡服务
$ docker build -t load-balancer:1.0.0 .
# Web 应用服务
$ docker build -t web-server:1.0.0 .
容器启动
编译好两个 Docker 镜像之后,就需要把它们运行起来了。
由于 A 服务器上会运行两个 Nginx 镜像,为了方便调试,各自的日志文件需设置不同的路径。
服务 | 日志文件路径(需手动创建目录) |
---|
负载均衡 | /var/log/nginx/load-balancer | Web 应用 | /var/log/nginx/web-server |
另外 Web 应用需要访问宿主的 /var/www/website 和 /var/www/vendor 这两个路径,所以对于负载均衡服务和 Web 应用服务而言,分别需要挂载 1 个、3 个目录。
这两个服务的容器启动命令如下:
# 负载均衡服务的启动命令
$ docker run --name load-balancer \
-v /var/log/nginx/load-balancer:/var/log/nginx \
-p 80:80 -d load-balancer:1.0.0
# Web 应用服务的启动命令
$ docker run --name web-server \
-v /var/log/nginx/web-server:/var/log/nginx \
-v /var/www/tspt:/var/www/tspt \
-v /var/www/vendor:/var/www/vendor \
-p 8080:8080 -d web-server:1.0.0
效果验证
三台服务器上的四个服务启动成功之后,还需要查看各自的 Nginx 日志,确保负载均衡服务配置成功。在各台服务器上,执行下面的命令,查看 Nginx 日志。
# 查看负载均衡服务的日志
$ tail /var/log/nginx/load-balancer/access.log -f
# 查看 Web 应用服务的日志
$ tail /var/log/nginx/web-server/access.log -f
如果在本机访问页面,同时看到三台服务器上的 Web 应用服务日志都有新的请求,就说明负载均衡服务配置成功了,OK,大功告成!
|