mac下docker搭建nginx+php+mysql,并实现nginx负载均衡

一 环境

  • 系统:macOS Sonoma 14.3
  • 芯片:Apple M3 Pro
  • docker 版本:25.0.5

二 软件

  • OrbStack [推荐,一款轻量化的docker管理软件,还是docker的命令]
  • item2

三 步骤

  1. 拉取 nginx 镜像
docker pull nginx
  1. 新建一个 nginx 容器
docker run --name nginx5 -d -p 80:80 nginx 
  1. 确认 nginx 内部的目录 [第一次一定要确认下目录]
- 配置目录 /etc/nginx
- 文件目录 /usr/share/nginx
- 日志目录 /var/log/nginx 
  1. 将上面的需要挂载到本地的文件夹,先拷贝一份到本地
docker cp nginx5:/etc/nginx       /Users/zq/Desktop/03-work_record/2024/0412/docker/nginx
docker cp nginx5:/usr/share/nginx /Users/zq/Desktop/03-work_record/2024/0412/docker/www
docker cp nginx5:/var/log/nginx   /Users/zq/Desktop/03-work_record/2024/0412/docker/log
  1. 关闭nginx5 然后删除. 上面的步骤,是为了确认目录和挂载目录。
docker stop nginx5
docker rm nginx5
  1. 新建 php 容器并挂载到本地,注意php容器中的目录:“/var/www/html”. [注意:‘/var/www/html’ 这个目录,如果不确认,可以先建一个容器查看下,然后删除。]
docker pull php:7.4-fpmdocker run --name myphp -d -v /Users/zq/Desktop/03-work_record/2024/0412/docker/www/nginx/html:/var/www/html php:7.4-fpm
  1. 新建容器nginx5,并挂载上面文件夹 .[注意看具体位置,在目录下都多了一个nginx,挂载的时候,注意加上]
docker run --name nginx10-p 80:80// 文件目录-v /Users/zq/Desktop/03-work_record/2024/0412/docker/www/nginx/html:/usr/share/nginx/html // nginx配置目录-v /Users/zq/Desktop/03-work_record/2024/0412/docker/nginx/nginx:/etc/nginx // 日志目录-v /Users/zq/Desktop/03-work_record/2024/0412/docker/log/nginx:/var/log/nginx // 和php关联上--link myphp:php  -d nginx# 用下面运行
docker run --name nginx10 -p 80:80 -v /Users/zq/Desktop/03-work_record/2024/0412/docker/www/nginx/html:/usr/share/nginx/html -v /Users/zq/Desktop/03-work_record/2024/0412/docker/nginx/nginx:/etc/nginx -v /Users/zq/Desktop/03-work_record/2024/0412/docker/log/nginx:/var/log/nginx --link myphp:php -d nginx

注意:–link myphp:php 和 myphp 容器关联上

  1. 修改nginx配置
vim /etc/nginx/conf.d/default.conf location ~ \.php$ {
#    root           html;fastcgi_pass   myphp:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;include        fastcgi_params;
}

注意 :
1、fastcgi_pass 指定为 php 容器名字:端口
2、fastcgi_param 参数 SCRIPT_FILENAME 要设置为 php容器中的目录地址$fastcgi_script_name, 我这里php容器的代码地址是 /var/www/html, 也挂载到本地了, 和nginx挂载的位置是一个位置. 所以可以访问到. 这一步非常关键.

  1. 重启nginx容器
docker restart nginx5
  1. 安装mysql
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
  1. 安装redis
docker run --name redis -d redis:5.0

四 nginx负载均衡

  1. 按照上述步骤,新建3个 nginx 的容器,例如 nginx1,nginx2,nginx3。分别查看nginx1,nginx2,nginx3的ip地址。
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1  
# 192.168.228.2
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx2
# 192.168.228.3
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx3
# 192.168.228.4
  1. 本地添加测试域名,指向 nginx1的地址
sudo vim /etc/hostswww.test.com 192.168.228.2
  1. 在 nginx1 的 /etc/nginx/conf.d 下,新建 负载均衡的文件 slb.conf
upstream test {server 192.168.228.2:81 weight=3 fail_timeout=3s max_fails=3;	    server 192.168.228.3:81 weight=3 fail_timeout=3s max_fails=3;server 192.168.228.4:81 weight=4 fail_timeout=3s max_fails=3;
}server {listen  80;listen  443 ssl http2;server_name  www.test.com;if ($scheme != https) {rewrite ^(.*)$  https://$host$1 permanent;}ssl_certificate /etc/nginx/cert/nanfei/nanfei.chery.test.pem;ssl_certificate_key /etc/nginx/cert/nanfei/nanfei.chery.test-key.pem;ssl_protocols TLSv1.2;ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;add_header Strict-Transport-Security "max-age=31536000";error_page 497  https://$host$request_uri;location / {proxy_pass http://test;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_ssl_session_reuse off;proxy_ssl_server_name on;proxy_ssl_name $proxy_host;proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";}
}

如上,www.test.com 通过默认的80进来之后,会被接受,并打到 upstream test 中。然后代理到 3台服务器的 81端口上。所以,在3台电脑上,都需要加上一个 test.conf 文件,其中是监听81 端口。

  1. test.conf
server {listen       81;listen  [::]:81;server_name  www.test.com;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/test;index index.php index.html index.htm default.php default.htm default.html;}#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效include /etc/nginx/rewrite/yinni/test.conf;#REWRITE-END#禁止访问的文件或目录location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md){return 404;}#一键申请SSL证书验证目录相关设置location ~ \.well-known{allow all;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${expires      30d;error_log /dev/null;access_log /dev/null;}location ~ .*\.(js|css)?${expires      12h;error_log /dev/null;access_log /dev/null; }access_log /etc/nginx/log/test/test.log;error_log  /etc/nginx/log/test/test.error.log;
}

五 docker 常用的一些命令

// 新建网络
docker network create my-nginx-network// 新建容器[相同网络]
docker run -d --name nginx1 -p 8081:80 --network=my-nginx-network --label my-label nginx
docker run -d --name nginx2 -p 8082:80 --network=my-nginx-network --label my-label nginx
docker run -d --name nginx3 -p 8083:80 --network=my-nginx-network --label my-label nginxdocker run -d --name myphp -p 9000:9000 --network=my-nginx-network php:7.4-fpm
docker run -d --name nginx4 -p 8084:80 --network=my-nginx-network --label my-label --link myphp:php nginx// 拷贝配置[可选]
docker cp /Users/zq/Desktop/02-daywork/01-daily_work/nginx.conf nginx1:/etc/nginx/conf.d/nginx.conf
docker cp /Users/zq/Desktop/02-daywork/01-daily_work/nginx.conf nginx2:/etc/nginx/conf.d/nginx.conf// 重启容器
docker restart nginx1
docker restart nginx2// 查询ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx2
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx3

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

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

相关文章

openjudge_2.5基本算法之搜索_1789:算24

题目 1789:算24 总时间限制: 3000ms 内存限制: 65536kB 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结…

工控 modbusTCP 报文

Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 Rx 接收报文:00 C9 00 00 00 07 01 03 04 01 4D 00 01 Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 00 C9 事务处理标识符 2字节 00 00 协议标识符 2字节 固定 00 00 00 06 长度 2字节 表示之后的字节总数 (…

大数据之ClickHouse

大数据之ClickHouse 简介 ClickHouse是一种列式数据库管理系统,专门用于高性能数据分析和数据仓库应用。它是一个开源的数据库系统,最初由俄罗斯搜索引擎公司Yandex开发,用于满足大规模数据分析和报告的需求。 特点 开源的列式存储数据库…

elementUI 下拉框加提示文案

效果如下&#xff1a; 展示文案在最下面&#xff0c;跟选项有个分割线 <el-select v-model"value" placeholder"请选择" clearable popper-class"addNotice" class"addNoticeS" visible-change"(v) >selectNotice(v,展示…

Testng测试框架(7)--测试运行

忽略测试 TestNG可以让你忽略类、特殊包、包及其子中的所有Test方法。 当在测试方法级别使用Ignore 注解&#xff0c;在功能上与Test(enabledfalse).一样。 以下例子将忽略类中所有tests。 import org.testng.annotations.Ignore; import org.testng.annotations.Test; Ign…

秦朗丢寒假作业系摆拍 博主被处罚

大家好&#xff01; 我是老洪&#xff0c;刚看到秦朗丢寒假作业系摆拍博主被处罚。 据央视财经媒体报道&#xff0c;近期&#xff0c;“秦朗丢寒假作业”事件被证实为自导自编的摆拍视频。 图片来源央视财经公众号截图 该博主与同事薛某&#xff0c;为了吸引更多的粉丝和流量&a…

Lua语法(二)——闭包/日期和时间

参考链接: 系列链接: Lua语法(一) 系列链接: Lua语法(二)——闭包/日期和时间 系列链接: Lua语法(三)——元表与元方法 系列链接: Lua语法(四)——协程 系列链接: Lua语法(五)——垃圾回收 系列链接: Lua语法(六)——面相对象编程 Lua语法 目录二 概述闭包模块和包模块和包相关…

基于SSM的旅游管理系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对旅游信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&am…

Go语言中忘记字符串格式化可能产生的副作用

格式化字符串是开发人员经常要进行操作,无论是返回错误还是记录消息。但在处理并发应用程序时,开发人员很容易忘记字符串格式化带来的潜在副作用。下面将看到两个具体示例:一个是读取etcd存储导致数据竞争,另一个是导致死锁的情况。 1. etcd数据竞争 etcd是一个用Go实现的…

解决cmd输入py文件路径不能执行,使用anaconda prompt 能执行

究其原因&#xff0c;是因为没有配置环境&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 第一步&#xff1a;配置环境变量 操作步骤如下&#xff1a; 1、右击此电脑 ---->属性 2、高级系统设置 3、点击环境变量 4、选择 …

代码随想录--数组--长度最小的子数组

题目 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3] 输出&#…

Java学习笔记03:核心类

4.1 基本类型的封装类 // 字符串转int Integer obj new Intreger("10"); int n new Integer("10"); int num Integer.parseInt("10"); // 字符串转float float fl loat.parseFloat("10.0"); float f2 new Float("10.0"…

【论文笔记】ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting

Abstract 提出了ResRep&#xff0c;一种无损通道修剪的新方法&#xff0c;它通过减少卷积层的宽度&#xff08;输出通道数&#xff09;来缩小CNN的尺寸。 建议将CNN重新参数化为记忆部分和遗忘部分&#xff0c;前者学习保持性能&#xff0c;后者学习修剪。通过对前者使用常规 …

[BT]BUUCTF刷题第16天(4.12)

第16天 Web [MRCTF2020]Ezpop 打开网站就是一段泄露的源代码&#xff1a; <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack…

「49」一拆为九,探索直播内容的商业价值

「49」拆分变现:一拆为九探索直播内容的商业价值 直播已经成为现代社交互动的热门方式,然而,直播内容一经结束,是否可以为我们带来更多的价值? 这篇文章将探究如何发挥创意,将直播内容变现为多种形式,例如电子书、实体书、课程和短视频、文章、音频等,让我们一起来一…

数字化转型(二)-华为发布的数字化转型:从战略到执行

个人认为这是一篇很好&#xff0c;值得看的文章&#xff0c;但是没啥大用&#xff0c;可供参考。 数字化转型是一个复杂而全面的过程&#xff0c;它涉及到从战略规划到具体执行的多个层面。根据提供的信息&#xff0c;我们可以从以下几个方面来理解和探讨数字化转型的从战略到执…

文件名乱码危机:数据恢复全攻略

在数字化时代的浪潮中&#xff0c;电脑文件成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;有时我们会突然遭遇一个令人头疼的问题&#xff1a;原本清晰易读的文件名突然变成了乱码。这些乱码文件名不仅让我们无法准确识别文件内容&#xff0c;更可能意味着数据丢…

时间序列分析 # 平稳性检验和ARMA模型的识别与定阶 #R语言

掌握单位根检验的原理并能解读结果&#xff1b;掌握利用序列的自相关图和偏自相关图识别模型并进行初步定阶。 原始数据在文末&#xff01;&#xff01;&#xff01; 练习1、根据某1971年9月-1993年6月澳大利亚季度常住人口变动&#xff08;单位&#xff1a;千人&#xff09;的…

一个开源跨平台嵌入式USB设备协议:TinyUSB

概述 TinyUSB 是一个用于嵌入式系统的开源跨平台 USB 主机/设备堆栈&#xff0c;设计为内存安全&#xff0c;无需动态分配&#xff0c;线程安全&#xff0c;所有中断事件都被推迟&#xff0c;然后在非 ISR 任务函数中处理。查看在线文档以获取更多详细信息。 源码链接&#xff…

Redis从入门到精通(十五)Redis分布式缓存(三)Redis分片集群的搭建和原理分析

文章目录 前言5.4 分片集群5.4.1 搭建分片集群5.4.2 散列插槽5.4.3 集群伸缩5.4.3.1 需求分析5.4.3.2 创建新的Redis实例5.4.3.3 添加新节点到Redis集群5.4.3.4 转移插槽 5.4.4 故障转移5.4.4.1 自动故障转移5.4.4.2 手动故障转移 5.4.5 RedisTemplate 5.5 小结 前言 Redis分布…