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。优先级第二高。
~ 区分大小写
~* 不区分大小写
- 优先级
优先级从高到低依次为:。
- 精确匹配(=)
- 前缀匹配(^~)
- 正则匹配(~和~*)
- 不写
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;
}
}