1.掌握什么是负载均衡
2.nginx怎么实现负载均衡
3.负载均衡的常见算法
4.为什么使用docker搭建负载均衡
Docker部署nginx实现负载均衡
实验环境:
Centos 7
Docker
Nginx
利用宿主机和两个nginx容器来实现负载均衡,宿主机无任何内容。只搭载一台nginx服务器,并由此台服务器将请求转发给两个nginx容器来进行处理
不知道什么是nginx 负载均衡,请移步 nginx负载均衡
一、安装相关环境
1.安装Docker(个人推荐配置阿里云源)
2.宿主机安装Nginx
关闭防火墙和selinux
[root@iZbp18vj2il5rgv6uy66xxZ ~]# systemctl stop firewalld.service //Centos7 关闭防火墙命令
[root@iZbp18vj2il5rgv6uy66xxZ ~]# setenforce 0 //临时关闭SELinux
//如果是宝塔安装,则省略
[root@iZbp18vj2il5rgv6uy66xxZ ~]# yum install docker -y
[root@iZbp18vj2il5rgv6uy66xxZ ~]# wget http://dl.Fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@iZbp18vj2il5rgv6uy66xxZ ~]# yum install nginx -y
用命令测试是否成功安装 能否开启服务
//如果是宝塔安装,则省略
[root@iZbp18vj2il5rgv6uy66xxZ ~]# systemctl start docker.service
[root@iZbp18vj2il5rgv6uy66xxZ ~]# systemctl start nginx.service Centos 7 启动服务命令与6.x不同哦
我们先删除掉nginx默认html,并创建一个空白index.html 方便我们配置成功后查看效果
[root@iZbp18vj2il5rgv6uy66xxZ ~]# cd /www/server/nginx/html/
[root@iZbp18vj2il5rgv6uy66xxZ ~]# rm index.html
[root@iZbp18vj2il5rgv6uy66xxZ ~]# touch index.html
二、安装Nginx容器
- pull nginx镜像
[root@iZbp18vj2il5rgv6uy66xxZ www]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx 07aded7c29c6: Pull complete bbe0b7acc89c: Pull complete 44ac32b0bba8: Pull complete 91d6e3e593db: Pull complete 8700267f2376: Pull complete 4ce73aa6e9b0: Pull complete Digest: sha256:765e51caa9e739220d59c7f7a75508e77361b441dccf128483b7f5cce8306652 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest
- pull完成使用docker images命令查看
[root@iZbp18vj2il5rgv6uy66xxZ www]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f8f4ffc8092c 7 days ago 133MB
- docker run 创建容器
//容器名:nginx_web1 映射容器8080端口到宿主机80端口上
docker run -p 8080:80 --name nginx_web1 -it nginx /bin/bash
如果遇到报错
docker: Error response from daemon: driver failed programming external connectivity on endpoint nginx_web1 (37baee6af0da8d4fb5c3419e142a25477259e9d3cef92f1372f6170c0c253e54): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.4:80 ! -i docker0: iptables: No chain/target/match by that name.
重启一下docker服务即可
systemctl restart docker
进入nginx_web1容器的nginx目录下 创建一个index.html
root@9f88cab79ac8:/# cd /usr/share/nginx/html/
root@9f88cab79ac8:/usr/share/nginx/html# ls
50x.html index.html
root@9f88cab79ac8:/usr/share/nginx/html# rm index.html
root@9f88cab79ac8:/usr/share/nginx/html# echo hello nginx_web1 ninetySeven > index.html
root@9f88cab79ac8:/usr/share/nginx/html# exit
下面创建多一个新的nginx容器
//容器名:nginx_web2 映射容器8080端口到宿主机80端口上
docker run -p 8081:80 --name nginx_web2 -it nginx /bin/bash
进入nginx_web2容器的nginx目录下 创建一个index.html
root@f1b7fcac2dad:/# cd /usr/share/nginx/html/
root@f1b7fcac2dad:/usr/share/nginx/html# ls
50x.html index.html
root@f1b7fcac2dad:/usr/share/nginx/html# rm index.html
root@f1b7fcac2dad:/usr/share/nginx/html# echo hello nginx_web2 ninetySeven > index.html
root@f1b7fcac2dad:/usr/share/nginx/html# exit
先查看容器
[root@iZbp18vj2il5rgv6uy66xxZ www]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1b7fcac2dad nginx "/docker-entrypoint.…" 4 minutes ago Up About a minute 0.0.0.0:8081->80/tcp, :::8081->80/tcp nginx_web2
9f88cab79ac8 nginx "/docker-entrypoint.…" 10 minutes ago Up 49 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx_web1
如果exit退出后容器没有运行 先启动两个nginx容器再执行启动服务命令
报502错就执行一下命令即可
[root@iZbp18vj2il5rgv6uy66xxZ ~]# docker start f1b7fcac2dad
f1b7fcac2dad
[root@iZbp18vj2il5rgv6uy66xxZ ~]# docker start 9f88cab79ac8
9f88cab79ac8
[root@iZbp18vj2il5rgv6uy66xxZ ~]# docker exec -d f1b7fcac2dad service nginx start
[root@iZbp18vj2il5rgv6uy66xxZ ~]# docker exec -d 9f88cab79ac8 service nginx start
三、配置宿主机nginx文件
方式一:命令行操作(推荐)
[root@iZbp18vj2il5rgv6uy66xxZ /]# cd /www/server/nginx/conf/
[root@iZbp18vj2il5rgv6uy66xxZ conf]# vim nginx.conf
方式二:打开宝塔面板找到nginx管理(软件商店找到nginx 设置配置文件)
在http段加入以下代码
// 使用宝塔配置时 要是用一个只解析没有绑定站点的域名 否则会报错
// nginx.fsc.fit 自己服务器的域名
upstream nginx.fsc.fit的域名 {
server 自己服务器IP地址:8080 weight=10;
server 自己服务器IP地址:8081 weight=20;
}
server{
listen 80;
server_name nginx.fsc.fit;
location / {
proxy_pass http://nginx.fsc.fit;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
适用宝塔直接重启nginx服务
或者使用命令行
[root@iZbp18vj2il5rgv6uy66xxZ ~]# systemctl restart nginx.service
查看Nginx容器运行状态
注:如果是线上服务器,则需要在服务器和宝塔界面开启端口
服务器配置端口
宝塔配置端口
四、测试
以上基于docker实现nginx负载成功!!!