
mac下docker搭建nginx+php+mysql,并实现nginx负载均衡
mac下用docker搭建nginx+php+mysql,并分享nginx负载均衡的用法
·
一 环境
- 系统:macOS Sonoma 14.3
- 芯片:Apple M3 Pro
- docker 版本:25.0.5
二 软件
- OrbStack [推荐,一款轻量化的docker管理软件,还是docker的命令]
- item2
三 步骤
- 拉取 nginx 镜像
docker pull nginx
- 新建一个 nginx 容器
docker run --name nginx5 -d -p 80:80 nginx
- 确认 nginx 内部的目录 [第一次一定要确认下目录]
- 配置目录 /etc/nginx
- 文件目录 /usr/share/nginx
- 日志目录 /var/log/nginx
- 将上面的需要挂载到本地的文件夹,先拷贝一份到本地
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
- 关闭nginx5 然后删除. 上面的步骤,是为了确认目录和挂载目录。
docker stop nginx5
docker rm nginx5
- 新建 php 容器并挂载到本地,注意php容器中的目录:“/var/www/html”. [注意:‘/var/www/html’ 这个目录,如果不确认,可以先建一个容器查看下,然后删除。]
docker pull php:7.4-fpm
docker run --name myphp -d -v /Users/zq/Desktop/03-work_record/2024/0412/docker/www/nginx/html:/var/www/html php:7.4-fpm
- 新建容器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 容器关联上
- 修改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挂载的位置是一个位置. 所以可以访问到. 这一步非常关键.
- 重启nginx容器
docker restart nginx5
- 安装mysql
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
如果在容器中,想使用宿主机的mysql,可以在 数据库连接中,将 host 修改成 ‘host.docker.internal’ 即可。
// 数据库连接参数:
// $mysql_server = array('127.0.0.1', 'root','root', 'guahaobbwznkyy', 'gbk');
$mysql_server = array('host.docker.internal', 'root', 'root', 'guahaobbwznkyy', 'gbk');
- 安装redis
docker run --name redis -d redis:5.0
四 nginx负载均衡
- 按照上述步骤,新建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
- 本地添加测试域名,指向 nginx1的地址
sudo vim /etc/hosts
www.test.com 192.168.228.2
- 在 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 端口。
- 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 nginx
docker 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
更多推荐
所有评论(0)