Docker 部署 Nginx 实现一个极简的 负载均衡

背景: Nginx是异步框架的网页服务器,其常用作反向代理(负载均衡器)。在一般的小项目中, 服务器不多, 如果不考虑使用服务注册与发现, 使用Nginx 可以容易实现负载均衡。 在特此写一个快速入门 Nginx 的技术贴, 使用 Docker 部署 Nginx, 实现一个极简的加权轮询负载均衡。

Docker 中 安装 Nginx

首先需要在docker 中拉取 nginx 镜像,命令行输入:

 

复制代码

docker pull nginx:latest

使用 latest 标签会拉取最新的稳定版镜像

拉取成功后使用下面这行命令应该可以看到 nginx:latest 的镜像

 

复制代码

docker images

随后根据镜像创建容器, 命令行输入

 

css

复制代码

docker run -d --name mynginx -p 30001:80 nginx:latest

这将在后台运行一个 名为 mynginx 的 nginx 容器, 容器外宿主机的 30001 端口映射到容器内部的 80端口。

安装成功后在浏览器输入: http://localhost:30001/,如果看到 Welcome to nginx 的字样说明Nginx 部署成功:

cdeb05e40d78d4a6531fa816c565281.png

写一个极简的 后端 handler

新建 一个 nginx_demo 目录 命令行输入

 

go

复制代码

go mod init nginx_demo go mod tidy

然后 在 nginx_demo 目录下新建一个 server.go 文件:

 

go

复制代码

package main import ( "fmt" "net/http" ) func HelloHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello From XX.XX.XX.XX.")) # 替换成docker 容器的 IP地址 } func main() { http.HandleFunc("/hello", HelloHandler) errChan := make(chan error) go func() { errChan <- http.ListenAndServe(":20001", nil) }() err := <-errChan if err != nil { fmt.Println("Hello server stop running.") } }

特别注意的是第九行, 需要替换成docker 容器的IP地址, 因为等一会我们需要将这个 go 工程部署到不同的机器上去(docker 容器中), 为了展现效果, 这里直接把IP地址打印出来。

部署 Nginx 和 Go 工程到 docker 中

部署 go 工程

首先我把 这个 go 工程部署到两给不同的 go 容器中去

如何 docker 中搭建 go 开发环境可以参考我的另一篇 文章: 保姆级从0到1讲解go远程开发环境搭建(从Docker安装到使用Goland远程部署和调试)

部署的方式如下表所示:

IP端口映射 (宿主机 -> docker 容器)http 监听端口
127.17.0.43333 -> 2220001
127.17.0.34444 -> 2220001

想要查看 容器 IP 可以输入下面这条命令

 

scss

复制代码

docker inspect 容器ID(或者容器名)

查看 IPAddress 字段就是 容器 IP

部署 Nginx
更改配置文件

刚才上面已经启动了 Nginx , 我们需要改的只是配置文件

使用 docker cp 命令将 容器内默认的配置文件 复制出来

 

bash

复制代码

docker cp mynginx:/etc/nginx/nginx.conf nginx.conf

复制出来的配置文件大概长这样:

 

conf

复制代码

user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }

我们修改后长这样:

 

ini

复制代码

user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; (必须把这下面行注释掉, 否则会去拉取默认的配置, 导致这个文件的修改不生效) #include /etc/nginx/conf.d/*.conf; upstream RoundWeightLoadBalancer { # 加权 轮询 负载均衡 server 172.17.0.4:20001 weight=1; server 172.17.0.3:20001 weight=2; } server { listen 80; server_name localhost; location / { proxy_pass http://RoundWeightLoadBalancer ; } } }

主要修改了下面几个地方:

1. 注释了 include /etc/nginx/conf.d/*.conf;

这是一个大坑, 如果不注释, 则会去拉取默认的配置, 导致这个文件的修改不生效。我曾就是在这里被坑了一个星期,最后才发现原来是这里出错。

2. 新建了 upStream 标签

upstream 标签后面跟 负载均衡器 的名字, 可以自定义。标签内加 server + IP + 端口。我这里在后面还加了 weight 表示权重。我这里演示的是最简单的轮询加权, 也就是请求一个个按顺序被分配到不同的机器上, 其中 172.17.0.4 机器会被访问到1次, 172.17.0.3 会被访问到两次(因为权重比是1比2). 当然还有别的负载均衡方式, 可以访问 Nginx 的官方文档, 我这里主要关注与快速上手Nginx, 所以就选了给最简单最容易看出效果的 加权轮询策略。

3. 新增了 server 标签

server 标签 主要定义了三件事

  • 监听端口
  • server name,因为是部署到本地, 直接使用localhost
  • location 定义了转发规则, 比如 / 表示将所有请求直接进行转发, 转发到 upstream 标签定义的 RoundWeightLoadBalancer 负载均衡规则

有个很坑的地方: 如果 后端的handler 不位于 docker 容器内, 而是在宿主机, 这就涉及到了了 Nginx 容器如何往外通信的问题. 可以这么写 proxy_pass:

 

bash

复制代码

proxy_pass http://host.docker.internal:20001/hellou;

使用 host.docker.internal将Nginx的请求转发回宿主机。

重启 Nginx

首先将保存好的 配置文件 复制到 docker 容器中

 

bash

复制代码

docker cp nginx.conf mynginx:/etc/nginx/nginx.conf

随后重启 Nginx

 

复制代码

nginx -s reload

运行 起来

在 两个 go 工程的目录下(容器中) 命令行输入

 

go

复制代码

go mod tidy go run server.go

宿主机 中打开 Postman 或者 浏览器输入 :http://localhost:30001/hello

image.png

1671370480036.png

来自于 Hello From 127.17.0.3 和 Hello From 127.17.0.4 的响应会交替出现, 其中Hello From 127.17.0.3的 响应会连续出现两次, Hello From 127.17.0.4的响应只会出现一次, 这和 1比2 的轮询权重是相符合的。

回顾一下转发过程

宿主机的 30001 端口的请求打到 Nginx 容器的 80端口, Nginx 监听 80端口, 将 / 对应的所有请求转发到 127.17.0.3:20001 和 127.17.0.4:20001, 转发比例为1比2.

巨人的肩膀

www.nginx.com/blog/choosi…

juejin.cn/post/714732…

blog.51cto.com/u_437549/43…

  下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux 6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 10、开放性测试题,11、安全测试,12、计算机基础

​编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现在的原创内容博客 SEO 最好就选谷歌和必应!

当我们在国内讨论搜索引擎优化的时候&#xff0c;我们经常讨论的是百度 SEO&#xff0c;很少提及 Bing 搜索与 Google 搜索&#xff0c;但随着跨境电商的崛起&#xff0c;在国内做外贸 SEO 的小伙伴越来越多&#xff0c;有效的了解 Bing 搜索与 Google 搜索的优化规则是很有必要…

开源aodh学习小结

1 介绍 aodh是openstack监控服务&#xff08;Telemetry&#xff09;下的一个模块&#xff0c;telemetry下还有一个模块ceilometer OpenStack Docs: 2024.1 Administrator Guides Get Started on the Open Source Cloud Platform - OpenStack Telemetry - OpenStack 1.1 代码仓…

softmax函数与交叉熵损失详解

文章目录 一、softmax函数1.1 引入指数形式的优点1.2 引入指数形式的缺点 二、交叉熵损失函数2.1 交叉熵损失函数2.2 softmax与交叉熵损失 参考资料 一、softmax函数 softmax用于多分类过程中&#xff0c;它将多个神经元的输出&#xff0c;映射到&#xff08;0,1&#xff09;区…

【C++ 内存管理】深拷贝和浅拷贝你了解吗?

文章目录 1.深拷贝2.浅拷贝3.深拷贝和浅拷贝 1.深拷贝 &#x1f34e; 深拷⻉: 是对对象的完全独⽴复制&#xff0c;包括对象内部动态分配的资源。在深拷⻉中&#xff0c;不仅复制对象的值&#xff0c;还会复制对象所指向的堆上的数据。 特点&#xff1a; &#x1f427;① 复制对…

记录一下 log4j的漏洞

目录 背景 bug的产生 bug复现 JNDI 网络安全学习路线 &#xff08;2024最新整理&#xff09; 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 背景 log4j这次的bug&#xff0c;我相信大家都已经知道了&#xff0c;仅以…

【unity小技巧】减少Unity中的构建打包大小

文章目录 正常默认打包查看编辑器打包日志压缩图片压缩网格模型压缩贴图压缩音频文件只打64位包最终大小完结 正常默认打包 这里以安卓为例。先什么都不干&#xff0c;直接打包安卓apk&#xff0c;查看包大小 查看编辑器打包日志 搜索build report构建报告。构建报告我们应该…

Pytorch学习-引言

Pytorch相关链接 Pytorch官方网站 https://pytorch.org/ Pytorch的Github仓库 https://github.com/pytorch/pytorch Pytorch论坛 https://discuss.pytorch.org/ Pytorch离线下载包链接 https://download.pytorch.org/whl/torch_stable.html Pytorch学习视频推荐链接 http://【…

手写一个SPI FLASH 读写擦除控制器

文章目录 flash读写数据的特点1. 扇擦除SE&#xff08;Sector Erase&#xff09;1.1 flash_se 模块设计1.1.1 信号连接示意图&#xff1a;1.1.2 SE状态机1.1.3 波形图设计&#xff1a;1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图&#xff1a;…

JavaScript 对象入门:基础用法全解析

目录 对象 语法 属性和访问 方法和调用 this关键字 null 遍历对象 内置对象 Math 属性 方法 Date 创建日期对象 获取和设置日期 ⭐对象 对象是 JavaScript 数据类型的一种&#xff0c;数据类型也包括数值类型、字符串类型、布尔类型、undefined。对象数据类型可…

程序员之路:裁员与内卷下的生存之道

作为一名普通的程序员&#xff0c;身处这个瞬息万变的IT行业&#xff0c;面对着今年不断加剧的裁员浪潮和日益激烈的内卷竞争&#xff0c;我时常感到焦虑和不安。然而&#xff0c;正是这些挑战&#xff0c;让我们更加深入地思考了在这个行业中&#xff0c;我们该如何找到自己的…

2024统计建模中国新质生产力统计测度与时空演变及其驱动因素研究

高质量成品论文46页word版本1.5w字书写完整数据集1000行py代码一等奖论文&#xff01;这里仅展示部分内容&#xff0c;完整版在下面的链接。 【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/ 中国新质生产…

【2024HNCTF】密码组部分出题记录

2024H&NCTF 密码组部分出题记录 题目&#xff1a;BabyPQ、HappyDance 文章目录 2024H&NCTF 密码组部分出题记录BabyPQ | 签到HappyDance BabyPQ | 签到 本题为nc交互题&#xff0c;之所以采用这种形式&#xff0c;是因为可能有很多密码新师傅们不了解这种赛题形式&a…

AI机器人火了,探讨早就可以帮我们开拓市场的中关村科金语音机器人

近期AI机器人给我们带来了不少惊喜&#xff0c;比如国外 Figuer 联合 OpenAI 做了 Chatgpt 机器人&#xff0c;可以通过对话后推理干活&#xff0c;国内仿生机器人员工也开始量产&#xff0c;看到AI机器人不禁想到会不会替代我们的工作&#xff1f;我们了解到很多机器人厂家的…

#初阶模板

目录 1.泛型编程 2.模板 &#xff08;1&#xff09;函数模板 &#xff08;2&#xff09;举个栗子&#xff08;模板的使用&#xff09; 1.模板的声明有两种形式 2.函数模板的原理 &#xff08;3&#xff09;模板参数的匹配原则 &#xff08;4&#xff09;类模板 类模板…

AI图像生成-原理

一、图像生成流程总结 【AI绘画】深入理解Stable Diffusion&#xff01;站内首个深入教程&#xff0c;30分钟从原理到模型训练 买不到的课程_哔哩哔哩_bilibili 二、如果只是用comfy UI生成图片 1、找到下面几个文件&#xff0c;把对应模型移动到对应文件夹即可使用 2、选择对…

大学c语言基础很差,能不能学51单片机?会不会很困难?

开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些51单片机学习方法和资料&#xff0c;让我不断提升自己&#xff0c;感谢帮助过我的人&#xff0c; 如大家和我一样…

python turtle 升国旗

​一、导语 大家好,前段时间,我们画出了五星红旗,今天我们要用Python的Turtle库来绘制一个五星红旗,并让国旗上升,让我们一起来感受编程与艺术的完美结合吧!领略国家的强大!爱祖国,做一个遵纪守法的好公民。 二、效果展示 升国旗 三、开发过程 一、准备工作 首先我们…

OpenAI深夜震撼发布最新模型GPT-4o,送上最快速便捷教程

北京时间5月14日凌晨&#xff0c;有人说OpenAI一夜改变了历史。 在我们的深夜、太平洋时间的上午 10 点&#xff0c;OpenAI 召开春季发布会&#xff0c;公布了最新的GPT-4o模型&#xff0c;o代表Omnimodel&#xff08;全能模型&#xff09;。20多分钟的演示直播&#xff0c;展…

美国加州正测试ChatGPT等生成式AI,在4大部门应用

5月11日&#xff0c;美联社消息&#xff0c;美国加州政府正在测试ChatGPT等生成式AI&#xff0c;应用在税收和收费管理部、交通部、公共卫生部以及卫生与公众服务部4大部门。 测试时间6个月&#xff0c;为其提供技术支持的一共有5家公司&#xff0c;分别是OpenAI、Anthropic、…

成都新增数字产业园,打造生态经济新引擎

成都产业园运营方树莓集团——数字产业生态链建设者。秉持高效、友善、敢为的集团核心文化&#xff0c;有效链接政、产、企、校四个板块&#xff0c;构建了产业生态闭环系统。在成都市区内&#xff0c;已布局了多家数字文创产业园&#xff0c;其中具有代表性的参考国际数字影像…