nginx之旅(第三篇):代理、正向代理、反向代理、代理的原理、nginx反向代理场景、nginx反向代理配置、nginx反向代理语法
正文
一、代理服务与反向代理
什么是代理服务
-
代理-代理办理(代理理财、代理收货、代理购物等等)。
一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。关于正向代理的概念如下:
正向代理(forward)是一个位于客户端【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户 A 向代理服务器 Z 发送一个请求并指定目标(服务器B),然后代理服务器 Z 向服务器 B 转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
HTTP请求没有代理服务的模型图
HTTP请求具有代理服务的模型图
代理分类
-
正向代理
-
反向代理
正向代理
-
当局域网不能上网时,可以在浏览器设置正向代理满足上网要求
-
当我们想通过FQ访问国外网站查询资料,可以在浏览器设置正向代理
-
当服务器只允许某个端的IP访问(比如googe),所以我们需要请求运行访问的那个客户端,在让其帮我们转发请求
正向代理模型图
反向代理
-
服务端有很多工程模块的时候,需要通过Nginx代理实现流量的分发
反向代理模型图
反向代理模型图解释:
-
客户端需要自己去请求DNS获取服务端地址;
-
代理是为服务端服务的;
-
红色虚线表示防火墙;
-
配置在服务端,分发客户端请求到不同的服务端
-
主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息
代理区别
区别在于代理的对象不一样 正向代理代理的对象是客户端 反向代理代理的对象是服务端
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
二、代理模式和模块介绍
常见的Nginx作为反向代理支持的协议
反向代理模式与Nginx代理模块
常见的Nginx作为正向代理支持的协议
注意:
-
不能支持使用HTTPS协议
-
Nginx使用HTTP协议作为正向代理的协议
-
Nginx使用正向代理范围比较窄
三、nginx 反向代理
代理服务proxy_pass配置语法
-
Syntax: proxy_pass
URL
; -
Default: —
-
Context:
location
,if in location
,limit_except
1 2 3 4 5 | URL 可以是 http: / / localhost: 8000 / uri / https: / / 192.168 . 1.1 : 8000 / uri / http: / / unix: / tmp / backend.socket: / uri / ;(socket) |
反向代理场景需求
1、统一访问入口,作为堡垒机,多套业务系统需使用同一个ip或者域名进行访问,以不同后缀进行区分,需要一台NGINX服务器做统一的访问入口。使用反向代理功能,将所有NGINX服务器作为外网或内网用户统一的访问入口,然后根据设置的localtion规则匹配不同的后缀转发至不同的业务服务器。
2、业务服务器不能直接被外部网络访问,即不能直接映射外网ip,需要一台代理服务器,而代理服务器能被外部网络访问同时又和业务服务器网络联通。使用反向代理功能,将NGINX服务器映射外网ip,业务服务器无需映射外网ip,外网用户访问时首先访问NGINX服务器,然后再由NGINX服务器访问业务服务器资源后转发给用户,目前主流推荐采用此方案,这样既满足了业务需外网访问的需求,又满足业务服务器的安全。
3、作为缓存服务器,负载均衡,通过反向代理服务器来优化网站的负载,使用反向代理和负载均衡2个功能,根据配置的url后缀规则转发至upstream中各服务器列表,默认按轮询策略,同时还支持权重和ip_hash ,有redis缓存登录seesion的方案中推荐使用轮询策略,否则使用ip_hash策略实现同一ip的用户请求固定至后端同一台服务器。
反向代理原理
• 1) 客户端通过浏览器发起请求到代理服务器
• 2)代理服务器 接受请求
• 3) 代理服务器 发起请求到 业务服务器
• 4)业务服务器接受请求
• 5)业务服务器 处理理请求
• 6) 业务服务器 响应请求到代理服务器
• 7)代理服务器 响应请求到客户端
• 8)客户端通过浏览器渲染请求并展示给用户
反向代理模拟
需求:假设有两个服务一个对外暴露,一个不对外暴露只能内部访问,对外暴露的端口是80,在内部访问的端口是8080,通过访问对外暴露的80服务来访问8080服务
创建HTML静态资源文件
1 2 | [root@localhost nginx] # mkdir htmladmin htmlservice [root@localhost nginx] # echo htmladmin >htmladmin/index.html |
配置虚拟主机
修改 /usr/local/nginx
目录下的 nginx.conf 配置文件:
只有内部才能访问的8080服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ... http{ ... # 配置虚拟主机 192.168.199.228 server { listen 8080 ; server_name 127.0 . 0.1 ; location / { allow 127.0 . 0.1 ; allow 192.168 . 199.228 ; deny all ; root / usr / local / nginx / htmladmin; index index.html index.htm; } } } |
重启nginx,验证下
1 2 | [root@localhost nginx] # elinks http://192.168.199.228:8080 --dump htmladmin |
配置对外暴露的反向代理
...
http{
...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 配置虚拟主机 192.168.199.228 server { listen 8080 ; server_name 127.0 . 0.1 ; location / { allow 127.0 . 0.1 ; allow 192.168 . 199.228 ; deny all ; root / usr / local / nginx / htmladmin; index index.html index.htm; } } #配置对外暴露的反向代理 server { listen 80 ; location / { proxy_pass http: / / 127.0 . 0.1 : 8080 ; } } } |
重启nginx后验证效果
1 2 3 | [root@localhost nginx] # elinks http://192.168.199.228 --dump htmladmin |
Nginx作为代理服务_代理配置语法补充
proxy-缓冲区
-
Syntax: proxy_buffering on | off;
-
Default: proxy_buffering on;
-
Context: http, server, location
扩展:
proxy_buffer_size-设置缓冲区大小(内存页大小)
proxy_buffers-设置缓冲区数量和大小(内存页数量和大小)
proxy_busy_buffers_size-设置最大缓冲区大小
proxy-重定向
-
Syntax: proxy_redirect default; proxy_redirect off; proxy_redirect redirect replacement;
-
Default: proxy_redirect default;
-
Context: http, server, location
proxy-头信息
-
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-设置请求体返回信息
proxy-超时
-
Syntax: proxy_connect_timeout time;
-
Default: proxy_connect_timeout 60s;
-
Context: http, server, location
扩展:
proxy_read_timeout-从代理服务器读取响应的超时时间
proxy_send_timeout-设置将请求传输到代理服务器的超时时间
代理配置及配置规范
代理通用配置
1 2 3 4 | location / { proxy_pass http: / / 127.0 . 0.1 : 8080 ; include proxy_params; } |
proxy_params
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 ; |
代理配置详解:
proxy_redirect default;
-
没有重定向就配置成默认,除非后端返回301情况下设置成具体重定向地址
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-
设置字段重新定义或附加到传递给代理服务器的请求头,通过X-Forwarded-For获取用户真实IP
proxy_connect_timeout 30;
-
设置代理连接超时时间
proxy_read_timeout 60;
-
设置从代理服务器读取响应的超时时间
proxy_send_timeout 60;
-
设置向代理服务器发送请求的超时时间
proxy_buffering on;
-
设置启用或禁用来自代理服务器的响应缓冲
proxy_buffer_size 32k;
-
设置用于读取从代理服务器接收的响应的第一部分的缓冲区的大小
proxy_buffers 4 128k
-
设置用于从代理服务器读取响应的缓冲区的数量和大小,用于单个连接。
proxy_busy_buffers_size 256k;
-
设置当启用来自代理服务器的响应缓冲时,限制可能忙于向响应客户端发送响应的缓冲区的总大小,而响应尚未完全读取。
proxy_max_temp_file_size 256k;
-
设置当启用来自代理服务器的响应缓冲,并且整个响应不适合proxy_buffer_size和proxy_buffers指令设置的缓冲区时,响应的一部分可以保存到临时文件中。 该指令设置临时文件的最大大小。 一次写入临时文件的数据大小由proxy_temp_file_write_size指令设置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | location / { index index.jsp; proxy_pass http: / / hello; #在这里设置一个代理,和upstream的名字一样 #以下是一些反向代理的配置可删除 proxy_redirect off; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP 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服务器传 } } |
参考资料
posted on 2019-12-17 21:30 Nicholas-- 阅读(1879) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步