Nginx实现如何解决高并发

什么是动静分离

1、动静分离就是将动态资源(jsp/ftl)与静态资源(img/css/js)分开,从而提高网站响应的速度。
2、传统的架构模式中,静态资源(js、css、img)与动态资源(jsp、ftl)存放到同一个服务器上,tomcat本身作为静态资源服务器响应速度比nginx差,nginx作为静态资源服务器比tomcat响应吞吐量大。

基于Nginx实现动态分离方案有两种
1. 基于location判断前缀(项目名称)
2. 基于location判断后缀
动静分离与前后分离的区别
动静分离:将静态资源与动态资源分开部署
前后分离:将前端业务与后端业务完全分开,比如:vue+springboot
基于Nginx搭建动静分离架构

获取本地图片

#nginx服务安装在window服务器,访问http://127.0.0.1/static/1.png,会访问到E:/static/imgs/1.png
location /static/ {
    alias   E:/static/imgs/;
}
#nginx服务器安装在linux服务器,访问http://192.168.220.138/static/a.png
#在nginx目录下创建img目录,存放a.png
location /static/ {
    alias  img/;
### alias后面必须用/结束,否则找不到文件
}

获取远程图片

# 访问地址http://192.168.220.138/static/logo11.png
location /static/ {
    proxy_pass http://www.mayikt.com/static/imgages/index-img/;
}
# 真实路径http://www.mayikt.com/static/imgages/index-img/logo11.png

为什么将静态资源存放到第三方服务器效率更高

1. 云服务器签订带宽都是按T算
2. CDN内容分发,将静态资源缓存到全国各地的节点上能够减少客户端与CDN带宽传输距离,提高响应速度;遵循就近原则
注意:带宽传输的速度也是和客户端与部署服务器的距离有关系的。
如果图片过大,可以将图片拆分成n多个小图进行加载
如何减少客户端与服务器端带宽传输
静态资源压缩

1、人工压缩
Css/JS/IMG实现压缩地址:http://tool.oschina.net/jscompress/
2、maven自动打包压缩,生成.min文件

<!-- 构建相关配置 -->
<build>
    <!-- maven插件配置 -->
    <plugins>
          <plugin>
               <!-- YUI Compressor Maven压缩插件 -->
               <groupId>net.alchim31.maven</groupId>
               <artifactId>yuicompressor-maven-plugin</artifactId>
               <version>1.3.0</version>
               <configuration>
                     <!-- 读取js,css文件采用UTF-8编码 -->
                     <encoding>UTF-8</encoding>
                     <!-- 不显示js可能的错误 -->
                     <jswarn>false</jswarn>
                     <!-- 若存在已压缩的文件,会先对比源文件是否有改动。有改动便压缩,无改动就不压缩 -->
                     <force>false</force>
                     <!-- 在指定的列号后插入新行 -->
                     <linebreakpos>-1</linebreakpos>
                     <!-- 压缩之前先执行聚合文件操作 -->
                     <preProcessAggregates>true</preProcessAggregates>
                     <!-- 压缩后保存文件后缀 -->
                     <suffix>.min</suffix>
                     <!-- 源目录,即需压缩的根目录 -->
                     <sourceDirectory>${basedir}/mobile</sourceDirectory>
                     <!-- 压缩js和css文件 -->
                     <includes>
                           <include>**/*.js</include>
                           <include>**/*.css</include>
                     </includes>
                     <!-- 以下目录和文件不会被压缩 -->
                     <excludes>
                           <exclude>**/*.min.js</exclude>
                           <exclude>**/*.min.css</exclude>
                           <exclude>scripts/data/*.js</exclude>
                     </excludes>
               </configuration>
          </plugin>
    </plugins>
</build>
###执行maven命令,在静态资源的目录,打开dos窗口
mvn yuicompressor:compress

3、nginx自带压缩(非常消耗CPU)

gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css text/xml;
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on;

在这里插入图片描述

配置文件内容详细介绍

gzip配置的常用参数
gzip on|off; #是否开启gzip
gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)
gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_disable #正则匹配UA 什么样的Uri不进行gzip
gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)
gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
gzip_proxied # 设置请求者代理服务器,该如何缓存内容
gzip_types text/plain application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,css
gzip_vary on|off # 是否传输gzip压缩标志

访问http://192.168.220.138:8888/js/webutils.js
webutils.js本身大小为26KB,通过nginx压缩后,访问http://192.168.220.138:8888/js/webutils.js仅有145B

静态资源缓存控制

Http协议304状态码是缓存码,第一次访问会将资源缓存到浏览器客户端。如果该资源文件没有发生改变的情况下,不会重复的向服务器发送请求。

注意:七牛云CDN可能会缓存静态资源,建议每次发布生产环境中加上时间戳。

大型电商商品详情页面如何设计
使用Nginx缓存商品详情页面

客户端缓存(浏览器缓存)→CDN缓存(七牛云缓存)→Nginx缓存→JVM内置缓存→Redis分布式缓存→数据库

需要考虑的问题:

Redis与数据库一致性问题:利用mq订阅binlog同步数据一致性问题
JVM与Redis保持一致性问题
Nginx缓存与服务器缓存一致性问题

在这里插入图片描述

# 代理缓存配置
proxy_cache_path "cache"  levels=1:2 keys_zone=meitecache:256m inactive=1d max_size=1000g;

server {
    listen       80;
    server_name  localhost;
    gzip on;
    gzip_buffers 32 4K;
    gzip_comp_level 6;
    gzip_min_length 100;
    gzip_types application/javascript text/css text/xml;
    gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
    gzip_vary on;
    location /details {
       #使用缓存名称
       proxy_cache meitecache;
       #对以下状态码实现缓存
       proxy_cache_valid 200 206 304 301 302 1d;
       #缓存的key
       proxy_cache_key $request_uri;
       add_header X-Cache-Status $upstream_cache_status;
       proxy_pass   http://127.0.0.1:8080;
       index  index.html index.htm;
    }
    location /all {
       proxy_pass   http://127.0.0.1:8080;
       index  index.html index.htm;
    }
}

在这里插入图片描述

访问http://192.168.10.7:8080/all/productDetailsAll不会缓存数据
访问http://192.168.220.138:8888/details/productDetails?id=1&updatetime=2,021会缓存到cache文件夹

在这里插入图片描述

此时将项目停掉,访问http://192.168.220.138:8888/details/productDetails?id=1&updatetime=2,021依然可以访问,因为nginx将此缓存了下来

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值