基于nginx的水平扩展部署
1. 部署
注意:本部分内容需要学员完成本节之前的内容。
- 删除petclinic容器,保证干净的环境
docker stop petclinic && docker rm petclinic
- 部署petclinic1实例
docker run -d --name petclinic1 --restart=always -e spring.profiles.active=mysql -e spring_datasource_password=Yhf@1018 -e database_url="jdbc:mysql://$ip:3306/petclinic" -e app_id="1" r.kinginsai.com/petclinic:7.8.0
等待实例petclinic1启动完成
docker logs -f petclinic1
- 部署petclinic2实例
docker run -d --name petclinic2 --restart=always -e spring.profiles.active=mysql -e spring_datasource_password=Yhf@1018 -e database_url="jdbc:mysql://$ip:3306/petclinic" -e app_id="2" r.kinginsai.com/petclinic:7.8.0
等待实例petclinic2启动完成
docker logs -f petclinic2
- 获取实例petclinic1/petclinic2的ip地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' petclinic1
docker inspect --format '{{ .NetworkSettings.IPAddress }}' petclinic2
- 水平扩展/nginx负责均衡
在/root/petclinic目录下创建子目录conf.d,并在此目录下创建petclinic.conf文件
mkdir -p /root/petclinic/conf.d
touch /root/petclinic/conf.d/petclinic.conf
copy以下内容到/root/petclinic/conf.d/petclinic.conf
upstream backend {
#server 192.168.1.101:8080 down;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend/;
}
}
然后将192.168.1.101/192.168.1.102分别改成实例petclinic1/petclinic2的ip地址
部署nginx(如果你的服务端没有外网条件,请加载nginx_1.25.1.tar)
docker run -d --name nginx -p 80:80 --restart=always -v /root/petclinic/conf.d:/etc/nginx/conf.d nginx:1.25.1
在浏览器中输入本台Ubuntu18TextVMI主机ip地址访问主页,并多次刷新查看结果。
2. nginx简单介绍
Nginx是一个高性能的HTTP和反向代理Web服务器,同时也提供IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3/SMTP)代理服务器。Nginx的特点是:占有内存少,并发能力强。
Nginx专门为性能优化而开发,性能是最重要的考量,非常注重效率,事实上Nginx的并发能力在同类型的网页服务器种表现较好,能够支持高达50000个并发连接响应数。
正向代理
概念:正向代理,意思是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问,这个过程就是正向代理。
反向代理
概念:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。
反向代理,其实对于客户端来说,对代理是无感知的,因为客户端不需要任何配置就可以访问。
过程:反向代理时,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,将数据返回给客户端,此时反向代理服务器和目标服务器在外界看来就是一个服务器,暴露的是代理服务器,隐藏了真实服务器的IP地址。
端口号为5173的反向代理服务器根据客户端的请求,将请求转发到目标服务器的Tomcat中,但是在这个过程中,客户端直接访问的是端口号为5173的反向代理服务器,而不是Tomcat服务器,所以对外暴露的是反向代理服务器,而真正的内部服务器是端口号为8080的Tomcat。从客户端来看,客户端并不知道有反向代理服务器的存在,所以在外部看来,反向代理服务器5173和Tomcat服务器8080好像是一个服务器,也就是对外就是一个服务器。
负载均衡
概念:负载均衡其意思就是分摊到多个操作单元上进行执行,从而共同完成工作任务。
客户端发送请求到服务器,服务器处理请求,与数据库交互,服务区处理完成后,将结果响应给客户端。
客户端发送N条请求,上面我们了解到Nginx可以做反向代理,所以在这里,用户请求可以通过反向代理服务器,将N条请求平均分发到不同的服务器,不同端口号的服务器会得到反向代理服务器分发到不同请求信息进行处理。
Nginx负载均衡状态
状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails次失败后,服务暂停的时间
max_conns 限制最大的接收连接数
Nginx负载均衡策略
算法名称 说明 示例
轮询 默认方式
weight 权重方式 weight=10
ip_hash 依据ip分配方式 ip_hash
least_conn 依据最少连接方式 least_conn
url_hash 依据URL分配方式 hash $request_uri
fair 依据响应时间方式 fair