Nginx配置分析 (nginx 三)
Rewrite全局变量
rewrite全局变量表
变量 | 含义 |
---|---|
$args | 这个变量等于请求行中的参数,同$query_string |
$content length | 请求头中的Content-length字段。 |
$content_type | 请求头中的Content-Type字段。 |
$document_root | 当前请求在root指令中指定的值。 |
$host | 请求主机头字段,否则为服务器名称。 |
$http_user_agent | 客户端agent信息 |
$http_cookie | 客户端cookie信息 |
$limit_rate | 这个变量可以限制连接速率。 |
$request_method | 客户端请求的动作,通常为GET或POST。 |
$remote_addr | 客户端的IP地址。 |
$remote_port | 客户端的端口。 |
$remote_user | 已经经过Auth Basic Module验证的用户名。 |
$request_filename | 当前请求的文件路径,由root或alias指令与URI请求生成。 |
$scheme | HTTP方法(如http,https)。 |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值。 |
$server_name | 服务器名称。 |
$server_port | 请求到达服务器的端口号。 |
$request_uri | 包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。 |
$uri | 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 |
$document_uri | 与$uri相同。 |
常用命令
if
格式
If 空格 (条件) {设定条件进行重写}
条件的语法:
- “=” 来判断相等,用于字符比较
- “~” 用正则来匹配(表示区分大小写),“~*” 不区分大小写
- “-f -d -e” 来判断是否为文件、目录、是否存在
return 指令
语法:return code;
停止处理并返回指定状态码给客户端。
例子,拦截后缀为sh的url
if ($request_uri ~* \.sh$ ){
return 403;
}
set指令
set variable value;
定义一个变量并复制,值可以是文本、变量或者文本变量混合体
rewrite指令
语法:rewrite regex replacement [flag]{last / break/ redirect 返回临时302/ permant 返回永久302}
last: 停止处理后续的rewrite指令集、 然后对当前重写的uri在rewrite指令集上重新查找
break; 停止处理后续的rewrite指令集 ,并不会重新查找
综合实例
如上配置对于: /images/ttt/test.png 会重写到/mic?file=test.png, 于是匹配到 location /mic ; 通过try_files获取存在的文件进行返回。最后由于文件不存在所以直接
返回404错误
rewrite匹配规则
表面看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
• 执行server块的rewrite指令
• 执行location匹配
• 执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误
location / {
rewrite '^/images/[a-z]{4}/(.*)' /other/static/s1/$1;
}
浏览器本地缓存配置
语法: expires 60s|m|h|d
操作步骤
• 在html目录下创建一个images文件,在该文件中放一张图片
• 修改index.html, 增加<img src=”图片”/>
• 修改nginx.conf配置。配置两个location实现动静分离,并且在静态文件中增加expires的缓存期限
location ~* \.(jpg|js|png|css)$ {
root html;
expires 356d;
}
添加图片配置
数据来自于缓存
Gzip压缩策略
浏览器请求 -> 告诉服务端当前浏览器可以支持压缩类型->服务端会把内容根据浏览器所支持的压缩策略去进行压缩返回
->浏览器拿到数据以后解码; 常见的压缩方式:gzip、deflate 、sdch
Gzip on|off 是否开启gzip压缩
Gzip_buffers 4 16k #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
Gzip_comp_level[1-9] 压缩级别, 级别越高,压缩越小,但是会占用CPU资源
Gzip_disable #正则匹配UA 表示什么样的浏览器不进行gzip
Gzip_min_length #开始压缩的最小长度(小于多少就不做压缩)
Gzip_http_version 1.0|1.1 表示开始压缩的http协议版本
Gzip_proxied (nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)
Gzip_type text/pliain,application/xml 对那些类型的文件做压缩 (conf/mime.conf)
Gzip_vary on|off 是否传输gzip压缩标识
注意点
- 图片、mp3这样的二进制文件,没必要做压缩处理,因为这类文件压缩比很小,压缩过程会耗费CPU资源
- 太小的文件没必要压缩,因为压缩以后会增加一些头信息,反而导致文件变大
- Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行压缩传输,我们需要手动来配置
Nginx反向代理
Proxy_pass
通过反向代理把请求转发到百度
Proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端口
Proxy_pass指定的地址携带了URI,看我们前面的配置【/s】,那么这里的URI将会替换请求URI中匹配location参数部分;如上代码将会访问到http://www.baidu.com/s
interface_version