恒星兼职网
所属栏目: 技术文档

linux系统下Discuz论坛用rsync做远程同步附件服务器心得

时间:2017-12-21 15:31

在服务器配置方面其实我也是菜鸟,但是我敢照着教程一步步做,不管是linux还是win的配置问题,基本上都可以找到相关的教程,感谢这个网络共享和开放的时代。我这几天弄一个论坛搬家,将论坛搬迁到阿里云,由于论坛附件很大,40G左右,阿里云5M以上带宽都是很贵的, 因此考虑用一台专门的ecs来做附件服务器,刚开始也考虑到用oss,而且我刚注册的账号有送资源包,但是oss配置也麻烦,后期升级维护比较烦人,因此还是考虑用dz的远程附件服务器来解决。

结果昨天搞了一天没有成功,主要是远程的ftp权限问题,在本地用ftp工具上传和下载都没问题,但是将这个账号配置到dz远程附件里面,就是无法上传,能创建目录,无法上传文件,所有上传的都是0kb,和阿里云客服工单来往了一天,感觉中间客服还换人了,硬是没解决,服务器和ftp都给他们了,没有找出任何问题。这里真的要吐槽一下,阿里云的工单客服技术都很差,有什么问题不要期望他们能够帮忙解决,有时候真的还不如自己去找;最后晚上想求助万能淘宝,给了他服务器账号密码,wdcp账号密码,结果他最后还要我的阿里云账号密码,那肯定是不能给的,而且阿里云账号上面除了安全规则,也没什么需要看的,不知道他想看什么,我说你要什么,我截图给你,他说不行,果断放弃,发觉淘宝上面大部分服务器配置的都是超级菜鸟,就会装个wdcp什么的。想想也是,真正的技术大牛有几个会去淘宝上面赚几十元呢。

在一天的折腾中,发现dz的这个ftp功能有很多的缺陷,开启了远程附件在上传的时候图片依然会先上传到本地,在你点发表帖子的时候,图片才能通过ftp上传到远程附件服务器,这样就会造成假如有会员发布的是一个较大附件的帖子,上传的时候要等待,发表帖子按钮的时候又卡半天,甚至造成发布不成功,严重影响用户体验,这个问题看到很多人反应,但是dz版本更新了无数代,依然没有解决,好说是为了防盗链这样设计的。这样造成几个严重后果,一是上传依然走的是主服务器的带宽;二是发帖速度很慢;三是经常会远程发布失败,依然在本地,弄的本地和远程的附件很乱,你自己都搞不清楚附件最后在哪里了;四是会产生大量的临时文件。

既然dz本身这个远程附件很鸡肋,问题多多,加上我ftp老配置不成功,那就只能想别的方法了,我的图片服务器已经买好了,阿里云5M带宽的一年,不用了也浪费啊。正好想起来了前几天在看负载均衡的时候,各种文件同步功能。

Discuz论坛不用远程附件实现附件服务器的远程单独部署

假如程序主服务器为ecs A,图片附件服务器为ECS B,二者选在同一个区域,保证在同一个内网,即使不在同一个内网甚至一个阿里云一个西部数码也可行,但是同步速度慢而且需要消耗流量,不推荐!

1、原理:Discuz论坛本地附件 URL 地址可以单独设置

dz远程附件部署教程

在全局——上传设置——基本设置,本地附件url地址这里可以单独设置链接,这个位置的链接设置了更新缓存后,论坛所有图片和附件,都会变成这个地址。我们利用这个功能,可以实现将论坛所有附件地址变成我们想要的地址,比如我的图片服务器地址http://img.jianzhiwangzhan.com/data/attachment,具体图片和路径根据实际情况自己填。

只改地址但是不开启远程附件功能的话,就会出现用户新上传的图片无法访问的情况,因为新上传的图片都是在A上,但是连接确实远程的B的,那肯定无法访问了。

2、利用rsync文件同步功能将Discuz论坛上传的附件同步到图片服务器

在ECS B上创建网站,我都是用wdcp,绑定附件域名比如http://img.jianzhiwangzhan.com/,同时在根目录也创建/data/attachment文件夹。

基本想法是,用户上传的图片依然在服务器A,但是我通过rsync文件同步功能将文件及时同步到B,这样附件链接地址图片就可以访问了,即服务器A和服务器B的附件服务器内容一模一样(B里面可以放老内容,我40G老的图片全部放在B,A的内容可以删除)。

这个相比dz自带的图片服务器,不需要在后台配置参数,也不需要ftp,会员发表帖子的时候不会卡顿,也不会有其它乱七八糟的问题。

3、同步工具选择

我找了比较多,看到在linux服务器下,用的比较多的一种是rsync,可以实时同步,B的内容可以和A不一样,老内容可以放在B,但是不能加delete参数这个后面说,缺点是同步有一定的时间差;还有一种就是NFS文件共享,这个就是很多负载均衡方案用到的方法,既然是共享,那B和A的内容就一模一样,优点是及时同步。

我最后选择了rsync,为什么我要B和A的内容可以不一样呢,因为我在A可以只放dz程序,A产生的附件可以定期删除,这样就不需要很大的磁盘空间了;假如用NFS共享方法,那两个服务器都是需要大空间的,成本高一些。

以上就是基本原理,下面来说说rsync配置方法,参考了很多教程,没有一个能够完全满足我要求的,有的配置过程看的不清楚,有的小功能不能满足要求等等。这个教程主要是方便我以后再去配置的时候不用到处找教程了,算是一个记录吧。

ps:我用的wdcp面板,这样大部分涉及到VI编辑操作的可以直接在wdcp里面改,对于我们不熟悉linux命令行的来说,节省很多时间也降低了难度。

linux服务器安装rsync服务的步骤和方法

硬件:主服务器A,附件服务器B,在阿里云同一个内网。

系统:centos6.9 64位,AB一样,同时安装wdcp面板

做之前一定要做好AB的备份工作,弄坏了没人陪哈。

主服务器A的rsync配置

1、安装Rsync运行环境

CentOS

yum install rsync -y

没反应的话前面加个sudo

Debian、Ubuntu

apt-get  install  rsync -y

一般我们的服务器中已经默认安装过Rsync,鉴于确定性的考虑,我们根据环境还是安装。

2、服务器端配置文件参数设置

(有些教程找了半天没看到这几个文件,原来需要自己创建……原谅我是真菜鸡,在linux上面弄这几个真的麻烦)

服务器端配置3个配置文件:http://www.jianzhiwangzhan.com/uploads/soft/rsyncd-server.zip

我们先将下面3个配置文件下载到本地,我们需要一一进行修改参数。

明确目录

/etc/rsyncd/

我们需要将服务器端配置3个文件上传到上面目录中,默认是没有rsyncd文件夹的,我们手工或者mkdir创建一个。

我直接在wdcp后台创建,从wdcp到根目录,找到etc然后进去创建即可。

修改rsyncd.conf文件第7行(address)后面的IP地址,这是我们服务器端A服务器IP地址;

修改rsyncd.conf文件第20行(hosts allow)后面的IP地址,这是我们备份服务器端B服务器IP地址;

PS:顺带注意到25行的日志文件,我们也要对应的专门的日志目录中,这样统一管理。

注意rsyncd.conf文件第35行,这里是需要同步备份网站的目录。34行是模块名称,这里要和后面对应,38行的模块用户名以及39行的模块验证密码文件,这里随便设置,但是后面要对应就可以。40行是排除备份目录,如果我们需要排除某个目录不备份,将#取消,然后将后面备注目录,多个目录用空格隔开。

ps:要同步多个目录就添加多个模块即可,在客户端用不同的脚本调用不同的模块,这点非常灵活好用。

rsyncd.motd

这个文件默认不管,不要做任何修改

rsyncd.secrets

模块密码用户配置文件,我们可以看到格式,前面用户名与rsyncd.conf模块用户设置一样,后面密码随意设置都可以,因为在配置备份服务器的时候需要用到一致验证就可以了。

3、设置权限

3个文件配置没有问题之后,我们上传到开始说的目录中,需要授权rsyncd.secrets文件600

chmod 600 /etc/rsyncd/rsyncd.secrets

设置服务器端权限

我们在配置好3个文件之后,基本上快完事了,但是我们需要配置当前服务器的权限,包括防火墙,要不文件出不去。

4、开启防火墙

iptables -A INPUT -p tcp -m state --state NEW  -m tcp --dport 873 -j ACCEPT

如果我们服务器开启防火墙,那就需要给予873端口,设置后我们可以检查iptables -L 看看端口是否启动。实在不行我们就service iptables stop先暂停防火墙,然后等增量备份没有问题之后再有针对的启动。

wdcp后台直接添加873端口即可,假如是阿里云内网,安全组规则不需要添加,假如是外网,阿里云安全组规则里面请给附件服务器开放873端口

5、启动rsync

/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf

启动Rsync,但是我们还需要设置开机启动。

vi /etc/rc.local

将启动脚本添加到/etc/rc.local开机启动脚本文件中。不会编辑的直接在ssh中输入如下命令

echo '/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf' >> /etc/rc.local

同步附件服务器B的rsync配置

1、一样需要安装rsync环境

2、下载配置文件

http://www.jianzhiwangzhan.com/uploads/soft/rsync-root.zip

这里有2个文件pass和rs.sh,我们将其解压后放到备份服务器端root目录中。上传之前,我们需要修改配置。

pass文件

pass文件这里我们可以看到像是密码,没错,这个和我们在配置主服务器的时候配置文件设置的随机密码,不管我们设置什么,至少你这两个文件的密码要一样。

rs.sh文件

这个文件我们可以参考修改自己的配置,包括分组用户、主服务器IP地址,以及需要备份的目录。

ps:假如你要B和A的文件一模一样,那就直接用这个下载包里面的文件(压缩包里面的配置默认是一样一样的,在A删除了某内容,B会同步删除,B的老内容也会删除),假如你要B的文件内容比A多,也就是老内容要放在B,那就删除rs.sh文件里面的--delete参数切记,直接删除--delete即可。

rs.sh有--delete参数:A里面删除了内容,B里面会同步删除,不要问我为什么知道,就是因为这个,直接将我本来放好了的40G论坛老附件给删除了……还要压缩包还在,不然又要传1天,要哭。

rs.sh无--delete参数:A里面删除了内容,B里面的内容不会删除,推荐这种。

ps:注意要给脚本文件添加进程锁,防止同时执行多个进程,特别是5秒就执行一次的,遇到大文件可能导致无限执行耗尽系统资源,我这几天测试unison的时候就出现这种情况。

实例:

[root@localhost opt]# cat lra.sh 

#!/bin/sh
flock -xn /var/run/rsync.lock -c  'rsync -avzP --bwlimit 3000 /home/lra abc@172.16.0.123::abc --password-file=/etc/rsync.pas'
按照这个编辑脚本即可。

rsync是单向同步,不管在B里面怎么操作,都不会影响到A的,你删除了B的内容,A不会变,这点可以放心,而且会重新备份到B。

3、设置文件权限

1、chmod 600 /root/pass

2、chmod +x /root/rs.sh

4、备份执行检查效果

/root/rs.sh

我们在备份服务器端,执行看看是否能够正常的备份同步之前,如果有报错则需要调整,是参数不对,还是权限问题。

最简单的测试方法,在服务器A上传一个文件,然后执行ssh执行/root/rs.sh,看服务器B里面是否有,假如有就OK了,没有继续回去检查。

5、设置定时同步备份

crontab -e

打开crontab。

添加如下定时脚本

* * * * * /root/rs.sh  

* * * * * sleep 5; /root/rs.sh  

* * * * * sleep 10; /root/rs.sh  

* * * * * sleep 15; /root/rs.sh  

* * * * * sleep 20; /root/rs.sh  

* * * * * sleep 25; /root/rs.sh  

* * * * * sleep 30; /root/rs.sh  

* * * * * sleep 35; /root/rs.sh  

* * * * * sleep 40; /root/rs.sh  

* * * * * sleep 45; /root/rs.sh  

* * * * * sleep 50; /root/rs.sh  

* * * * * sleep 55; /root/rs.sh

不会玩vi的可以在wdcp里面弄,我就是这么搞的,var/spool/cron下,创建一个root文件,然后将上面的脚本附件进去就行了。

系统自带的默认定时脚本最短的是一分钟,wdcp后台就可以添加,非论坛完全够用了,由于我是用来做论坛服务器,假如会员上传了一分钟才可以看到自己的图片,他会怀疑是不是自己没传好导致重复操作……因此我将备份时间设置的短一些,在网上找了一段代码,没5秒钟执行一次,应该差不多了,具体看后续效果了。

ps:这个和wdcp自带的计划任务有冲突,在更新计划任务的时候,会将我们手动添加的清空删除,这点很不爽,要特别注意,同时似乎在每一行的后面都要添加空格才能成功。

6、也要设置rsync服务开机自启动,具体看前面

至此,基本上就完成了,我测试了下,基本上很满意了。A上传了,B上面很快就有了。这个留存,方便以后用的着。

参考教材:

1、http://www.itbulu.com/rsync-server.html和http://www.itbulu.com/rsync-root.html主要就是看的他的。

2、http://blog.csdn.net/fdipzone/article/details/22701113用到了按秒执行命令,略有修改,不需要创建php,直接放/root/rs.sh就行了。

3、https://yq.aliyun.com/articles/7117?spm=0.0.0.0.RBEwG9学习了步骤和如何添加自启动。

以上资料主要留存方便我自己以后配置用,这几天折腾这个真是搞的脑壳疼,终于搞的差不多了,超级菜鸟建议和我一样用wdcp等面板,否则在linux下用vi编辑配置文件那是很蛋疼的,浪费很多时间,而且错误率超高。

每一台服务器上面都可以既作为服务器端,也同时可以作为备份端,这样就非常方便的实现双向备份了。

这几天也折腾了下unison,发觉这个同步非常消耗系统资源,在小文件和目录非常多的时候,一运行cpu就50%以上,假如是频繁运行比如一分钟一次,很容易重复启动耗尽系统资源,总体来看rsync非常优秀,占资源小,同步速度快,非常稳定。

本教程在我测试了unison失败后重新更新,因为上了负载均衡多加一台ecs后,配置复杂了很多。

恒星兼职网http://www.jianzhiwangzhan.com/zz/js/2712.htmllinux系统下Discuz论坛用rsync

------分隔线----------------------------
广告赞助