高性能反向代理服务器--Nginx
本文简述:rewrite使用、浏览器本地缓存配置及动静分离
个人学习笔记,如有不足,欢迎指正。 2018-5-22
一、内容
1、Rewrite的使用
2、缓存配置及Gzip配置
二、笔记
1.1)rewrite的使用
rewrite通过ngx_http_rewrite_module模块支持url重写、支持if判断,但不支持else.
rewrite功能是:使用nginx提供的全局变量或子集设置的变量,结合正则表达式和标志位实现url重写以及重定向。
rewrite只能是放在server{},location{},if{}中 ,并且只能对域名后边的除去传递的参数外的字符串起作用。
1.2)常用指令
if 空格 (条件) {设定条件进行重写}
条件语法
-
“=” 判断相等,用于字符比较。
-
"~"用正则来匹配 (表示区分大小写),“~*” 不区分大小写
-
"-f -d -e"来判断是否为文件、目录、是否存在
关于if (条件)中的条件,具体还有那些功能大家可以参见官方文档。
以下是这段文字是Module ngx_http_rewrite_module 中的内容。
A condition may be any of the following:
a variable name; false if the value of a variable is an empty string or “0”;
Before version 1.0.1, any string starting with “0” was considered a false value.
comparison of a variable with a string using the “=” and “!=” operators;
matching of a variable against a regular expression using the “~” (for case-sensitive matching) and “~” (for case-insensitive matching) operators. Regular expressions can contain captures that are made available for later reuse in the $1..$9 variables. Negative operators “!~” and “!~” are also available. If a regular expression includes the “}” or “;” characters, the whole expressions should be enclosed in single or double quotes.
checking of a file existence with the “-f” and “!-f” operators;
checking of a directory existence with the “-d” and “!-d” operators;
checking of a file, directory, or symbolic link existence with the “-e” and “!-e” operators;
checking for an executable file with the “-x” and “!-x” operators.
return指令
语法:return code;
停止出来并返回指定状态码给客户端。
if($request_uri ~*\.sh){
return 403
}
set指令
set variable value;
定义一个变量并复制,值可以是文本、变量或者文本变量混合体。
rewrite指令
语法:rewrite regex replacement [flag]{last / break/ redirect 返回临时302/ permant 返回永久302}
last
:停止处理后续的rewrite指令集、然后对当前重写的url在rewrite指令集上重新查找。
break
:停止出来后续的rewrite指令集,并不会重新查找。
示例
-
拦截以
/
开头的url ,重定向到百度网页。location / { # root html; # index index.html; rewrite ^/ http://www.baidu.com; #重定向 }
-
正则匹配url中请求的地址,假设我们请求的地址是192.168.0.85/images/www/wcl.png 会重写到
/mic?file=wcl.png
,于是变匹配到location /mic
;通过try_files
获取存在的文件进行返回。如果存在这个文件 便显示,如果不存在,接着向下匹配location = /image404.html
最终返回404错误。location / { rewrite '^/images/([a-z]{3})/(.*)\.(png)$' /mic?file=$2.$3 last;##注意 此处last可以不写 也可以写break 作用不同 set $image_file $2; set $image_file $3; } location /mic { root html; try_files /$arg_file /image404.html; } location = /image404.html { return 404 "image not found exception"; }
注意:上述代码中我添加注释的部分:如果是last,最后运行结果和不加last效果一样,显示结果__404image not found exception __ ;如果是break,最终显示的结果是:
404 Not Found
rewrite匹配规则
似乎我们看到rewrite
与location
功能相似,都实现了跳转。在这里我们要重要强调rewrite
与location
本质区别。
rewrite
是在同一域名内,更改获取资源的路径。
location
是对一类路径做控制访问或反向代理,可以proxy_pass
到其他机器。
在实际应用中rewrite
也会写在location
中,执行顺序是:
-
执行server块的rewrite指令。
-
执行location匹配
-
执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误
2.1)浏览器本地缓存配置及动静分离
语法:expires 60s|m|h|d
示例:
-
在这里,我在html目录下创建了一个images文件夹,该文件夹下有一张图片。
-
修改index.html, 增加
<img src=”图片”/>
-
修改nginx.conf配置。配置两个location实现动静分离,并且在静态文件中增加
expires
的缓存期限 为5min。 location /{ root html; index index.html index.htm; } location ~ \.(png|js|jpg|gif|css)$ { root html/images; expires 5m; ##静态资源缓存 缓存在浏览器中 5min中之内不去去找服务器找这个文件 }
-
好了 运行nginx,在地址栏输入地址请求 。f12
- 第一次访问.png
-
第二次访问
- 这里写图片描述
-
其实我们可以f12查看这张图片的在此请求的时间,而不是从浏览器缓存中读取:
- expires.png
2.2)Gzip压缩策略
浏览器请求-->告诉服务器当前浏览器可以致辞压缩类型-->服务端会把内容根据浏览器所所支持的压缩策略去进行压缩返回
-->浏览器拿到数据后解码;
常见的压缩方式:gzip
、deflate
、sdch
在这里我看一下我的chrome的解压方式。
chrome解压方式.png示例:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65s;
server {
listen 80;
server_name localhost 192.*;
gzip off; #开启
gzip_buffers 4 16k; # 以16k为单位申请4倍的压缩使用内存
gzip_comp_level 4; # 压缩级别 级别越高 最大到9 越高越容易失真 同时 压缩涉及到运算 影响cpu性能
gzip_min_length 500;# 压缩时 这个文件达到最小的长度不被压缩。
gzip_types text/css text/xml application/javascript; #针对于那些类型的文件进行压缩 mime.types
## 浏览器缓存
location /{
root html;
index index.html index.htm;
}
location ~ \.(png|png|js|jpg|gif|css)$ {
root html/images;
expires 5m; ##静态资源缓存 缓存在浏览器中 5min中之内不去去找服务器找这个文件
}
}
}
注意:
1、图片、mp3这样的二进制文件,没有必要进行压缩处理。因为这类文件压缩比很小,压缩过程会耗费CPU资源
2、太小的文件没有必要压缩,因为压缩以后会增加一些头信息,反而会当导致文件变大
3、Nginx默认只对text/html进行压缩,如果要对html之外的内容进行压缩传输,需要我们手动配置。配置类型可以参见mime.types
网友评论