反向代理
概述
1、正向代理
(1)客户端向代理服务器发送一个请求并指定目标
(2)代理服务器向目标服务器转交请求,并将获得的内容返回给客户端
2、反向代理
(1)代理服务器接受 Internet 上的连接请求,将请求转发给内部网络上的服务器
(2)将从服务器上得到的结果,返回给 Internet 上请求连接的客户端
3、区别
(1)正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源;反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等
(2)正向代理一般是客户端架设;反向代理一般是服务器架设
(3)正向代理中,服务器不知道真正的客户端;反向代理中,客户端不知道真正的服务器
(4)正向代理主要解决访问限制问题;反向代理提供负载均衡、安全防护等作用
(5)二者均能提高访问速度
反向代理配置
1、反向代理模块:ngx_http_proxy_module,在 make install 时自动安装
2、proxy_pass
(1)设置被代理服务器地址
(2)语法
proxy_pass URL;
(3)位置:location
(4)URL:被代理服务器地址,包含传输协议(http://、https://)、主机名称或 IP + 端口号、URI 等要素
3、proxy_set_header
(1)更改代理服务器,所接收的客户端请求的请求头信息,然后将新的请求头发送到被代理服务器
(2)语法
proxy_set_header field value;
(3)默认值
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
(4)位置;http、server、location
(5)需要在被代理服务器上,获取头信息的修改结果,而不是在代理服务器
4、proxy_redirect
(1)重置头信息中的 Location、Refresh,隐匿真实 IP
(2)语法
# redirect:被替换值,即 Location 值
# replacement:所替换的值
proxy_redirect redirect replacement;
# 将 location 块的 uri 变量作为 replacement,将 proxy_pass 变量作为 redirect 进行替换
proxy_redirect default;
proxy_redirect off;
(3)默认值
proxy_redirect default;
(4)位置:http、server、location
5、proxy_connect_timeout
(1)定义了与代理服务器建立连接的超时时间
(2)注意:超时时间通常不能超过 75 秒
(3)语法
proxy_connect_timeout time;
(4)默认值
proxy_connect_timeout 60s;
(5)位置:http、server、location
6、proxy_send_timeout
(1)设置一个向代理服务器传输请求的超时时间
(2)该超时时间只在两个连续的写操作之间设置,而不是为整个请求的传输设置
(3)如果代理服务器在这段时间内没有收到任何东西,连接将被关闭。
(4)语法
proxy_send_timeout time;
(5)默认值
proxy_send_timeout 60s;
(6)位置:http、server、location
7、proxy_read_timeout
(1)定义了从代理服务器读取响应的超时时间
(2)该超时时间只在两个连续的读取操作之间设置,而不是为整个响应的传输设置
(3)如果代理服务器在这个时间内没有传输任何东西,连接就会被关闭
(4)语法
proxy_read_timeout time;
(5)默认值
proxy_read_timeout 60s;
(6)位置:http, server, location
安全控制
1、安全隔离
(1)通过代理,分开客户端到应用程序服务器端的连接,实现安全措施
(2)在反向代理之前设置防火墙,仅留一个入口供代理服务器访问
2、加密流量
(1)将 http 请求转变成 https 请求
(2)http 明文传输数据,存在安全问题
(3)https 加密传输,等价于 http + ssl,并且可以防止流量劫持
(4)HTTPS 是一种通过计算机网络,进行安全通信的传输协议,经由 HTTP 进行通信,利用 SSL/TLS 建立全通信,加密数据包,确保数据的安全性
(5)SSL(Secure Sockets Layer)安全套接层
(6)TLS(Transport Layer Security)传输层安全
(7)SSL / TLS 为网络通信提供安全及数据完整性的一种安全协议,TLS、SSL 分别在传输层、应用层对网络连接进行加密
Nginx 的 SSL 相关指令
1、配置模块:--with-http_ssl_module,需要 OpenSSL 支持
2、ssl
(1)在指定的服务器开启 HTTPS
(2)语法(过时)
ssl on | off;
(3)默认值
ssl off;
(4)位置:http、server
(5)server 块的 listen 开启 SSL
listen address[:port] [default_server] [ssl];
2、ssl_certificate
(1)为当前虚拟主机指定一个带有 PEM 格式的证书
(2)语法
ssl_certificate file;
(3)位置:http、server
3、ssl_certificate_key
(1)指定 PEM secret key 文件的路径
(2)语法
ssl_ceritificate_key file;
(3)位置:http、server
4、ssl_session_cache
(1)配置用于 SSL 会话缓存的类型、大小
(2)语法
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
(3)默认值
ssl_session_cache none;
(4)位置:http、server
(5)off:严格禁用会话缓存,客户端不得重复使用 Session
(6)none:不允许使用会话缓存,客户端可以重用 Session,但实际上不在缓存中存储会话参数
(7)builtin:内置 OpenSSL 缓存,仅在一个工作进程中使用,缓存的大小是以会话为单位指定的,如果没有给出大小,它等于 20480 个会话,使用内置缓存会导致内存碎片化
(8)shared:所有工作进程之间共享缓存,缓存的相关信息用 name 和 size 来指定,缓存的大小以字节为单位,一兆字节可以存储大约 4000 个会话,每个共享缓存应该有一个任意的名字,一个具有相同名称的缓存可以在多个虚拟服务器中使用
(9)两种缓存类型可以同时使用
5、ssl_session_timeout
(1)开启 SSL 会话功能后,设置客户端能够重复使用在缓存中的 Session 时间
(2)语法
ssl_session_timeout time;
(3)默认值
ssl_session_timeout 5m;
(4)位置:http、server
6、ssl_ciphers
(1)指定启用的密码,密码指定为 OpenSSL 支持的格式
(2)语法
ssl_ciphers ciphers;
(3)默认值
ssl_ciphers HIGH:!aNULL:!MD5;
(4)位置:http、server
(5)可以使用 openssl ciphers 查看 openssl 支持的格式
7、ssl_prefer_server_ciphers
(1)指定在使用 SSLv3 和 TLS 协议时,服务器密码应优先于客户端密码
(2)语法
ssl_perfer_server_ciphers on|off;
(3)默认值
ssl_perfer_server_ciphers off;
(4)位置:http、server
8、生成证书
(1)方式一:第三方服务进行购买
(2)方式二:使用 OpenSSL 生成证书
proxy_pass 向上游服务器请求数据的 6 个阶段
1、初始化
2、与上游服务器建立连接
3、向上游服务器发送请求
4、处理响应头
5、处理响应体
6、结束
反向代理系统调优
1、反向代理值
(1)Buffer:缓冲
(2)Cache:缓存
2、相同
(1)提高 I/O 吞吐效率
(2)提升 Nginx 代理性能
3、区别
(1)缓冲:解决不同设备之间,数据传递速度不一致,导致的性能低下,缓冲中的数据一旦此次操作完成后,就可以删除
(2)缓存:备份,将被代理服务器的数据,缓存一份到代理服务器,客户端再次获取相同数据时,只需从代理服务器上获取,效率较高,缓存中的数据可以重复使用,只有满足特定条件才会删除
ngx_http_proxy_module
1、proxy_buffering
(1)开启 / 关闭代理服务器的响应体缓冲区
(2)语法
proxy_buffering on|off;
(3)默认值
proxy_buffering on;
(4)位置:http、server、location
2、proxy_buffers
(1)指定单个连接,从代理服务器读取响应体的缓存区的个数、大小
(2)语法
proxy_buffers number size;
(3)默认值(与系统平台有关)
proxy_buffers 8 4k|8K;
(4)位置:http、server、location
(5)number:缓冲区的个数
(6)size:每个缓冲区的大小
(7)缓冲区的总大小 = number * size
3、proxy_buffer_size
(1)设置从被代理服务器获取的响应头数据的大小
(2)保持与 proxy_buffers 中的 size 一致,也可以更小
(3)语法
proxy_buffer_size size;
(4)默认值(与系统平台有关)
proxy_buffer_size 4k|8k;
(5)位置:http、server、location
4、proxy_busy_buffers_size
(1)限制同时处于 BUSY 状态的缓冲总大小
(2)语法
proxy_busy_buffers_size size;
(3)默认值
proxy_busy_buffers_size 8k|16K;
(4)位置:http、server、location
5、proxy_temp_path
(1)当缓冲区存满后,仍未被 Nginx 服务器完全接受,响应数据就会被临时存放在磁盘文件上,该指令设置文件路径
(2)语法
proxy_temp_path path path [level1 [level2 [level3]]];
(3)默认值
proxy_temp_path proxy_temp;
(4)位置:http、server、location
(5)在指定 path 下,最多可以使用三层的子目录层次结构
6、proxy_temp_file_write_size
(1)限制每次写入临时文件的数据大小,当启用从代理服务器到临时文件的响应缓冲时
(2)默认情况下,大小由 proxy_buffer_size 和 proxy_buffers 指令设置的两个缓冲区限制
(3)临时文件的最大尺寸由 proxy_max_temp_file_size 指令设置
(4)语法
proxy_temp_file_write_size size;
(5)默认值
proxy_temp_file_write_size 8k|16k;
(6)位置:http、server、location
7、proxy_max_temp_file_size
(1)当启用了对代理服务器响应的缓冲,并且整个响应不适合由 proxy_buffer_size 和 proxy_buffers 指令设置的缓冲区时,响应的一部分可以被保存到一个临时文件
(2)这条指令设置了临时文件的最大尺寸
(3)每次写入临时文件的数据大小由 proxy_temp_file_write_size 指令设定
(4)0 表示禁止对临时文件的响应进行缓冲
(5)这个限制并不适用于将被缓存或存储在磁盘上的响应
(6)语法
proxy_max_temp_file_size size;
(7)默认值
proxy_max_temp_file_size 1024m;
(8)位置:http, server, location
8、proxy_request_buffering
(1)启用或禁用客户端请求体的缓冲
(2)当缓冲功能启用时,在将请求发送到代理服务器之前,需要将从客户端读取整个请求体
(3)当缓冲被禁用时,请求体在收到后立即被发送到代理服务器,在这种情况下,如果 nginx 已经开始发送请求体,那么请求就不能被传递给下一个服务器
(4)当使用 HTTP/1.1 分块传输编码,来发送原始请求体时,无论指令值如何,请求体都会被缓冲,除非 HTTP/1.1 被启用为代理
(5)语法
proxy_request_buffering on | off;
(6)默认值
proxy_request_buffering on;
(7)位置:http、server、location
容错机制
1、proxy_next_upstream
(1)指定在哪些情况下应将请求传递到下一台服务器
(2)语法
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
(3)默认值
proxy_next_upstream error timeout;
(4)位置:http、server、location
(4)error:在与服务器建立连接、向服务器传递请求、读取响应头时发生错误
(5)timeout:在与服务器建立连接、向服务器传递请求、读取响应头时发生超时
(6)invalid_header:服务器返回空,或无效的响应
(7)http_500:服务器返回代码为 500 的响应
(8)http_502:服务器返回代码为 502 的响应
(9)http_503:服务器返回代码为 503 的响应
(10)http_504:服务器返回代码为 504 的响应
(11)http_403:服务器返回代码为 403 的响应
(12)http_404:服务器返回代码为 404 的响应
(13)http_429:服务器返回代码为 429 的响应
(14)non_idempotent:通常,如果请求已发送到上游服务器,则使用非幂等方法(POST,LOCK,PATCH)的请求,不会传递到下一个服务器,启用此选项明确允许重试此类请求
(15)close:禁止将请求传递到下一台服务器
(16)只有当还没有向客户端发送任何内容时,才可以将请求传递到下一个服务器,即如果在传输响应的过程中,发生错误或超时,则无法修复此问题
(17)该指令还定义了被视为与服务器通信的失败尝试:error、timeout、invalid_header 始终被视为不成功的尝试,即使指令中未指定也是如此;只有在指令中指定 http_500、http_502、http_503、http_504、http_429 情况时,才被视为不成功的尝试;http_403、http_404 从不被视为不成功的尝试
(18)将请求传递到下一台服务器可能会受到尝试次数、时间限制
2、proxy_next_upstream_timeout
(1)限制可以将请求传递到下一台服务器的时间
(2)0 值将关闭此限制
(3)语法
proxy_next_upstream_timeout time;
(4)默认值
proxy_next_upstream_timeout 0;
(5)位置:http、server、location
3、proxy_next_upstream_tries
(1)限制将请求传递到下一台服务器的可能尝试次数
(2)0 值将关闭此限制
(3)语法
proxy_next_upstream_tries number;
(4)默认值
proxy_next_upstream_tries 0;
(5)位置:http、server、location
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战