php - 站点做动静分离,如何处理用户上传文件呢?
大家讲道理
大家讲道理 2017-04-11 09:18:53
[PHP讨论组]

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(5)
高洛峰

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,收费还比较便宜。

ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号