nginx代理

1、什么是代理

2、为何要有代理

代理往往具有一些更专业的技能,比你自己直接跟目标打交道效率要高一些,就想想你去租房子或者买房子通常会找个中介是一个道理
没有代理


有代理

3、nginx实现代理

有三条常用的代理指令(均属于反向代理)

proxy_pass 代理http协议
fastcgi_pass 代理fastcgi协议
uwsgi_pass 代理uwsgi协议

4、代理与负载均衡是两回事,

代理指的是把请求转发给其他人,当然转发的目标可以是一个upstream模块,该模块内可以定义多台机器、可以控制控制每次分配给哪台机器,即负载均衡是upstream实现的
如果你只想代理给一台机器,你根本用不到upstream模块,如果你想代理给多台机器(即实现负载均衡)那代理指令就必须将请求转发给一个upstream模块

# 1、转发/代理请求给某台机器
proxy_pass http://ip:port
# 2、转发/代理请求给upstream模块,由upstream模块来决定分发给多台后端机器的哪一台
proxy_pass http://某个定义好的upstream机器组的名字
注意:
如果是四层转发,那proxy_pass后不能指定http协议,因为是四层嘛
proxy_pass 直接跟某个定义好的upstream机器组名字

5、nginx实现代理的底层运行逻辑

nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端

6、代理的形式有多种,nginx支持正向代理与反向代理,介绍如下,我们常用nginx作为反向代理

正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。
为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,
之后代理向目标服务器转交并且将获得的内容返回给客户端。
正向代理的情况下客户端必须要进行一些特别的设置才能使用。

file

反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。

反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。
并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,
并将请求转交给客户端,使得这些内容就好似他自己一样,
一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,
只需要把反向代理服务器当成真正的服务器就好了。

file

作图地址留存:https://www.processon.com/diagraming/58883630e4b049e795e80bcf

7、正向与反向代理异同

-(1)相同点:
正向代理和反向代理所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端。
-(2)不同点

#1、正向代理是客户端的代理,服务器不知道真正的客户端是谁;
反向代理是服务器的代理,客户端不知道真正的服务器是谁
#2、正向代理是代理内网,访问外网;反向代理是代理外网,访问内网
#3、正向代理一般是客户端架设的;反向代理一般是服务器架设的
#4、正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用。

8、nginx代理支持的协议(了解)

nginx本身支持的协议有很多


我们平时使用nginx做反向代理时候常用的协议如下

nginx反向代理三条指令(proxy_pass、fastcgi_pass、uwsgi_pass)源自于nginx的不同模块,支持不同的协议,总结如下
多补充一个grpc协议,go语言的rpc协议

反向代理模式 Nginx**配置模块**
http、websocket、https、tomcat(java程序) ngx_http_proxy_module
fastcgi(php程) ngx_http_fastcgi_module
uwsgi(python) ngx_http_uwsgi_module
grpc(go程序)golang ngx_http_v2_module

9、代理指令优化

以proxy_pass为例,其他指令自行查询

# 1、nginx的配置文件如下
server {
listen 80;
server_name linux.lb.com;
location / {
proxy_pass xxxx;
include proxy_params;
}
}
# 2、优化参数可以单独写入一个文件proxy_params中,当然你也可以直接与proxy_pass并列放置,只不过可能显得乱一些
[root@lb01 ~]# vim /etc/nginx/proxy_params
#(1)转发原始请求的 host 头部
proxy_set_header X-Real-IP $remote_addr; # 设置真实/原始客户端的 IP 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加原始客户端的 IP 地址到 X-Forwarded-For 头信息中。这样,在后端服务器中就可以通过读取 X-Forwarded-For 头信息来获取原始客户端的 IP 地址。
proxy_set_header Host $host;
#(2)代理到后端的TCP连接、响应、返回等超时时间
proxy_connect_timeout 10s; # nginx代理与后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 10s; # nginx代理等待后端服务器的响应时间
proxy_send_timeout 10s; #后端服务器数据回传给nginx代理超时时间
#(3)proxy_buffer代理缓冲区:nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
proxy_buffering on;
proxy_buffer_size 8k; # 设置nginx代理保存用户头信息的缓冲区大小
proxy_buffers 8 8k; #proxy_buffers 缓冲区
上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 沪ICP备2022009235号 沪公网安备31011802005110号 青浦区尚茂路798弄 联系方式-13697081366