1、代理及其配置语法
代理就是客户端首先请求代理,代理再把请求给服务端,服务端再通过代理返回给客户端。Nginx可以实现很多协议的代理:
最常用的是HTTP的代理,HTTP代理分为正向代理和反向代理。区别在于代理的对象不一样,正向代理代理的对象是客户端,比如说想访问谷歌,把代理服务器设置想访问的地址为谷歌就可以了,想访问什么就设置为什么,为我们客户端服务。反向代理代理的对象是服务端,我们并不需要关心服务端是哪一台服务器,反向代理放在服务端,它帮我们处理请求。
正向代理的场景:
1)一个公司所有的电脑没法上网了,只有一台机器可以上网的时候,往往需要配置一个代理的地址,通过这台代理服务器去上公网。
2)翻墙,通过国外的一台代理搜索想要看的网站。
反向代理的场景:
客户端请求一个网站的时候,不知道后端有多少台服务器,其实请求的是一个代理,代理把请求发给对应的服务器,服务器再返回给客户端。
代理的配置语法:
Syntax:proxy_pass URL;
Default:-
Context:location,if in location,limit_except
URL格式如:http://localhost:8000/uri/ 或者 https://localhost:8000/uri/ 或者 http://unix:/tmp/backend.socket:/uri/
2、演示反向代理
准备虚拟机151和152,Nginx端口分别是80和8080,思路是浏览器访问151,在151上配置反向代理,代理到152上,请求152上的页面。
152上新建测试文件/opt/app/code/test_proxy.html
<html> <head> <meta charset="utf-8"> <title>imooc1</title> </head> <body style="background-color:red;"> <h1>Welcome to 192.168.7.152</h1> </body> </html>
修改152配置文件,给test_proxy.html配置一个默认访问路径并修改端口,新加配置如下:
location ~ .*.(html|htm)$ { root /opt/app/code; }
修改151配置文件,配置反向代理:
location ~ /test_proxy.html$ { proxy_pass http://192.168.7.152:8080; }
启动两个nginx服务,并测试http://192.168.7.151/test_proxy.html,代理成功!
3、演示正向代理
准备两台虚拟机151和152,思路是152上页面只允许151访问,如果想用本地浏览器访问,只能为浏览器设置代理,代理到151访问152。
152上新建测试文件/opt/app/code/jesonc.html
<html> <head> <meta charset="utf-8"> <title>jeson1</title> </head> <body > <h1>Jeson<h1> </body> </html>
152上修改配置文件,只允许192.168.7.151访问,并且指定了首页访问目录:
location / { allow 192.168.7.151; deny all; root /opt/app/code; index index.html index.htm; }
151上修改配置文件,配置正向代理,指定DNS
resolver 8.8.8.8; location / { proxy_pass http://$http_host$request_uri; }
重新启动两台虚拟机的Nginx,浏览器访问:http://192.168.7.152/jesonc.html,浏览器直接访问152,返回403。
下面为浏览器设置代理,打开IE浏览器(谷歌浏览器代理插件SwitchySharp没安上。。。),IE浏览器设置代理很简单:依次点击工具->Internet选项->连接->局域网设置,填写代理地址和端口,如图所示(如果设置完不生效请关闭再重新打开浏览器):
在IE中输入:http://192.168.7.152/jesonc.html,访问成功!
说明:
1)proxy_pass http://$http_host$request_uri 中 $http_host是192.168.7.152,$request_uri是/jesonc.html。
2)在IE浏览器中设置了代理,在谷歌浏览器居然也成功代理了。。。相通的。。。
3)如果虚拟机152经过了一级或多级代理的话,应该使用$http_x_forwarded_for判断,不能用deny、allow,语法如:
location / { if ( $http_x_forwarded_for !~* "^192.168.7.151") { return 403; } root /opt/app/code; index index.html index.htm; }
4、代理的常用配置
在官网http://nginx.org的documentation中可以查找proxy的全部配置,地址如下:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
1)配置缓存区
Syntax:proxy_buffering on | off;
Default:proxy_buffering on;
Context:http,server,location
扩展:proxy_buffer_size、proxy_buffers、proxy_busy_buffers_size
2)配置跳转重定向
Syntax:proxy_redirect default;proxy_redirect off;proxy_redirect redirect replacement;
Default:proxy_redirect default;
Context:http,server,location
3)配置头信息
Syntax:proxy_set_header field value;
Default:proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context:http,server,location
扩展:proxy_hide_header、proxy_set_body
4)配置超时
Syntax:proxy_connect_timeout time;
Default:proxy_connect_timeout 60s;
Context:http,server,location
扩展:proxy_read_timeout、proxy_send_timeout
5) 代理配置示例
location / { proxy_pass http://127.0.0.1:8080; proxy_redirect default; proxy_set_header Host $http_host;#设置头信息host proxy_set_header X-Real-IP $remote_addr;#设置头信息客户端真实IP proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; proxy_buffering on; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k; }
可以把公共信息提取出来,放到一个单独的文件里,比如文件名:proxy_params,然后使用 include加载
proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; proxy_buffering on; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k;
location / { proxy_pass http://127.0.0.1:8080; include proxy_params; }