上传文件服务器与web内容服务分离
现在难点在:
1\单击表单提交按钮后,图片上传到图片服务器,文字内容上传web服务器数据库,这两个服务器分别在两个城市.
2\图片不能通过web服务器中转.
3\web服务器内容可以登录认证,但是怎么保证"upload"的提交图片表单是合法的用户?
分析一下:
1. WEB服务器和图片服务器分隔两地,这决定了肯定有图片文件传递到远处的图片服务器上。那么可能有2种方式:1是先上传到WEB服务器,然后它在转到图片服务器;2是用户上传图片时直接上传到图片服务器上,不中转(这是我建议的)
2. 前面几楼朋友介绍了各种技术,不管哪种,底层其实都有数据传输的,即不管什么同步软件,都是要先让用户上传图片到WEB服务器,然后那个同步系统自动把图片传递到图片服务器。所以,我上面建议采用用户直接上传的方式。在图片服务器上建立个专门处理文件上传的应用(当然最好弄个web服务器),用户在页面提交上传时,检查如果是图片,则上传到图片服务器,其他内容传到WEB服务器。
具体实现我就不细说了,有人说图片服务器建立WEB程序了会影响图片服务器的,但是那些同步软件或者FTP方式不一样吗,和apache/tomcat之类底层都是socket通信;与其先socket到WEB服务器然后再socket图片服务器,不如一步到位,前者影响了2个服务器性能,后者只影响一个。如果怕图片服务器效果降低,今后可以把图片服务器扩充为2台,它们之间可以搞个同步系统,然后用负载均衡来搞定压力问题。 至于,怎么在一个页面上将一个form的东西分传到2个服务器,这个就不用说了吧,好多方法可用,比如图片单独一个form,用javascript来让用户点一个提交,同时执行2个form等等......
评论:
(1) 用到了SSO 单点登陆
(2) 远程mount过来
(3) 硬盘映射 吧B服务器的一个文件夹 映射到 A服务器的一个文件夹下! 操作系统自己会吧文件写到B服务器
(4) 我们公司是通过监控数据库服务器上的对应目录,只要该目录文件存在改变,马上自动同步到文件服务器上,你需要解决几个问题:找到对对应的windows API、编写网络传输程序(可以用FTP实现,效率比较低。)
WEB框架实现动静分离:
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
HAProxy特别 适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的 运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限 制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
第一步:安装httpd、php以及haproxy,这里我们直接用yum来安装即可,这里我们使用三台虚拟机来做测试,前端一台haproxy做调度,后端两台httpd服务器提供web服务,在做动静分离时时前端haproxy来判断动态和静态内容分别调度到哪台服务器上;
1.
[root
@node0
~]# yum -y install httpd php haproxy
第二步:安装好之后给这三台虚拟配置好相关的网络设备以及提供相关的测试页面等,在eth3这张网卡上选择相同的一个通信通道,node0这台虚拟机上haproxy的主机,node1和node2是不同的两台后端提供web服务器的虚拟主机;
01.
[root
@node0
~]# ifconfig eth3
192.168
.
27.10
/
24
up # 给eth3配置ip地址
02.
[root
@node0
~]# ifconfig
03.
eth0 Link encap:Ethernet HWaddr
00
:0C:
29
:B2:AD:BA
04.
inet addr:
172.16
.
27.88
Bcast:
172.16
.
255.255
Mask:
255.255
.
0.0
05.
inet6 addr: fe80::20c:29ff:feb2:adba/
64
Scope:Link
06.
UP BROADCAST RUNNING MULTICAST MTU:
1500
Metric:
1
07.
RX packets:
11122303
errors:
0
dropped:
0
overruns:
0
frame:
0
08.
TX packets:
1193136
errors:
0
dropped:
0
overruns:
0
carrier:
0
09.
collisions:
0
txqueuelen:
1000
10.
RX bytes:
697850934
(
665.5
MiB) TX bytes:
74549101
(
71.0
MiB)
11.
12.
eth3 Link encap:Ethernet HWaddr
00
:0C:
29
:B2:AD:C4
13.
inet addr:
192.168
.
27.10
Bcast:
192.168
.
27.255
Mask:
255.255
.
255.0
14.
inet6 addr: fe80::20c:29ff:feb2:adc4/
64
Scope:Link
15.
UP BROADCAST RUNNING MULTICAST MTU:
1500
Metric:
1
16.
RX packets:
0
errors:
0
dropped:
0
overruns:
0
frame:
0
17.
TX packets:
6
errors:
0
dropped:
0
overruns:
0
carrier:
0
18.
collisions:
0
txqueuelen:
1000
19.
RX bytes:
0
(
0.0
b) TX bytes:
468
(
468.0
b)
20.
[root
@node0
~]#
[root@node1 ~]# ifconfig eth0 192.168.27.18/24 up在node1和node2上设置好相关配置,选择虚拟机上的VMnet2与haproxy上的eth3的同一通信通道,再配置IP地址和默认网关接口,而后再提供不同的页面以便测试用;
1.
[root
@node1
~]# route add defaulte gw
192.168
.
27.18
# 网关指向haproxy主机的eth3地址
2.
[root
@node1
~]# ping
192.168
.
27.10
# ping一下haproxy的节点看是否ping通
3.
[root
@node1
~]# vim /var/www/html/index.html
4.
<h3>node1.tanxw.com</h3>
5.
[root
@node1
~]# service httpd start # 配置好之后就把web服务启动起来,再访问测试一下,测试的连接改为桥接方式
01.
[root
@node2
~]# ifconfig eth0
192.168
.
27.19
/
24
up
02.
[root
@node2
~]# route add defaulte gw
192.168
.
27.18
# 网关指向haproxy主机的eth3地址
03.
[root
@node2
~]# ping
192.168
.
27.10
# ping一下haproxy的节点看是否ping通
04.
[root
@node2
~]# vim /var/www/html/index.php
05.
<h3>node2.tanxw.com</h3>
06.
<?php
07.
phpinfo();
08.
?>
09.
[root
@node2
~]# service httpd start # 配置好之后就把web服务启动起来,再访问测试一下,测试的连接改为桥接方式
01.
############## 以上的使用默认配置就可以了 #######################
02.
03.
frontend web *:
80
# *表示haproxy监听所有地址,监听的端口为
80
04.
# 定义访问控制,表示以url以.css .js .html .php结尾的分别调度到哪台服务器上访问
05.
acl url_static path_end -i .css .js .html
06.
acl url_dynamic path_end -i .php
07.
08.
# usr_backend表示使用backend服务,
if
表示如果满足url_static这个条件就调度到这台服务器上
09.
use_backend
static
if
url_static
10.
default_backend dynamic
11.
12.
backend
static
# 定义调用后端的静态页面的服务器上
13.
server node1
192.168
.
27.18
:
80
check inter
3000
rise
2
fall
2
maxconn
5000
14.
backend dynamic # 定义调用后端的动态页面的服务器上
15.
server node2
192.168
.
27.19
:
80
check inter
3000
rise
2
fall
2
maxconn
5000
16.
listen statspage # 定义监控管理接口的界面
17.
bind *:
8888
# 定义访问页面端口
18.
stats enable # 启用管理界面
19.
stats hide-version # 隐藏版本
20.
stats uri /admin?stats # 访问路径
21.
stats auth xiao:linux # 访问时需要验证登录
22.
stats admin
if
TRUE # 如果登录成功就可以管理在线服务器
第三步:配置haproxy的相关配置信息;
第四步:登录到我们配置好的管理界面:
第五步:配置好相关的配置之后就可以测试一下了,
最后我们再分别对这两个页面的请求做一下压力测试看看:
总结:
HAProxy是一款比较轻量级的负载均衡服务器,特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在 当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到 网络上。
上传文件服务器与web内容服务分离的更多相关文章
- element ui 上传文件,读取内容乱码解决
element ui 上传文件,读取内容乱码解决: 加第二个参数 reader.readAsText(file.raw,'gb2312'); <el-upload class="upl ...
- Salesforce LWC学习(三十二)实现上传 Excel解析其内容
本篇参考:salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容 上一篇我们写了aura方式上传excel解析其内容.lwc作为salesforce的新宠儿,逐渐的 ...
- SpringBoot实现本地存储文件上传及提供HTTP访问服务
笔者计划为大家介绍分布式文件系统,用于存储应用的图片.word.excel.pdf等文件.在开始介绍分布式文件系统之前,为大家介绍一下使用本机存储来存放文件资源. 二者的核心实现过程是一样的: 上传文 ...
- VC++ Post 方法 上传数据到web服务器
最近在做一个项目,需要与WEB服务器交互一些信息.其中一项就是文件的上传与下载.现来一个上传的代码 #include "stdio.h" #include "WinSoc ...
- Java客户端通过Http发送POST请求上传文件到web服务器
http://www.cnblogs.com/WilliamJiang/archive/2012/04/29/2475883.html 1.朋友的一个需求,让我给他实现,需求是这样的,需要用ASP.n ...
- FTP上传文件服务器python实现
总结 使用Python的socket和socketserver模块实现ftp文件服务器.不是很难,但在粘包的问题上纠缠了不少时间.解决办法是发送文件信息之后等待一段时间. #!/usr/bin/pyt ...
- PHP代码篇(五)--如何将图片文件上传到另外一台服务上
说,我有一个需求,就是一个临时功能.由于工作开发问题,我们有一个B项目,需要有一个商品添加的功能,涉及到添加商品内容,比如商品名字,商品描述,商品库存,商品图片等.后台商品添加的接口已经写完了,但是问 ...
- ubuntu 16 搭建只能上传不可下载删除ftp服务
安装 VSFTPD,(建议使用FileZill测试,报错能看到原因) 如果使用window文件管理连接,要注意下图的设置 使用 apt-get 安装 vsftpd sudo apt-get insta ...
- salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容
本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader https://github.com/SheetJS/sheetjs ...
随机推荐
- [转帖]什么是安全散列算法SHA256?
什么是安全散列算法SHA256? http://8btc.com/article-136-1.html 发布者: 无主之地 发表于: 2013-10-1 01:31 78152 2 分享 安全散列 ...
- Cmder 常用配置
windows 系统的 cmd 命令窗口不是很好用,可以试试 Cmder 工具包. 1.在运行框中快速启动 Cmder 将 cmder.exe 文件所在目录加载环境变量 PATH 中. 2.把 cms ...
- Jquery 组 tbale表格隔行变色
<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...
- 使用 py.test 对 python 代码进行测试
其实以前我记得有人对我说过,写代码甚至可以先写完测试之后部署好了再开始写逻辑代码.我觉得有点吃惊和奇怪,这不是扯淡吗? 但是这次在完成了积分支付第一阶段开发之后我意识到,这可能并不是开玩笑,特别是项目 ...
- php技术–php中感叹号!和双感叹号!!的用法(三元运算)
---恢复内容开始--- if(文章==有用){狂点我;} 在php持术或其他语言中我们经常会看到感叹号的用法,有一定程序语言基础的朋友都知道单个感叹号的作用是取反的意思,也就是取当前结果的反面,如: ...
- Linux文件权限属性后面有个点
坑啊,新上的机器,监控怎么都不好使,各种报错说:没有权限 什么情况? 仔细查看,发现文件权限属性后面怎么多了个点,类似如下: 这是什么? 原来: 开启了SELinux功能的Linux系统就会有这个点. ...
- HTML5-表单元素
不是所有的浏览器都支持HTML5新的表单元素,但是可以使用他们,即使浏览器不支持表单属性,仍然可以显示为常规的表单元素 datalist 规定输入域的选项列表 //input的list属性值就是dat ...
- Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)
Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据, ...
- Studio启动的时候报错 Could not install Gradle distribution from
安装了studio以后,直接点击[Start]报如下错,绝对不是网络的问题. Could not install Gradle distribution from 'https://services. ...
- Shell基础知识(一)
教程链接:shell从入门到入门 这个网站还有其他教程,可以尝试下看看. 普及类文章:bash/cmd/dos之间有什么区别与联系 >> bash是Linux下的一个shell应用程序 ...