高并发静态资源化

Posted 转角90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发静态资源化相关的知识,希望对你有一定的参考价值。

Nginx高并发静态资源化解决方案

1. 一致性

2. 合并文件输出

SSI官方文档

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基础上设置变量
  • 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


以上是关于高并发静态资源化的主要内容,如果未能解决你的问题,请参考以下文章

高并发的处理方案

高并发解决方案与并发编程,线程池,缓存,消息队列,分库分表java系统架构

SSM实战——秒杀系统之高并发优化

从接入层入手,如何设计高并发的微服务架构?

安装Nginx服务

Nginx