Nginx正反代理
一 Nginx代理
1.1 Nginx代理概述
nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器。同时也是一个IMAP、POP3、SMTP代理服务器。nginx可以作为一个HTTP服务器进行网站的发布处理,同时nginx可以作为反向代理进行负载均衡的实现。
1.2 Nginx代理模式
Nginx通常有如下三种代理模式:
- 正向代理(forward proxy)
- 反向代理(reverse proxy)
- 透明代理
1.3 正向代理
正向代理(forward)是一个位于客户端和原始服务器(origin server)之间的服务器,即代理服务器。为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器,然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。
场景一:客户端访问本来无法访问的原始服务器的资源
假设最初客户端要访问原始服务器需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障(或存在禁止访问的安全策略等),那么就无法访问原始服务器了。
但是如果客户端让代理服务器去代替自己访问原始服务器,由于代理服务器没有在路由器R1或R2节点中,而是通过其它的路由节点访问的原始服务器,那么客户端就可以得到原始服务器的数据了。
场景二:加速访问原始服务器的资源
假设客户端要访问原始服务器,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而客户端到代理服务器,从代理服务器到原始服务器都是高带宽链路。那么使用正向代理则可以加速访问。
场景三:Cache作用
Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术)。
如上图所示,假设客户端要访问原始服务器某数据A之前,代理服务器已经通过访问原始服务器数据A,那么代理服务器会把数据A保存一段时间,此时再次通过代理服务器访问数据A,那么代理服务器不再访问原始服务器,而把缓存的数据A直接发给客户端。这一技术在Cache中术语就叫Cache命中。
场景四:代理服务器实现授权控制
如上图所示,防火墙作为网关,用来过滤外网对其的访问。假设局域网内部客户端A和客户端B都设置了代理服务器。可通过代理服务器配置客户端A允许访问互联网,而客户端B不允许访问互联网,从而实现不通客户端的访问代理授权控制。
场景五:隐藏客户端踪迹
如上图所示,原始服务器并不知道访问自己的实际的客户端,因为代理服务器代替客户端去直接与原始服务器进行交互,从而对于原始服务器而言,客户端的踪迹被隐藏了。
1.4 反向代理
反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
场景一:隐藏原始服务器踪迹
客户端始终认为它访问的是原始服务器而不是代理服务器,但实用际上反向代理服务器接受客户端的应答,从原始资源服务器中取得客户端的需求资源,然后发送给客户端。由于防火墙的作用,只允许代理服务器访问原始资源服务器。对于此环境下,防火墙和反向代理的共同作用保护了原始资源服务器,对于客户端而言是透明的。
场景二:负载均衡器
当反向代理服务器存在多个,从而部署为集群,当多个客户端访问原始服务器(原始服务器也可以是集群)的时候,不同的代理服务器应答不同的客户端,然后发送不同的客户端所需的资源,从而实现负载均衡效果。
提示:Nginx基于反向代理实现负载均衡配置参考《012.Nginx负载均衡》。
场景三:Cache作用
同时反向代理服务器类似正向代理服务器一样拥有Cache的作用,可以缓存原始资源服务器的资源,而不是每次都要向原始资源服务器组请求数据,特别对于一些静态的数据,比如图片和普通文件,如果这些反向代理服务器能够做到和客户端来自同一个网络,那么客户端访问反向代理服务器,就会得到很高质量的速度。这正是CDN技术的核心。场景四:正方代理混合场景
实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。
1.5 透明代理
参考:https://www.cnblogs.com/gbq-dog/p/10653054.html。
1.6 常见代理软件
通常大多数开源代理软件,都能实现正反代理两种方式。开源软件中如squid,既可以做正向代理,也可以实现反向代理。MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,如Nginx。
二 代理配置项
2.1 配置语法
语法:proxy_buffering on | off;
默认值:proxy_buffering on;
可配置段:http, server, location
作用:配置proxy缓冲区。
扩展:
- proxy_buffer_size:设置缓冲区大小(内存页大小)
- proxy_buffers:设置缓冲区数量和大小(内存页数量和大小)
- proxy_busy_buffers_size:设置最大缓冲区大小
语法:proxy_redirect default; proxy_redirect off; proxy_redirect redirect replacement;
默认值:proxy_redirect default;
可配置段:http, server, location
作用:配置proxy重定向。
扩展:
语法:proxy_buffering on | off;
默认值:proxy_buffering on;
可配置段:http, server, location
作用:配置proxy缓冲区。
扩展:
语法:proxy_set_header field value;
默认值:proxy_set_header Host $proxy_host; proxy_set_header Connection close;
可配置段:http, server, location
作用:配置proxy头信息。
扩展:
- proxy_hide_header:设置隐藏头信息字段;
- proxy_set_body:设置请求体返回信息。
语法:proxy_connect_timeout time;
默认值:proxy_connect_timeout 60s;
可配置段:http, server, location
作用:配置proxy超时。
扩展:
- proxy_hide_header:设置隐藏头信息字段;
- proxy_set_body:设置请求体返回信息。
三 配置正向代理
3.1 正向代理配置
[root@master ~]# vi /etc/nginx/conf.d/reverse.conf server{ resolver 8.8.8.8; #配置DNS解析IP地址 resolver_timeout 30s; #超时时间(5秒) listen 8080; access_log /var/log/nginx/reverse.access.log main; error_log /var/log/nginx/reverse.error.log warn; location / { proxy_pass http://$http_host$request_uri; #配置正向代理参数 proxy_set_header Host $http_host; #解决如果URL中带"."后Nginx 503错误 proxy_buffers 256 4k; #配置缓存大小 proxy_max_temp_file_size 0; #关闭磁盘缓存读写减少I/O proxy_connect_timeout 30; #代理连接超时时间 proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; #配置代理服务器缓存时间 } }
[root@master ~]# nginx -t -c /etc/nginx/nginx.conf nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@master ~]# nginx -s reload
配置释义:
不能有hostname。
必须有resolver, 即dns,超时时间(30秒)可选。
配置正向代理参数,均是由 Nginx 变量组成。
提示:配置好后,重启nginx,以浏览器为例,若需要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+80即可使用了。
四 反向代理配置
4.1 环境预设
主机
|
作用
|
备注
|
192.168.1.220
|
代理服务器
|
反向代理服务器
|
192.168.1.221
|
原始服务器
|
模拟原始服务器
|
4.2 配置反向代理
[root@master ~]# vi /etc/nginx/conf.d/forward.conf server { listen 80; server_name 192.168.1.220; access_log /var/log/nginx/forward.access.log main; error_log /var/log/nginx/forward.error.log warn; location / { proxy_pass http://192.168.1.221; proxy_redirect off; # proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } }
[root@master ~]# nginx -t -c /etc/nginx/nginx.conf nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@master ~]# nginx -s reload
配置释义:
proxy_set_header X-Real-IP $remote_addr:把源IP【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP,从而通过$X-Real-IP来获取源IP;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for:在nginx作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用【,】隔开。
4.3 测试反向代理
原始服务器把nginx安装好,测试页面要写好。
[root@node01 ~]# cd /usr/share/nginx/html/ [root@node01 html]# echo "192.168.1.221:80" > index.html
参考文档:https://www.runoob.com/w3cnote/nginx-proxy-balancing.html
4.4 其他代理配置语句
proxy_pass:设置代理服务器的地址,可以是主机名称、IP地址加端口号等形式。
proxy_pass URL
提示:
1:当代理的是一组服务器时可以使用 upstream 指令来设置。
2:当URL中含有uri时,(例如 "http://127.0.0.1:8080/"、"http://127.0.0.1:8080/demo.html")不管客户端访问的是地址中的uri是什么,代理服务器都会代理到URL的地址;当URL中不包含uri时(例如:"http://127.0.0.1:8080"),那么当客户端访问服务器时,代理服务器会根据客户端请求的uri来访问具体的URL地址。
proxy_pass_request_body on|off:用于配置是否将客户端请求的请求体发送给代理服务器。
proxy_pass_request_headers on|off:用于配置是否将客户端请求的头信息发送给代理服务器。
proxy_set_header field value:可以更改nginx接收到的客户端请求的请求头信息,然后将新的请求头信息发送给被代理的服务器。
proxy_set_body value:ngin接收到客户端的请求后使用该指令可以修改request中的body体,然后将请求转发给代理服务器。
proxy_connect_timeout time:nginx服务器与被代理服务器之间尝试建立连接的的超时时间,默认为60s。
proxy_read_timeot time:nginx服务器接收被代理服务器数据时最大的等待时间,默认为60s。
proxy_send_timeout time:nginx服务器发送数据至被代理服务器的最大等待时间,例如60s内没有发出一个字节则默认断开连接,默认60s。
proxy_http_version 1.0|1.1:nginx服务器提供代理服务的http协议版本。
proxy_method method:nginx服务器设置请求被代理服务器时使用的请求方法,一般为POST或者GET。
proxy_ignore_client_abort:当客户端中断网络请求时,nginx服务是否中断对代理服务器的请求,默认off。