当前位置: 首页 > news >正文

nginx 动静分离

一.动静分离

1.动静分离的好处

Apache Tocmat 严格来说是一款java EE服务器,主要是用来处理 servlet请求。处理css、js、图片这些静态文件的IO性能不够好,因此,将静态文件交给nginx处理,可以提高系统的访问速度,减少tomcat的请求次数,有效的给后端服务器降压。

2.分离静态文件

部署ruoyi-admin.war

mv /home/apps/ruoyi-admin.war /home/apache-tomcat-8.5.81/webapps/ROOT.war
rm -rf /home/apache-tomcat-8.5.81/webapps/ROOT
/home/apache-tomcat-8.5.81/bin/startup.sh

os400=false
case "`uname`" in
OS400*) os400=true;;
esac

# resolve links - $0 may be a softlink
PRG="$0"

while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done

PRGDIR=`dirname "$PRG"`
EXECUTABLE=catalina.sh

# Check that target executable exists
if $os400; then
  # -x will Only work on the os400 if the files are:
  # 1. owned by the user
  # 2. owned by the PRIMARY group of the user
  # this will not work if the user belongs in secondary groups
  eval
else
  if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
    echo "Cannot find $PRGDIR/$EXECUTABLE"
    echo "The file is absent or does not have execute permission"
    echo "This file is needed to run this program"
    exit 1
  fi
fi

exec "$PRGDIR"/"$EXECUTABLE" start "$@"

顺带看下日志是否启动成功

部署完成后,对项目目录稍作调整

cd /home/apache-tomcat-8.5.81/webapps/ROOT
mv WEB-INF/classes/static/i18n  WEB-INF/classes/templates/i18n 
mv WEB-INF/classes/static /home/www/

更改移动了国际化目录     要修改application.yml

messages:
    # 国际化资源文件路径 
    # 将 static/i18n/messages 修改为 templates/i18n/messages
    basename: templates/i18n/messages

静态文件目录说明:

除了js、css、图片文件之外,还有字体文件和一个ie提示页面。

新建一个配置文件:

server{
    listen 8002;
    server_name ruoyi.tomcat;


  location / {
    proxy_pass http://localhost:8080/;
  }
  
  location = /html/ie.html {
    root  /home/www/static;
  }
  
  location ^~ /fonts/ {
    root  /home/www/static;
  }
  
  location ~ \.(css|js|png|jpg|gif|ico) {
    root /home/www/static;
  }
}

重新启动服务

没有了静态资源, 现在的8080端口效果:

试试8002,错误

看下错误日志:显示没有权限

tail -f /var/log/nginx/error.log 

修改下权限

chmod -R 777 /home/www/static

3.location 修饰符

  • location可以使用修饰符或正则表达式

修饰符:

= 等于,严格匹配 ,匹配优先级最高。

^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。

~ 区分大小写

~* 不区分大小写

  • 优先级

优先级从高到低依次为:。

  1. 精确匹配(=)
  2. 前缀匹配(^~)
  3. 正则匹配(~和~*)
  4. 不写
location ^~ /images/ {
    proxy_pass http://localhost:8080;
}

location ~ \.jpg {
    proxy_pass http://localhost:8080;
}

如上所示:

/images/1.jpg代理到 http://localhost:8080/images/1.jpg

/some/path/1.jpg 代理到http://localhost:8080/some/path/1.jpg

二.缓冲

缓冲(buffer)

缓冲一般放在内存中,如果不适合放入内存(比如超过了指定大小),则会将响应写入磁盘临时文件中。

启用缓冲后,nginx先将后端的请求响应(response)放入缓冲区中,等到整个响应完成后,再发给客户端。

客户端往往是用户网络,情况复杂,可能出现网络不稳定,速度较慢的情况。

而nginx到后端server一般处于同一个机房或者区域,网速稳定且速度极快。

如果禁用了缓冲,则在客户端从代理服务器接收响应时,响应将同步发送到客户端。对于需要尽快开始接收响应的快速交互式客户端,此行为可能是可取的。

这就会带来一个问题:因为客户端到nginx的网速过慢,导致nginx只能以一个较慢的速度将响应传给客户端;进而导致后端server也只能以同样较慢的速度传递响应给nginx,造成一次请求连接耗时过长。

在高并发的情况下,后端server可能会出现大量的连接积压,最终拖垮server端。

开启代理缓冲后,nginx可以用较快的速度尽可能将响应体读取并缓冲到本地内存或磁盘中,然后同时根据客户端的网络质量以合适的网速将响应传递给客户端。

这样既解决了server端连接过多的问题,也保证了能持续稳定的像客户端传递响应。

使用proxy_buffering启用和禁用缓冲,nginx默认为 on 启用缓冲,若要关闭,设置为 off 。

proxy_buffering off;

proxy_buffers 指令设置每个连接读取响应的缓冲区的大小数量 。默认情况下,缓冲区大小等于一个内存页,4K 或 8K,具体取决于操作系统。

来自后端服务器响应的第一部分存储在单独的缓冲区中,其大小通过 proxy_buffer_size 指令进行设置,此部分通常是相对较小的响应headers,通常将其设置成小于默认值。

location / {
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_pass http://localhost:8088;
}

如果整个响应不适合存到内存里,则将其中的一部分保存到磁盘上的‎‎临时文件中‎‎。

‎‎proxy_max_temp_file_size‎‎设置临时文件的最大值。

‎‎proxy_temp_file_write_size‎‎设置一次写入临时文件的大小。

缓存(cache)

启用缓存后,nginx将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量。

启用缓存,需要在http上下文中使用 proxy_cache_path 指令,定义缓存的本地文件目录,名称和大小。

缓存区可以被多个server共享,使用proxy_cache 指定使用哪个缓存区。

http {
    proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
    server {
        proxy_cache mycache;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

缓存目录的文件名是 proxy_cache_key 的MD5值。

例如:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

proxy_cache_key 默认设置如下:

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

也可以自定义缓存的键,例如

proxy_cache_key "$host$request_uri$cookie_user";

缓存不应该设置的太敏感,可以使用proxy_cache_min_uses设置相同的key的请求,访问次数超过指定数量才会被缓存。

proxy_cache_min_uses 5;

默认情况下,响应无限期地保留在缓存中。仅当缓存超过最大配置大小时,按照时间删除最旧的数据。

示例

proxy_cache_path /var/cache/nginx/data keys_zone=mycache:10m;

server {

    listen 8001;
    server_name ruoyi.localhost;
    
    location / {
        #设置buffer
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
        proxy_pass http://localhost:8088;        

    }


    location ~ \.(js|css|png|jpg|gif|ico) {
        #设置cache
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;

        proxy_pass http://localhost:8088;  
    }

    location = /html/ie.html {

        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;

        proxy_pass http://localhost:8088;  
    }

    location ^~ /fonts/ {

        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;

        proxy_pass http://localhost:8088;  
    }

}

相关文章:

  • python和Java的区别
  • Modin - pandas 替代和扩展
  • 搜索-BFS
  • 【数据结构】优先级队列(堆) —— PriorityQueue
  • SKBD(Scorpion-Killer) Linux-SSH长期隐藏后门持久化控制注入工具
  • 如何设置动态代理提高Python爬虫稳定性?
  • 模块化开发实战:解剖module-info.java的8个关键场景
  • Jmeter中的身份认证:cookie和token
  • Linux系统中快速安装docker
  • github匿名链接获取方法
  • 深度学习处理文本(1)
  • 深入理解MySQL索引:从二叉搜索树到B+Tree
  • STM32-DMA
  • opencv python的 Canny findContours得到两个非常接近的轮廓,角点有几个像素的差距,如何处理?
  • Java学习笔记1——编程基础
  • 终值定理的推导与理解
  • <em>乐</em><em>发</em><em>V</em><em>Ⅱ</em><em>彩</em><em>票</em>
  • 在MCU工程中优化CPU工作效率的几种方法
  • 变量1(WEB)
  • dart错误记录