站点做动静分离,如何处理用户上传文件呢?

公司的站点是做微信服务的,最近客户量上来了,流量一下暴增,一台服务器撑不住了,经过分析日志,发现主要流量都是静态资源文件,图片, js , css 等。于是去开了 CDN 加速。并打算进一步把一台服务器拆分成两台,分别绑定不同域名,一台专门把动态处理程序,另外一条放纯静态资源并由 CDN 加速。让静态资源彻底不会干扰到服务器处理动态请求。一般的静态资源都很好迁移。但是有个问题是我公司服务器是允许用户上传文件的,主要是一些小的图片,音频,视频。分析流量发现这部分用户上传的图片才是流量的大头,但是要怎么做,才能让用户上传的时候,把文件上传到静态服务器上去呢?现在的困扰点在于,如果在静态服务器上专门部署一个处理上传的程序,由于这个程序无法判断 session (用户登录的时候在动态服务器上)。这就存在安全问题了。如果要动态服务器先接收文件再转发到静态服务器,这种做法不知道是否稳妥。可靠性不知道咋样。
请高手指点

阅读 5.7k
6 个回答

sudo apt-get install inotify-tools rsync
可以考虑用inotifywait监听PHP服务器上保存上传文件的目录,文件有改变就通过rsync同步到局域网的专门存储静态资源的服务器,最后PHP输出静态服务器域名的图片链接给浏览器.
补充:
rsync不适合文件数量大,变化频繁的同步,因为rsync在同步数据时,需要先扫描所有文件后进行比对后进行差异传输.所以可以考虑用户上传文件后,PHP用pclose(popen("timeout 10 ftp.sh $file >/dev/null 2>&1 &", 'r'));异步上传文件到静态资源服务器(需要搭建FTP服务).

在shell脚本中用ftp上传文件:

ftp.sh
#!/bin/sh
# -n option disables auto-logon
ftp -n "127.0.0.1" <<End-Of-Session
user "user" "pass"
binary
cd uploads
put "/uploads/20161104/pic.png" "pic.png"
bye
End-Of-Session

本人以前图片服务是采用以下两种方式(只适用于中转能解决问题的情况),

  1. 动态服务器直接把图片以ftp的方式直接提交到资源服务器

  2. 文件临时保存在动态服务器,然后以增量同步的方式同步到资源服务器

若中转不能解决问题,只能把上传的交互直接与资源服通信,考虑同时把用户的相关标识(例如IDTOKEN)提交到资源服接收,资源服接收端处理完,直接更新DB,或者动态服和资源服建立多一个上传数据通信

挂载

挂载其他服务器的目录到后台服务器

最好可以放到七牛云或者又拍云上去,很方便做CDN,收费还比较便宜。

新手上路,请多包涵

NFS 应该是个比较靠谱的方案

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题