您的位置:首页 > 运维架构 > 反向代理

Nginx系列之反向代理的妙用

2017-02-14 23:05 246 查看

1、概述

nginx的反向代理功能,使得nginx本身不必自己产生内容,而是把请求交给代理服务器,从代理服务器获取内容,返回给用户,对于解耦非常有用。此外,还有其他一些妙用。

2、有趣的例子

2.1 让你的网站看上去像qq官网

配置

location / {
proxy_pass http://www.qq.com/; }


效果截图



除了地址栏的地址不一样,页面内容是不是完全一样!

2.2 替换一些内容

location / {
# 必须设置,不然www.qq.com返回的是gzip压缩过的内容
proxy_set_header Accept-Encoding "";
proxy_pass http://www.qq.com/; # 使用sub模块
sub_filter_once off; # 可用替换多次
sub_filter "新闻" "旧闻"; # 把 新闻 替换成 旧闻
sub_filter "NBA" "NBC"; # 把 NBA 替换成 NBC
}


效果截图



从截图可用看到,只有“NBA”替换成“NBC”成功了,“新闻”替换成“旧闻”失败了,不要着急,下个例子我们解决这个问题。

2.3 处理字符编码

打开Chrome浏览器的调试窗口



从截图我们得知,服务器返回的内容经过了gzip压缩,内容编码为GB2312,gzip压缩的问题我们用 proxy_set_header Accept-Encoding “”; 指令解决了。对于编码问题,由于配置文件的编码为UTF-8,网页内容编码为GB2312,所以对于中文,编码不一样,无法用“旧闻”替换“新闻”。把配置文件夹保存为GBK(兼容GB2312)试下。



不出所料,生效了!

2.4 搞点事情

既然有sub_filer模块可以用来替换内容,不如把它发扬光大。

在 2.2 中最后一个sub_filter下面添加一行:

sub_filter "</html>" "<style>.qqlogo{transform:rotateX(180deg)!important;}</style></html>";




该配置指令的作用是在html文件末尾提交一个css样式,让.qqlogo 对应元素的样式翻转180度。果真起作用了,^_^。

2.5 两次proxy_pass

在 2.2 中,我们需要用 proxy_set_header Accept-Encoding “”;配置指令,以便让www.qq.com返回解压缩后的内容,以方便内容替换。这种做法会增加网络流量,那有有没有更好的方法呢?我百度了好久,有人提出用两次proxy_pass,第一次是向远程服务器,获取到的是gzip压缩的内容,第二次是内部proxy_pass,获取到解压后的内容。可惜没有例子。只好自己去试错了,功夫不负有心人,被我给试出来了,^_^。

location / {
# 该行指令与下面 location /pass/ 中的 gunzip on 二选一即可
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
# 内部proxy_pass
proxy_pass http://127.0.0.1/pass$uri; 
sub_filter_once off;
sub_filter "新闻" "旧闻";
sub_filter "NBA" "NBC";
sub_filter "</html>" "<style>.a_cover,.qqlogo{transform:rotateX(180deg)!important;}</style></html>";
}
location /pass/ {
#gunzip on;
proxy_pass http://www.qq.com/; }




跟上例一样的结果。

3、总结

nginx的反向代理功能还是挺强大的,恰当的使用能够实现一些非常有趣的功能。当然了,必须对HTTP协议很熟悉才能更好地使用。

声明:本文所有代码只能作为学习交流之用,万万不可用来做违法之事,否则后果自负。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: