nginx的rewrite,gzip,反向代理学习笔记

rewrite模块名:ngx_http_rewrite_module默认自动被编译php

指令:rewrite regex replacement [flag]html

regex :正则表达式,用于匹配用户请求的uringinx

replacement:重写后的结果正则表达式

flag 能够有四个值分别为last,break,redirect,permanentvim

  last:重写完成以后中止对当前uri的进一步处理,改成对新uri的新一轮处理,在nginx内部完成,客户端不会察觉后端

 

  break:重写完成后,中止对当前uri的处理,转向其后面的其余处理浏览器

 

  补充:last 重写以后还会在nginx内部从新自上而下检查rewrite匹配规则,break则不会从新检查rewrite匹配规则缓存

 

  redirect:重写完成以后会返回给客户端一个临时重定向,客户端浏览器自动对新的uri发起请求(302)服务器

 

  permanent:重写完成后会返回给客户端一个永久重定向,客户端浏览器自动对新的uri发起请求(301)url

应用上下文:http,server,location,if

 

实例:

.*表示任意内容,\.表示对.进行转义  $1对前面的第一个()中的内容$2引用第二个()中的内容以此类推

http://www.b.com/download/a/media/12.php--->/tmp/download/a/mp3/12.html

 

若是flag没有指定,则默认为last

PCRE正则表达式元字符

      字符匹配 . [] [^]

      次数匹配 * + ? {m} {m,} {m,n}

      位置定位 ^,$

      或者 |

      分组 () 后向引用 $1 $2…

 

rewrite_log on|off  是否将重写日志记入error log中,默认为关闭

www.c.com/bbs/index.html---> /tmp/vhost2/forum/index.html

 

上面的if语句的做用:www.c.com/download ---> www.c.com/index.html   return表示把新的uri发送给客户端,由客户端从新

请求

 

http://www.c.com/hello/ ---> https://www.baidu.com

 

模块ngx_http_gzip_static_module是nginx会读取预先gzip压缩好的文件,静态压缩只需压缩一次,不须要每次请求都压缩,此模

块编译时须要使用--with-http_gzip_static_module参数才会被编译,模块ngx_http_gzip_module不需指定默认会被编译

 

gzip on 开启动态压缩功能  gzip_min_length 触发压缩功能的响应报文的最小长度 单位为字节  gzip_http_version 触发压缩功能

的http协议最小版本  gzip_disable msie6 对IE6的浏览器发送响应报文时不进行压缩   gzip_types 对哪些类型的资源作压缩,好比

压缩图片:image/jpeg image/gif image/png

 

反向代理模块ngx_http_proxy_module 默认会被编译

proxy_pass URL

应用上下文:location,location内部的if中,limit_except

反代www.d.com--->http://192.168.238.150  注意若是location中使用了模式匹配如 ~*,~等proxy_pass最后的斜线不能加

否者会报错

这里还得说下location 后面匹配的优先级

 =:URI的精确匹配;

~:作正则表达式匹配,区分字符大小写;
~*:作正则表达式匹配,不区分字符大小写;
^~:URI的左半部分匹配,不区分字符大小写;

匹配优先级:精确匹配=、^~、~或~*、不带符号的URL

 

上面三个图都是反代www.d.com/admin --> http://192.168.238.150/admin/    所以若是http://192.168.238.150/ 则最后

的/会被location后定义的参数覆盖,若是http://192.168.238.150则location后定义的参数会被添加到http://192.168.238.150后

面, 

 

若是location后面跟了正则表达式或者location上下文使用了rewrite则proxy_pass 后的url 必须是http://192.168.238.150这种形

式,后面不能带uri,哪怕只有/也不能够

 

接下来了解一个参数proxy_set_header field value,用于proxy_server向backend server 发送请求报文时,将某请求首部从新赋

值,或在原有值后面添加一个新值,或者自定义一个新首部,好比proxy_set_header Host value  Host是请求报文请求首部的

Host,这里的value有两个值要介绍一下,$proxy_host  假如proxy_pass http://www.a.com 那$proxy_host指的就是

www.a.com,  $http_host 这个是客户端请求报文请求首部Host的值

 

 

上面的proxy_set_header做用是当nginx做为反代去请求backend server时会在请求首部添加一个x-real-ip的首部,而且指定其值

为$remote_addr

 

$remote_addr表明上游客户端的ip地址,咱们去backend server上修改一下日志记录格式就能够将上游客户端的ip地址记录到日志

中去了(后端是httpd server)

 到后端server修改日志格式 vim /var/log/httpd/access.log

 

将LogFormat 后的%h修改成%{x-real-ip}i  后面的i是指定其值的,可是若是有多层反代怎么解决记录真实ip地址的问题?

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for  其中X-Forwarded-For是约定俗成的首部名,

$proxy_add_x_forwarded_for的含义是无论X-Forwarded-For中有没有值都将上游客户端的ip地址添加到X-Forwarded-For首部

中,每台反代都添加这条命令就解决了上面的问题,若是经过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串ip

值,究竟哪一个才是真正的用户端的真实IP呢?

X-Forwarded-For: client1, proxy1, proxy2

X-Forwarded-For会取得第一个非unknown的有效IP字符串。

 

 

上面的设置,当代理服务器向后端请求时,会将请求报文的请求首部Host设置为客户端请求报文的请求首部Host的值

 

add_header这个参数是当代理服务器返回给客户端是在响应首部添加Via这个首部并赋值为$server_addr  $server_addr是nginx的

内置变量其值为代理服务器本身的ip地址

 

 

反向代理缓存能把静态页面和动态页面的请求都缓存下来,proxy_cache_path 只能存放于http上下文中,不能放置于server或

location

proxy_cache_path 指定缓存目录,prxoy的上一级目录必须存在不然会报错, levels指定该缓存空间有两层hash目录,第一层目录

为1个字符,第二层为2个字符,keys_zone=pcache 参数用来为这个缓存区起名(proxy_cache 指令须要用到  其后对应缓存区名

称)后面的10m指内存缓存空间大小为10MB(这个10MB指的是对文件元数据的缓存), inactive=3h 指若是缓存数据在3小时

(天:d、秒:s、分:m)内没有被访问,将自动被删除 max_size=10g 指硬盘缓存大小为10GB,proxy_cache调用缓存区若是后

面跟的值为off表示禁用  proxy_cache_key $request_uri  以$request_uri的值为缓存键值,这样作即便有多个主机名也同样能缓

存命中了 ,在这里proxy_cache_key参数能够省略不指 

请求

http://www.ooxx.com/book/1232.html 

$request_uri表明的是/book/1232.html

proxy_cache_valid指令,能够在http、server、location中使用,若是proxy_cache_valid 不指定状态码,直接指定缓存时间,将

只缓存默认的状态码(200、30一、302),而若是须要对304也指定,则须要写完整的状态码,如上面写的200 304

 

proxy_connect_timeout 定义与后端服务器的超时时长;默认为60s 建议不超过75s

proxy_send_timeout 请求报文发送给后端服务器的超时时长,默认为60s

proxy_read_timeout 等待后端服务器发送响应报文的超时时长,默认为60s

上面三个指令能够定义在http server location中

相关文章
相关标签/搜索