PHP+Nginx+宝塔+rsync代码同步 实现Nginx负载均衡
作为一个PHP菜鸟,最近闲着没事,就想搭建一个Nginx试试,因为重来没有搭过,特此记录一下,也希望能为新入门的兄弟们提供一点帮助,可能有一些说错的地方,大家可以帮我纠正,谢谢.
参考博客: rsync的配置是参考了这位大神博主的,大家可以看一下
第一步
准备服务器,这里我使用了两台服务器来进行简单的测试,主服务器端我们称为服务器A,客户端我们称为服务器B,我们把想要对用户访问的站点部署到A上,列如xxx.com站点部署好我们对应的项目 证书等等
在服务器B上添加相同的站点即项目即可
Nginx配置
回到服务器A,打开站点设置,这里我没有更改服务器的主Nginx配置文件,只更改我们自己这个站点的Nginx配置文件加如一下配置
upstream fuzhai { server 服务器BIP:端口 weight=2; server127.0.0.1:8301; }
在fuzhai这个里输入 自己其他的服务器IP地址加上端口即可 weight是权重 不设置的话默认是1 比如第一个访问2次 第二个就会访问一次
在server里添加
location / { proxy_pass http://fuzhai; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
这里是当访问我服务器A站点时这里会走到fuzhai里,好转发到其他的服务器上.这里我可能说的不太明白,大家可以查找一下nginx反向代理了解一下,下面是我配置好的截图
切记这里的端口一定要开放,以防后期测试的时候访问失败
服务器B上我没有进行什么配置,只是我的测试项目用的是tp6,设置了一下伪静态,和访问目录则可.
测试是否配置成功
在两个服务器上的项目中分别创建两个相同的接口进行访问
上图为本机接口
上图为服务器B接口
可以看到项目可以正常访问
需要注意的地方
1.Nginx的分配策略这里我没有演示,使用的是默认的轮询,就是一次一回,其余的大家可以自行测试.
2.如果大家的后台项目是session存储用户信息的哈,需要注意配置完成后可以第一次登录完后台,在刷新切换到了新的站点,从而登录失效,这个解决方案我没有测试,有人说可以设置ip_hash来设置使用户固定访问指定的站点,也可以把session存储到redis中达到会话共享,这个我没有实现过,大家用到的话可以做一个参考.
3.文件上传,可能大家有的是用本地存储,那么这样就可能会刷新页面图片失效,我推荐大家使用一个第三方的存储服务器,都使用这一个就不会出现问题了,可以自己搭建,要是方便的话可以使用阿里云OSS,腾讯云Cos,七牛等等第三方,对接还是很方便的.
4.代码同步,这个真是难死我了,因为我只是浅懂一点点的linux,这里我查到的是用rsync来达到代码同步,我就去学了一下,大家要是有别的方法可以留言告诉我一下 我去试试,下面就是用rsync+shell脚本来实现的代码同步.
rsync+shell代码同步
介绍一下rsync是什么吧
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。已支持跨平台,可以在Windows与Linux间进行数据同步。
1.可以使用宝塔自带终端,或其余软件,这里只要能链接服务器敲命令即可.
2.在两台服务器A和服务器B输入命令安装rsync,注意两个服务器的rsync版本同步以防出现错误
# rpm -qa|grep rsync #检查是否安装过rsync,whereis rsync也可以 # yum install rsync #如果未安装,使用yum安装rsync # rsync -version #查看版本 # yum remove rsync #卸载rsync 这个是防止需要重新安装时候使用,不是必须敲哈
3.回到服务器A配置rsync的配置文件rsyncd.conf,这个配置文件我默认就是有的没有就自行创建即可默认位置为 /etc/rsyncd.conf
# vi /etc/rsyncd.conf #编辑配置文件
输入以下内容,大家直接粘贴我的也行,有需要别的参数的可以在查询加入,我这只是我的常用
uid = test_tongbu #指定rsync进程以什么用户身份来运行 默认有nobody gid = test_tongbu #指定rsync进程以什么用户组身份来运行 默认有nobody hosts allow = * #可以访问的服务器 我是默认全部 use chroot = no #是否锁定用户在自己家目录中 max connections = 100 #指定可以进行同时链接的用户的最大数量 pid file = /var/run/rsyncd.pid #指定rsync进程的pid文件的路径和名称 lock file = /var/run/rsyncd.lock #指定rsync进程的锁文件路径和名称 log file = /var/log/rsyncd.log #rsync的日志文件路径和名称 timeout = 900 #指定空闲超时时间 [www] #模块名称,其余服务器想传文件时候用到 path = /www/web #同步的文件路径 read only = false #只读 auth users = root #这个是为其他服务器访问时候创建的虚拟用户,不是系统用户切记 secrets file = /etc/rsyncd.password #指定保存虚拟用户 的用户名 密码的文件 [mod1] #另一个模块 path = /www/web read only = false auth users = root secrets file = /etc/rsyncd.password
上面就是我的配置文件和参数的大致意思,大家要是粘贴的话注意注释文字最好不要粘贴到文件中,我这里只是方便大家理解的用处,下面是我的配置截图
4.创建虚拟用户的密码文件 注意密码文件权限必须是600
# vi /etc/rsyncd.password # chmod 600 /etc/rsyncd.password
格式为
用户名:密码
5.运行rsync
# rsync --daemon #运行rsync(守护进程模式)
默认端口是873,注意端口开放,我的是去开放了,怕不好使,linux我也不太熟悉.
6.这里注意服务器重启后可能rsync没有运行可以写入配置文件 让其自动重启
# vi /etc/rc.local # /usr/bin/rsync --daemon --config=/ect/rsyncd.conf #开机自动运行
7.服务器B配置,这里服务器B只需要创建一个密码文件和写入自动重启即可
创建密码文件 注意密码文件权限必须是600
# vi /etc/rsyncd.password # chmod 600 /etc/rsyncd.password
密码对应服务器A设置的密码即可无需用户名
写入自动重启
# vi /etc/rc.local # /usr/bin/rsync --daemon #开机自动运行
8.测试,在服务器A的目录下创建一个1.txt回到服务器B上使用命令手动同步一下,看看是否好使
服务器A下没有文件
服务器b下也没有文件
服务器A下创建1.txt
服务器B使用命令拉取文件,可以看见文件拉取成功并且已经同步了这里来注意说一下这个命令的意思
# rsync -vzrtopg --progress root@192.168.1.1::www /www/web --password-file=/etc/rsyncd.password -v表示verbose详细显示 -z表示压缩 -r表示recursive递归 -t表示保持原文件创建时间 -o表示保持原文件属主 -p表示保持原文件的参数 -g表示保持原文件的所属组 -a存档模式 --progress :显示进度条 root:这个root不是你的系统用户 而是服务器A www 模块下的虚拟用户名称切记不要搞混 192.168.1.1:服务器A的IP 切换你自己的 www:服务器A中rsync配置文件中的模块名称 /www/web:本地要同步的目录 --password-file=/etc/rsyncd.password :本地密码文件位置就可以不用重复输入密码了
9.这里可以看见基本上已经配置成功了,把命令加到shell脚本中定时执行即可,这里说一下几种执行方案和查询别人的执行方案 其实都是定时执行脚本,大家根据喜好就行
1.创建shell脚本
# vi /www/sh/tongbu.sh
#!/bin/bash step=1 for (( i = 0; i < 60; i=(i+step) )); do $(rsync -vzrtopg --progress root@192.168.1.1::www /www/wwwroot/a.test2.zjm0305.top/tp --password-file=/etc/rsyncd.password) sleep $step done exit 0
粘贴进去即可
2.宝塔用户可以在宝塔面板的计划任务模块创建一个shell脚本 定时的去执行这个文件
命令内容 sh /www/sh/tongbu.sh > /dev/null 2>&1
设置一下执行时间,如果很快就一执行的话 需要把脚本里循环次数调小 或者不用循环直接跑命令
3.看了一下别人的 不使用宝塔的用户可以然后在目标服务器 crontab 定时执行
crontab -e
* * * * * sh /root/rsyncd.sh > /dev/null 2>&1 #加进去即可
这样就可以每秒执行文件了,看了大神还是可以用一个专门放代码的服务器,然后需要同步代码的服务器 监听 代码服务器 这样每次我们往代码 服务器传代码 负载均衡所有的服务器代码 都是同步更新的 这个我真是没会,我在找找研究研究,找到了在补充吧
到这里也就差不多了,因为本人也是第一次弄,真的是没有经验,而且也只是自己的测试项目,没上线,可能上线会遇到其他的问题,大家到时候可以留言一起解决解决,如果发现我哪里说的做的不对的,大家指正我看见了第一时间修改,防止误人子弟啊
原文链接:https://blog.51cto.com/u_16099297/10227026