用docker搭建nginx负载均衡测试环境

昨天收了一篇好文章 nginx常用功能全揭秘,想着今天来按照步骤配置一下nginx代理的,结果在使用docker的时候一直出问题,才诞生了这篇关于docker配置nginx负载均衡。

首先在宿主机上创建两个两个目录n1,n2,分别作为两台nginx服务器的目录。

mkdir -p n1 n2

然后分别在目录里新建一个index.html文件,并输入内容作为nginx集群配置成功的后页面呈现的标识。

cd n1 && echo ‘this is n1‘ >> index.htmlcd n2 && echo ‘this is n2‘ >> index.html

3.按照教程预先在集群中部署两台nginx的目标服务器d的容器

docker run --name nginx1 -d -p 8081:80 -v /Users/道长/Desktop/wwwphp/nginx/n1:/usr/share/nginx/html --link nginx:nginx nginx

docker run --name nginx2 -d -p 8081:80 -v /Users/道长/Desktop/wwwphp/nginx/n2:/usr/share/nginx/html --link nginx:nginx nginx

4.然后我们再创建一个nginx的代理服务器
docker run --name nginx -d -p 8080:80 nginx

5.修改我们nginx的配置文件,分别在upstream和server里配置好我们的两个目标服务器,结果你会发现页面直接呈现的是 “502 Bad Gateway”,当处理到这里的时候,我是直接蒙圈了,明明配置的是对的,为啥会出现这种无法访问的情况呢,然后我们用 docker logs nginx 查看nginx代理容器的的日志,你会发现有如下提示:

"1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "http://172.17.0.3:8082/", host: "localhost:8080"
2018/11/24 10:10:10 [warn] 6#6:
1 upstream server temporarily disabled while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "http://172.17.0.3:8082/", host: "localhost:8080"
2018/11/24 10:10:11 [error] 6#6: 1 no live upstreams while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET /favicon.ico HTTP/1.1", upstream: "http://tomcatserver1/favicon.ico", host: "localhost:8080", referrer: "http://localhost:8080/"
172.17.0.1 - - [24/Nov/2018:10:10:11 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" "-"
2018/11/24 10:10:11 [error] 6#6:
1 no live upstreams while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "http://tomcatserver1/", host: "localhost:8080"

我们初步怀疑是网络不通的原因,用 docker exec -it nginx /bin/bash 进入到nginx代理容器里,去试着ping一下nginx是否通畅,这个时候你就会发现神奇的一幕,我们的nginx容器里居然没有 ping 的命令,在用yum来安装一下吧,纳尼?yum命令也没有。是不是有些崩溃,有些想卸载docker了,请施主稍安勿躁,既然nginx的容器这么干净,那么我们就创建一个centos的容器来用centos容器ping来ping nginx 的容器,结果你回发现如我们猜想的一样,果然是容器间通信造成的。

此时我们的解决办法如下(原理方法请参考 Docker容器学习梳理--容器间网络通信设置):

1.搭建一个网桥 docker network create bri1

2.删除原docker容器,然后重新创建新的nginx容器,命令如下

docker run --name nginx-test1 -d -p 8081:80 --network bri1 -v /Users/amber/Desktop/wwwphp/nginx/n1:/usr/share/nginx/html --link nginx:nginx nginx

docker run --name nginx-test2 -d -p 8082:80 --network bri1 -v /Users/amber/Desktop/wwwphp/nginx/n2:/usr/share/nginx/html --link nginx:nginx nginx

docker run --name nginx -d -p 8080:80 --network bri1 -v /Users/amber/Desktop/wwwphp/nginx:/etc/nginx/conf.d nginx

docker run --name nginx -d -p 8080:80 --network bri1 nginx
docker run --name centos -itd --network bri1 centos

3.创建完成之后,我们 docker inspect nginx|grep IPAdress 来查看我们的nginx代理的ip地址,然后 docker exec -it centos /bin/bash 进入到centos容器里用ping命令来来ping我们nginx代理的ip地址 我本机nginx容器的ip为172.12.0.2 所以我们 ping 172.12.0.2 此时我们发现可以ping通,此刻我们已经距离成功不远了。

然后我们再修改nginx的配置文件

 upstream tomcatserver1 {
    ip_hash
    server 172.20.0.2:8081;
    server 172.20.0.3:8082;
 }
server {
    listen       80;
    server_name  127.0.0.1;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location / {
        proxy_pass   http://tomcatserver1;
        index  index.html index.htm;
    }
}

此刻我们重启nginx代理,会发现依旧不成功,为什么呢?配置是ok的,然后容器间也可以相互通信了,难道是端口??? 此刻我们进入到centos容器里然后用 curl 172.12.0.2:8081curl 172.12.0.2 来获取我们目标服务器的内容,我们会发现没有加端口号的居然成功了,原来我们再创建容器的时候设置了 "-p 8081:80"里面的8081只是我们的docker在监听我们本机的端口,你在宿主机上用 lsof -i:8081就会发现监听的进程,而我们容器间的通信走的是bri1的网桥,并没有经过我们的宿主机端口,所以我们只需要把代理服务器的upstream里的主机修改成

upstream nginx_proxy{
ip_hash
server 172.12.0.2;
server 172.12.0.3;
}

最后再重启我们的代理服务器,大功告成,每刷新一次,就会切切换集群中的nginx服务器。期间发现了另一篇好文负载均衡器技术Nginx和F5的优缺点对比,有兴趣的朋友可以看一看,欢迎感兴趣的朋友一起切磋交流 QQ:591382275(密码:王道长),在此感谢我师傅和亮哥的指导。

原文地址:http://blog.51cto.com/12165603/2321582

时间: 2024-11-10 07:28:12

用docker搭建nginx负载均衡测试环境的相关文章

docker 搭建 nginx负载均衡

本文描述如何在一台机器上搭建nginx负载均衡,我将会启动3个nginx的docker,分别是1台前置nginx负责分发,后面2台负责处理请求. 首先我切换到/usr/local/docker/文件夹下,这个文件夹是专门用来做docker映射文件夹用的,docker里的重要的文件夹会映射到这里,在这里执行 mkdir nginx mkdir nginx01 mkdir nginx02 nginx下存储的是前置nginx的文件 nginx01和nginx02负责存储后边两台nginx服务器的文件

CentOS系统搭建Nginx负载均衡

一.关于CentOS系统介绍 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成.基于Red Hat持续升级,和对已知BUG修复,所以CentOS更多用于搭建大型企业级服务器.目前较新版本为7.0,本文使用CentOS7 64bit进行搭建系统负载均衡. 二.安装VMWare VMWare (Virtual

Net分布式系统之二:CentOS系统搭建Nginx负载均衡

一.关于CentOS系统介绍 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成.基于Red Hat持续升级,和对已知BUG修复,所以CentOS更多用于搭建大型企业级服务器.目前较新版本为7.0,本文使用CentOS7 64bit进行搭建系统负载均衡. 二.安装VMWare VMWare (Virtual

Linux学习10-CentOS搭建nginx负载均衡环境

前言 当自己的web网站访问的人越来越多,一台服务器无法满足现有的业务时,此时会想到多加几台服务器来实现负载均衡. 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,怎样将同一个域名的访问分散到两台或更多的机器上呢?这就需要用nginx来配置负载均衡的环境了. 以多个tomcat服务为例,用nginx配置管理多个tomcat服务 什么是负载均衡 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可

搭建Nginx负载均衡服务文档一

搭建负载均衡服务的实际需求: 1.把单台服务器无法承受的大规模并发访问或数据流量分担到多台节点设备上,分别进行处理,减少用户等待响应的时间,提升用户体验. 2.单个重负载的运算分担到多台节点设备上做并行处理,每个节点处理结束后,将结果汇总,返回给用户. 3.7*24小时的服务保证,任意一个或多个有限后面节点设备宕机,不能影响业务. 实现Nginx负载均衡需要两个组件: l  Ngx_http_proxy_module,用于把请求后抛给服务器节点或upstream服务器池: l  Ngx_http

Docker 安装 Nginx 负载均衡配置

Docker 安装 # 1)安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 2)添加Docker软件包源(否则doker安装的不是新版本) yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 3)安装Docker CE yum install -y docker-ce # 4)启动Doc

FastDFS分布式文件系统&Nginx负载均衡最小环境安装配置[超级详解]

1.背景 FastDFS 是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.该开源项目的主页是 http://code.google.com/p/fastdfs .可以通过 fastdfs.sourceforge.net 下载.FastDFS论坛是 http://www.csource.org ,目前是指向 ChinaUnix 开源项目孵化平台的一个板块 FastDFS,网址为 bbs.chinaunix.net/forum-24

Centos 7搭建Nginx负载均衡,最简单。

1.安装Nginx 1.1.下载Nginx安装包 Nginx 官网(https://nginx.org) 本次选择的是nginx-1.6.3.tar.gz版本,安装环境是centos7. 然后把下载好的安装包通过SecureCRT工具上传至Centos7中或者使用wget命令下载安装包 #下载nginx-1.6.3.tar.gzwget -c https://nginx.org/download/nginx-1.6.3.tar.gz 若是出现下面的提示 -bash: wget: command 

KVM虚拟化搭建nginx负载均衡 和lamp 架构(三 nginx负载均衡)

nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的. 依赖包及工具 yum install -y wget gcc pcre-devel zlib-devel zlib nginx下载地址  http://nginx.org/en/download.html 第一步 安装nginx 下载 # cd /usr/local/src/ # wget http://nginx.org/download/nginx-1.10.0.tar.gz 解压 # tar