高并发静态资源化
Posted 转角90
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发静态资源化相关的知识,希望对你有一定的参考价值。
Nginx高并发静态资源化解决方案
1. 一致性
2. 合并文件输出
Server Side Include,服务器端嵌入
SSI配置
ssi on;
开启
ssi_min_file_chunk 1k;
大于1k,向磁盘存储并使用sendfile发送,文件大小最小值
ssi_last_modified
是否保留last_modified,off默认
ssi_silent_errors on | off(默认)
on:不显示逻辑错误(命令错误) ,
ssi_value_length 256
限制脚本参数最大长度
ssi_types
默认text/html;如果需要其他mime类型 需要设置
SSI 指令
<!--1.html-->
<h1>1.html</h1>
<!--2.html-->
<h1>1.html</h1>
<!--3.html-->
<h1>3.html</h1>
<!--# include file="1.html" -->
<!--# include file="2.html" -->
<!--最终输出-->
3.html
1.html
2.html
-
include
- file:静态文件直接引用
<!--# include file="1.html" -->
- virtual:可以指向location,而不一定是具体文件
- wait:阻塞请求
- set:在virtual基础上设置变量
- file:静态文件直接引用
-
block: 可以声明一个ssi的命令块,里面可以包裹其他命令
-
config
- errmsg:在模板中配置报错情况
- timefmt:日期格式化
-
echo:直接输出变量
- var变量名称
- encoding 是否使用特殊编码格式
- default 变量没有值的时候使用默认值
- encoding
- default
-
if
3. 集群文件同步
rsync
remote synchronize是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机之间的文件。也可以使用 rsync 同步本地硬盘中的不同目录。
rsync 是用于替代 rcp 的一个工具,rsync 使用所谓的 rsync算法 进行数据同步,这种算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。rsync 基于inotify 开发
Rsync有三种模式:
- 本地模式(类似于cp命令)
- 远程模式(类似于scp命令)
- 守护进程(socket进程:是rsync的重要功能)
Rsync参数
选项 | 含义 |
---|---|
-a | 包含-rtplgoD |
-r | 同步目录时要加上,类似cp时的-r选项 |
-v | 同步时显示一些信息,让我们知道同步的过程 |
-l | 保留软连接 |
-L | 加上该选项后,同步软链接时会把源文件给同步 |
-p | 保持文件的权限属性 |
-o | 保持文件的属主 |
-g | 保持文件的属组 |
-D | 保持设备文件信息 |
-t | 保持文件的时间属性 |
–delete | 删除DEST中SRC没有的文件 |
–exclude | 过滤指定文件,如–exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步 |
-P | 显示同步过程,比如速率,比-v更加详细 |
-u | 加上该选项后,如果DEST中的文件比SRC新,则不同步 |
-z | 传输时压缩 |
部署
- 服务器A: 192.168.75.138
- 服务器B: 192.168.75.139
这里有两台 linux 服务器,我们可以先假定 A 作为服务端,B 作为客户端。
安装
# 两台机器都需要安装
yum install -y rsync
服务端密码文件
创建文件/etc/rsyncd.password
内容
hyf:111
修改权限
chmod 600 /etc/rsyncd.password
修改配置
# rsync 守护进程的用户
uid = www
# 运行 rsync 守护进程的组
gid = www
# 允许 chroot,提升安全性,客户端连接模块,首先 chroot 到模块 path 参数指定的目录下,chroot 为 yes 时必须使用 root 权限,且不能备份 path 路径外的链接文件
use chroot = yes
# 只读
read only = no
# 只写
write only = no
# 设定白名单,可以指定IP段(172.18.50.1/255.255.255.0),各个Ip段用空格分开
hosts allow = 192.168.0.2
hosts deny = *
# 允许的客户端最大连接数
max connections = 4
# 欢迎文件的路径,非必须
motd file = /etc/rsyncd.motd
# pid文件路径
pid file = /var/run/rsyncd.pid
# 记录传输文件日志
transfer logging = yes
# 日志文件格式
log format = %t %a %m %f %b
# 指定日志文件
log file = /var/log/rsync.log
# 剔除某些文件或目录,不同步
exclude = lost+found/
# 设置超时时间
timeout = 900
ignore nonreadable = yes
# 设置不需要压缩的文件
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# 模块验证的用户名称,可使用空格或者逗号隔开多个用户名
auth users=hyf
# 模块验证密码文件 可放在全局配置里
secrets file = /etc/rsyncd.password
# 模块,可以配置多个
[ftp]
# 模块的根目录,同步目录,要注意权限
path = /usr/local/nginx/html
# 是否允许列出模块内容
list = no
# 忽略错误
ignore errors
# 添加注释
comment = ftp export area
客户端免密
客户端只放密码
echo "111" >> /etc/rsyncd.passwd
此时在客户端已经可以配合脚本实现定时同步了
rsync --list-only --password-file=/etc/rsyncd.pwd.client hyf@192.168.75.138::ftp/
拉取数据到指定目录
rsync -avz --password-file=/etc/rsyncd.pwd.client hyf@192.168.75.138::ftp/ /etc/local/nginx/html
开机启动
在/etc/rc.d/rc.local
文件中添加
echo \'rsync --daemon --config=/etc/rsyncd.conf\' >> /etc/rc.d/rc.local
同步
从 服务端=>客户端 同步数据:
rsync -avzP --delete hyf@192.168.75.139::ftp/ /usr/local/nginx/html --password-file=/etc/rsyncd.pwd.client
从 客户端=>服务端 同步数据:
rsync -avzP --delete /usr/local/nginx/html hyf@192.168.0.1::ftp/ --password-file=/etc/rsyncd.pwd.client
inotify
推送端安装inotify
安装
# 先安装扩展源,否则inotify-tools找不到
yum install -y epel-release
yum install -y inotify-tools
监控目录
/usr/bin/inotifywait -mrq --timefmt \'%Y-%m-%d %H:%M:%S\' --format \'%T %w%f %e\' -e close_write,modify,delete,create,attrib,move /usr/local/nginx/html/
inotify常用参数
参数 | 说明 | 含义 |
---|---|---|
-r | --recursive | #递归查询目录 |
-q | --quiet | #打印很少的信息,仅仅打印监控事件信息 |
-m | --monitor | #始终保持事件监听状态 |
-excludei | #排除文件或目录时,不区分大小写 | |
-timefmt | #指定时间输出格式 | |
-format | #打印使用指定的输出类似格式字符串 | |
-e | -event | 后面指定删、增、改等事件 |
notifywait events 事件说明
access:读取文件或目录内容
modify:修改文件或目录内容
attrib:文件或目录的属性改变
close_write:修改真实文件内容 # 重要参数
close_nowrite:文件或目录关闭,在只读模式打开之后关闭的
close:文件或目录关闭,不管读或是写模式
open:文件或目录被打开
moved_to:文件或目录移动到
moved_from:文件或目录从移动
move:移动文件或目录移动到监视目录 # 重要参数
create:在监视目录下创建文件或目录 # 重要参数
delete:删除监视目录下的文件或目录 # 重要参数
delete_self:文件或目录被删除,目录本身被删除
unmount:卸载文件系统
简单自动化脚本(不可用于线上环境)
目标服务器和源服务器都需要设置相应rsync配置,并且开启rsync服务
创建脚本vi /bin/auto.sh
#!/bin/bash
/usr/bin/inotifywait -mrq --timefmt \'%d/%m/%y %H:%M\' --format \'%T %w%f %e\' -e close_write,modify,delete,create,attrib,move /usr/local/nginx/html/ | while read file
do
rsync -az --delete --password-file=/etc/rsyncd.pwd.client /usr/local/nginx/html/ hyf@192.168.75.138::ftp/
done
以上是关于高并发静态资源化的主要内容,如果未能解决你的问题,请参考以下文章