你的位置:首页 > 软件开发 > 操作系统 > nginx的rewrite,gzip,反向代理学习笔记

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

发布时间:2016-04-22 11:00:14
rewrite模块名:ngx_http_rewrite_module默认自动被编译指令:rewrite regex replacement [flag]regex :正则表达式,用于匹配用户请求的urireplacement:重写后的结果flag:last:重写完成之后停止对当前 ...

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

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

指令:rewrite regex replacement [flag]

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

replacement:重写后的结果

flag:

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

 

break:重写完成后,停止对当前uri的处理,转向其后面的其他配置

 

补充:last 重写之后还会在nginx内部重新自上而下检查规则,break则不会重新检查规则

 

redirect:重写完成之后会返回给客户端一个临时重定向,由客户端对新的uri发起请求(302)

 

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

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

 

实例:

server  {

  ...

  rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last

  ...

}

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

http://ww.c.com/download/a/media/12.wmv--->/download/a/mp3/12.mp3

 

如果flag没有指定,则默认为last

PCRE正则表达式元字符

      字符匹配 . [] [^]

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

      位置定位 ^,$

      或者 |

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

 

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

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

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

 

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

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

 

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

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不需指定默认会被编译

 

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

gzip on 开启动态压缩功能  gzip_min_length 触发压缩功能的响应报文的最小长度 单位为字节  gzip_http_version 触发压缩功能的http协议最小版本  gzip_disable msie6 对IE6的浏览器发送响应报文时不进行压缩   gzip_types 对哪些类型的资源做压缩

 

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

proxy_pass URL

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

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

反代www.d.com--->http://192.168.238.150

 

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

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

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

上面三个图都是反代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后面, 

 

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

反代www.d.com/admin ---> http://192.168.238.150/hello  如果location中最后有/则hello最后也要有/否则会报错

 

如果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的值

 

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

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

$remote_addr代表上游客户端的ip地址,我们去backend server上修改一下日志记录格式就可以将真实客户端的ip地址记录到日志中去了(后端是httpd server)

 

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

 

将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呢?

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:nginx的rewrite,gzip,反向代理学习笔记

关键词:ip

ip
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。